Merge branch 'dev-v7.7' into temp-U4-10059
This commit is contained in:
@@ -1836,9 +1836,9 @@ namespace Umbraco.Tests.Services
|
||||
Assert.That(sut.GetValue<DateTime>("date").ToString("G"), Is.EqualTo(content.GetValue<DateTime>("date").ToString("G")));
|
||||
Assert.That(sut.GetValue<string>("ddl"), Is.EqualTo("1234"));
|
||||
Assert.That(sut.GetValue<string>("chklist"), Is.EqualTo("randomc"));
|
||||
Assert.That(sut.GetValue<int>("contentPicker"), Is.EqualTo(1090));
|
||||
Assert.That(sut.GetValue<int>("mediaPicker"), Is.EqualTo(1091));
|
||||
Assert.That(sut.GetValue<int>("memberPicker"), Is.EqualTo(1092));
|
||||
Assert.That(sut.GetValue<Udi>("contentPicker"), Is.EqualTo(Udi.Create(Constants.UdiEntityType.Document, new Guid("74ECA1D4-934E-436A-A7C7-36CC16D4095C"))));
|
||||
Assert.That(sut.GetValue<Udi>("mediaPicker"), Is.EqualTo(Udi.Create(Constants.UdiEntityType.Media, new Guid("44CB39C8-01E5-45EB-9CF8-E70AAF2D1691"))));
|
||||
Assert.That(sut.GetValue<Udi>("memberPicker"), Is.EqualTo(Udi.Create(Constants.UdiEntityType.Member, new Guid("9A50A448-59C0-4D42-8F93-4F1D55B0F47D"))));
|
||||
Assert.That(sut.GetValue<string>("relatedLinks"), Is.EqualTo("<links><link title=\"google\" link=\"http://google.com\" type=\"external\" newwindow=\"0\" /></links>"));
|
||||
Assert.That(sut.GetValue<string>("tags"), Is.EqualTo("this,is,tags"));
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Core;
|
||||
using Umbraco.Core.Models;
|
||||
|
||||
namespace Umbraco.Tests.TestHelpers.Entities
|
||||
@@ -123,9 +124,9 @@ namespace Umbraco.Tests.TestHelpers.Entities
|
||||
content.SetValue("date", DateTime.Now.AddDays(-10));
|
||||
content.SetValue("ddl", "1234");
|
||||
content.SetValue("chklist", "randomc");
|
||||
content.SetValue("contentPicker", 1090);
|
||||
content.SetValue("mediaPicker", 1091);
|
||||
content.SetValue("memberPicker", 1092);
|
||||
content.SetValue("contentPicker", Udi.Create(Constants.UdiEntityType.Document, new Guid("74ECA1D4-934E-436A-A7C7-36CC16D4095C")).ToString());
|
||||
content.SetValue("mediaPicker", Udi.Create(Constants.UdiEntityType.Media, new Guid("44CB39C8-01E5-45EB-9CF8-E70AAF2D1691")).ToString());
|
||||
content.SetValue("memberPicker", Udi.Create(Constants.UdiEntityType.Member, new Guid("9A50A448-59C0-4D42-8F93-4F1D55B0F47D")).ToString());
|
||||
content.SetValue("relatedLinks", "<links><link title=\"google\" link=\"http://google.com\" type=\"external\" newwindow=\"0\" /></links>");
|
||||
content.SetValue("tags", "this,is,tags");
|
||||
|
||||
|
||||
@@ -357,9 +357,9 @@ namespace Umbraco.Tests.TestHelpers.Entities
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.DateAlias, DataTypeDatabaseType.Date) { Alias = "date", Name = "Date", Mandatory = false, SortOrder = 13, DataTypeDefinitionId = -41 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.DropDownListAlias, DataTypeDatabaseType.Integer) { Alias = "ddl", Name = "Dropdown List", Mandatory = false, SortOrder = 14, DataTypeDefinitionId = -42 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.CheckBoxListAlias, DataTypeDatabaseType.Nvarchar) { Alias = "chklist", Name = "Checkbox List", Mandatory = false, SortOrder = 15, DataTypeDefinitionId = -43 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.ContentPicker2Alias, DataTypeDatabaseType.Integer) { Alias = "contentPicker", Name = "Content Picker", Mandatory = false, SortOrder = 16, DataTypeDefinitionId = 1046 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.MediaPicker2Alias, DataTypeDatabaseType.Integer) { Alias = "mediaPicker", Name = "Media Picker", Mandatory = false, SortOrder = 17, DataTypeDefinitionId = 1048 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.MemberPicker2Alias, DataTypeDatabaseType.Integer) { Alias = "memberPicker", Name = "Member Picker", Mandatory = false, SortOrder = 18, DataTypeDefinitionId = 1047 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.ContentPicker2Alias, DataTypeDatabaseType.Nvarchar) { Alias = "contentPicker", Name = "Content Picker", Mandatory = false, SortOrder = 16, DataTypeDefinitionId = 1046 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.MediaPicker2Alias, DataTypeDatabaseType.Ntext) { Alias = "mediaPicker", Name = "Media Picker", Mandatory = false, SortOrder = 17, DataTypeDefinitionId = 1048 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.MemberPicker2Alias, DataTypeDatabaseType.Nvarchar) { Alias = "memberPicker", Name = "Member Picker", Mandatory = false, SortOrder = 18, DataTypeDefinitionId = 1047 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.RelatedLinks2Alias, DataTypeDatabaseType.Ntext) { Alias = "relatedLinks", Name = "Related Links", Mandatory = false, SortOrder = 21, DataTypeDefinitionId = 1050 });
|
||||
contentCollection.Add(new PropertyType(Constants.PropertyEditors.TagsAlias, DataTypeDatabaseType.Ntext) { Alias = "tags", Name = "Tags", Mandatory = false, SortOrder = 22, DataTypeDefinitionId = 1041 });
|
||||
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
display: flex;
|
||||
border-bottom: 1px solid @gray-9;
|
||||
padding: 7px 0;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.umb-permission:last-of-type {
|
||||
@@ -10,7 +9,15 @@
|
||||
}
|
||||
|
||||
.umb-permission__toggle {
|
||||
margin-right: 20px;
|
||||
padding-right: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.umb-permission__content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1 1 auto;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.umb-permission__description {
|
||||
|
||||
@@ -87,9 +87,10 @@ ul.sections li.avatar a {
|
||||
border: none
|
||||
}
|
||||
|
||||
ul.sections li.avatar a img {
|
||||
ul.sections li.avatar a div {
|
||||
border-radius: 50%;
|
||||
width: 30px;
|
||||
margin:0 auto;
|
||||
}
|
||||
|
||||
ul.sections li.avatar a span {
|
||||
|
||||
@@ -17,10 +17,6 @@ table thead {
|
||||
background-color: @gray-10;
|
||||
}
|
||||
|
||||
table tr:hover {
|
||||
background-color: @gray-10;
|
||||
}
|
||||
|
||||
|
||||
// BASELINE STYLES
|
||||
// ---------------
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
// -------------------------
|
||||
@tableBackground: transparent; // overall background-color
|
||||
@tableBackgroundAccent: @gray-10; // for striping
|
||||
@tableBackgroundHover: @gray-9; // for hover
|
||||
@tableBackgroundHover: @gray-10; // for hover
|
||||
@tableBorder: @gray-8; // table and cell border
|
||||
|
||||
// Buttons
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
checked="selected"
|
||||
on-click="change(checked)">
|
||||
</umb-toggle>
|
||||
<div ng-click="change(checked)">
|
||||
<div class="umb-permission__content" ng-click="change(checked)">
|
||||
<div>{{ name }} </div>
|
||||
<div class="umb-permission__description">{{ description }}</div>
|
||||
</div>
|
||||
|
||||
@@ -27,8 +27,8 @@
|
||||
<localize key="defaultdialogs_permissionsSet">Set permissions for</localize>...
|
||||
<span class="caret" style="margin-left: 10px;"></span>
|
||||
</a>
|
||||
|
||||
<ul class="dropdown-menu" style="width: 100%;">
|
||||
|
||||
<ul class="dropdown-menu">
|
||||
<li ng-repeat="group in vm.availableUserGroups | filter:{selected: '!true'}">
|
||||
<a href="" ng-click="vm.editPermissions(group)" prevent-default>
|
||||
<i class="{{group.icon}}"></i>
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
var i2 = parseFloat($scope.model.config.initVal2);
|
||||
sliderVal = [
|
||||
isNaN(i1) ? $scope.model.config.minVal : (i1 >= $scope.model.config.minVal ? i1 : $scope.model.config.minVal),
|
||||
isNaN(i2) ? $scope.model.config.maxVal : (i2 > i1 ? (i2 <= $scope.model.config.maxVal ? i2 : $scope.model.config.maxVal) : $scope.model.config.maxVal)
|
||||
isNaN(i2) ? $scope.model.config.maxVal : (i2 >= i1 ? (i2 <= $scope.model.config.maxVal ? i2 : $scope.model.config.maxVal) : $scope.model.config.maxVal)
|
||||
];
|
||||
}
|
||||
else {
|
||||
|
||||
@@ -1,346 +1,366 @@
|
||||
<div ng-controller="Umbraco.Editors.Users.UserController as vm" class="clearfix">
|
||||
|
||||
<umb-load-indicator ng-show="vm.loading"></umb-load-indicator>
|
||||
<umb-load-indicator ng-show="vm.loading"></umb-load-indicator>
|
||||
|
||||
<form name="editUserForm" novalidate val-form-manager>
|
||||
<form name="editUserForm" novalidate val-form-manager>
|
||||
|
||||
<umb-editor-view>
|
||||
<umb-editor-view>
|
||||
|
||||
<umb-editor-header name="vm.user.name"
|
||||
hide-icon="true"
|
||||
hide-description="true"
|
||||
hide-alias="true">
|
||||
</umb-editor-header>
|
||||
<umb-editor-header
|
||||
name="vm.user.name"
|
||||
hide-icon="true"
|
||||
hide-description="true"
|
||||
hide-alias="true">
|
||||
</umb-editor-header>
|
||||
|
||||
<umb-editor-container>
|
||||
<umb-editor-container>
|
||||
|
||||
<div ng-if="!vm.loading" class="umb-packages-view-wrapper" style="padding: 0;">
|
||||
<div ng-if="!vm.loading" class="umb-packages-view-wrapper" style="padding: 0;">
|
||||
|
||||
<div class="umb-package-details">
|
||||
<div class="umb-package-details">
|
||||
|
||||
<div class="umb-package-details__main-content">
|
||||
<div class="umb-package-details__main-content">
|
||||
|
||||
<div class="umb-box">
|
||||
<div class="umb-box-header">
|
||||
<div class="umb-box-header-title"><localize key="user_profile">Profile</localize></div>
|
||||
</div>
|
||||
<div class="umb-box-content block-form">
|
||||
<div class="umb-box">
|
||||
<div class="umb-box-header">
|
||||
<div class="umb-box-header-title">
|
||||
<localize key="user_profile">Profile</localize>
|
||||
</div>
|
||||
</div>
|
||||
<div class="umb-box-content block-form">
|
||||
|
||||
<umb-control-group label="@general_email">
|
||||
<input type="text"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_entername"
|
||||
class="input-block-level"
|
||||
ng-model="vm.user.email"
|
||||
umb-auto-focus
|
||||
name="email"
|
||||
required
|
||||
val-server-field="Email"/>
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
<umb-control-group label="@general_email">
|
||||
<input
|
||||
type="email"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_enteremail"
|
||||
class="input-block-level"
|
||||
ng-model="vm.user.email"
|
||||
umb-auto-focus name="email"
|
||||
required
|
||||
val-server-field="Email" />
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group label="@general_username" ng-if="!vm.emailIsUsername">
|
||||
<input type="text"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_entername"
|
||||
class="input-block-level"
|
||||
ng-model="vm.user.username"
|
||||
umb-auto-focus
|
||||
name="username"
|
||||
required
|
||||
val-server-field="Username"/>
|
||||
<span class="help-inline" val-msg-for="username" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="username" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
<umb-control-group label="@general_username" ng-if="!vm.emailIsUsername">
|
||||
<input
|
||||
type="text"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_entername"
|
||||
class="input-block-level"
|
||||
ng-model="vm.user.username"
|
||||
umb-auto-focus name="username"
|
||||
required
|
||||
val-server-field="Username" />
|
||||
<span class="help-inline" val-msg-for="username" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="username" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group label="@user_language" description="@user_languageHelp">
|
||||
<select class="input-block-level" ng-model="vm.user.culture" ng-options="key as value for (key, value) in vm.user.availableCultures"
|
||||
name="culture"
|
||||
required
|
||||
val-server-field="Culture">
|
||||
</select>
|
||||
<span class="help-inline" val-msg-for="culture" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="culture" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
</div>
|
||||
</div>
|
||||
<umb-control-group label="@user_language" description="@user_languageHelp">
|
||||
<select
|
||||
class="input-block-level"
|
||||
ng-model="vm.user.culture"
|
||||
ng-options="key as value for (key, value) in vm.user.availableCultures"
|
||||
name="culture"
|
||||
required
|
||||
val-server-field="Culture">
|
||||
</select>
|
||||
<span class="help-inline" val-msg-for="culture" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="culture" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="umb-box">
|
||||
<div class="umb-box-header">
|
||||
<div class="umb-box-header-title"><localize key="user_access">Access</localize></div>
|
||||
</div>
|
||||
<div class="umb-box-content block-form">
|
||||
<div class="umb-box">
|
||||
<div class="umb-box-header">
|
||||
<div class="umb-box-header-title">
|
||||
<localize key="user_access">Access</localize>
|
||||
</div>
|
||||
</div>
|
||||
<div class="umb-box-content block-form">
|
||||
|
||||
<umb-control-group style="margin-bottom: 25px;" label="@general_groups" description="@user_groupsHelp">
|
||||
<umb-control-group style="margin-bottom: 25px;" label="@general_groups" description="@user_groupsHelp">
|
||||
|
||||
<umb-user-group-preview
|
||||
ng-repeat="userGroup in vm.user.userGroups"
|
||||
icon="userGroup.icon"
|
||||
name="userGroup.name"
|
||||
sections="userGroup.sections"
|
||||
content-start-node="userGroup.contentStartNode"
|
||||
media-start-node="userGroup.mediaStartNode"
|
||||
allow-remove="!vm.user.isCurrentUser"
|
||||
on-remove="vm.removeSelectedItem($index, vm.user.userGroups)">
|
||||
</umb-user-group-preview>
|
||||
<umb-user-group-preview
|
||||
ng-repeat="userGroup in vm.user.userGroups"
|
||||
icon="userGroup.icon"
|
||||
name="userGroup.name"
|
||||
sections="userGroup.sections"
|
||||
content-start-node="userGroup.contentStartNode"
|
||||
media-start-node="userGroup.mediaStartNode"
|
||||
allow-remove="!vm.user.isCurrentUser"
|
||||
on-remove="vm.removeSelectedItem($index, vm.user.userGroups)">
|
||||
</umb-user-group-preview>
|
||||
|
||||
<a href=""
|
||||
ng-if="!vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openUserGroupPicker()"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
<a href=""
|
||||
ng-if="!vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openUserGroupPicker()"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
|
||||
</umb-control-group>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group style="margin-bottom: 25px;" label="@user_startnodes" description="@user_startnodeshelp">
|
||||
<umb-control-group style="margin-bottom: 25px;" label="@user_startnodes" description="@user_startnodeshelp">
|
||||
|
||||
<umb-node-preview
|
||||
style="max-width: 100%;"
|
||||
ng-repeat="node in vm.user.startContentIds"
|
||||
icon="node.icon"
|
||||
name="node.name"
|
||||
allow-remove="!vm.user.isCurrentUser"
|
||||
on-remove="vm.removeSelectedItem($index, vm.user.startContentIds)">
|
||||
</umb-node-preview>
|
||||
<umb-node-preview
|
||||
style="max-width: 100%;"
|
||||
ng-repeat="node in vm.user.startContentIds"
|
||||
icon="node.icon"
|
||||
name="node.name"
|
||||
allow-remove="!vm.user.isCurrentUser"
|
||||
on-remove="vm.removeSelectedItem($index, vm.user.startContentIds)">
|
||||
</umb-node-preview>
|
||||
|
||||
<umb-node-preview
|
||||
ng-if="vm.user.startContentIds.length === 0 && vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
name="vm.labels.noStartNodes">
|
||||
</umb-node-preview>
|
||||
<umb-node-preview
|
||||
ng-if="vm.user.startContentIds.length === 0 && vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
name="vm.labels.noStartNodes">
|
||||
</umb-node-preview>
|
||||
|
||||
<a href=""
|
||||
ng-if="!vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openContentPicker()"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
<a href=""
|
||||
ng-if="!vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openContentPicker()"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
|
||||
</umb-control-group>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group label="@user_mediastartnodes" description="@user_mediastartnodeshelp">
|
||||
<umb-control-group label="@user_mediastartnodes" description="@user_mediastartnodeshelp">
|
||||
|
||||
<umb-node-preview
|
||||
style="max-width: 100%;"
|
||||
ng-repeat="node in vm.user.startMediaIds"
|
||||
icon="node.icon"
|
||||
name="node.name"
|
||||
allow-remove="!vm.user.isCurrentUser"
|
||||
on-remove="vm.removeSelectedItem($index, vm.user.startMediaIds)">
|
||||
</umb-node-preview>
|
||||
<umb-node-preview
|
||||
style="max-width: 100%;"
|
||||
ng-repeat="node in vm.user.startMediaIds"
|
||||
icon="node.icon"
|
||||
name="node.name"
|
||||
allow-remove="!vm.user.isCurrentUser"
|
||||
on-remove="vm.removeSelectedItem($index, vm.user.startMediaIds)">
|
||||
</umb-node-preview>
|
||||
|
||||
<umb-node-preview
|
||||
ng-if="vm.user.startMediaIds.length === 0 && vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
name="vm.labels.noStartNodes">
|
||||
</umb-node-preview>
|
||||
<umb-node-preview
|
||||
ng-if="vm.user.startMediaIds.length === 0 && vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
name="vm.labels.noStartNodes">
|
||||
</umb-node-preview>
|
||||
|
||||
<a href=""
|
||||
ng-if="!vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openMediaPicker()"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
<a href=""
|
||||
ng-if="!vm.user.isCurrentUser"
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openMediaPicker()"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
|
||||
</umb-control-group>
|
||||
</umb-control-group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="umb-package-details__sidebar">
|
||||
<div class="umb-package-details__sidebar">
|
||||
|
||||
<div class="umb-package-details__section">
|
||||
<div class="umb-package-details__section">
|
||||
|
||||
<div style="margin-bottom: 20px; padding-bottom: 20px; border-bottom: 1px solid #d8d7d9;">
|
||||
<ng-form name="avatarForm" class="flex flex-column justify-center items-center">
|
||||
<div style="margin-bottom: 20px; padding-bottom: 20px; border-bottom: 1px solid #d8d7d9;">
|
||||
<ng-form name="avatarForm" class="flex flex-column justify-center items-center">
|
||||
|
||||
<umb-avatar style="margin-bottom: 15px;"
|
||||
color="secondary"
|
||||
size="xxl"
|
||||
name="{{vm.user.name}}"
|
||||
img-src="{{vm.user.avatars[3]}}"
|
||||
img-srcset="{{vm.user.avatars[4]}} 2x, {{vm.user.avatars[4]}} 3x">
|
||||
</umb-avatar>
|
||||
<umb-avatar
|
||||
style="margin-bottom: 15px;"
|
||||
color="secondary"
|
||||
size="xxl"
|
||||
name="{{vm.user.name}}"
|
||||
img-src="{{vm.user.avatars[3]}}"
|
||||
img-srcset="{{vm.user.avatars[4]}} 2x, {{vm.user.avatars[4]}} 3x">
|
||||
</umb-avatar>
|
||||
|
||||
<umb-progress-bar style="max-width: 120px;"
|
||||
ng-if="vm.avatarFile.uploadStatus === 'uploading'"
|
||||
progress="{{ vm.avatarFile.uploadProgress }}"
|
||||
size="s">
|
||||
</umb-progress-bar>
|
||||
|
||||
<div class="flex items-center" ng-if="vm.avatarFile.uploadStatus !== 'uploading'">
|
||||
|
||||
<a href=""
|
||||
class="umb-user-group-preview__action"
|
||||
ngf-select
|
||||
ng-model="filesHolder"
|
||||
ngf-change="changeAvatar($files, $event)"
|
||||
ngf-multiple="false"
|
||||
ngf-pattern="{{vm.acceptedFileTypes}}"
|
||||
ngf-max-size="{{ vm.maxFileSize }}">
|
||||
<localize key="user_changePhoto">Change photo</localize>
|
||||
</a>
|
||||
|
||||
<a href="" ng-if="vm.user.avatars" class="umb-user-group-preview__action umb-user-group-preview__action--red" ng-click="vm.clearAvatar()" prevent-default>
|
||||
<localize key="user_removePhoto">Remove photo</localize>
|
||||
</a>
|
||||
<umb-progress-bar
|
||||
style="max-width: 120px;"
|
||||
ng-if="vm.avatarFile.uploadStatus === 'uploading'"
|
||||
progress="{{ vm.avatarFile.uploadProgress }}"
|
||||
size="s">
|
||||
</umb-progress-bar>
|
||||
|
||||
<div class="flex items-center" ng-if="vm.avatarFile.uploadStatus !== 'uploading'">
|
||||
|
||||
<a href=""
|
||||
class="umb-user-group-preview__action"
|
||||
ngf-select ng-model="filesHolder"
|
||||
ngf-change="changeAvatar($files, $event)"
|
||||
ngf-multiple="false"
|
||||
ngf-pattern="{{vm.acceptedFileTypes}}"
|
||||
ngf-max-size="{{ vm.maxFileSize }}">
|
||||
<localize key="user_changePhoto">Change photo</localize>
|
||||
</a>
|
||||
|
||||
<a href=""
|
||||
ng-if="vm.user.avatars"
|
||||
class="umb-user-group-preview__action umb-user-group-preview__action--red"
|
||||
ng-click="vm.clearAvatar()"
|
||||
prevent-default>
|
||||
<localize key="user_removePhoto">Remove photo</localize>
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
</ng-form>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="umb-package-details__information-item">
|
||||
<div class="umb-package-details__information-item-label">
|
||||
<localize key="general_status">Status</localize>:</div>
|
||||
<div class="umb-package-details__information-item-content">
|
||||
<umb-badge style="margin-top: 4px;" size="s" color="{{vm.user.userDisplayState.color}}">
|
||||
{{vm.user.userDisplayState.name}}
|
||||
</umb-badge>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="umb-package-details__information-item">
|
||||
<div class="umb-package-details__information-item-label">
|
||||
<localize key="user_lastLogin">Last login</localize>:</div>
|
||||
<div class="umb-package-details__information-item-content">
|
||||
<span ng-if="vm.user.lastLoginDate">{{ vm.user.lastLoginDate }}</span>
|
||||
<span ng-if="!vm.user.lastLoginDate">{{ vm.user.name }} <localize key="user_noLogin">has not logged in yet</localize></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top: 20px;">
|
||||
<div style="margin-bottom: 10px;">
|
||||
<umb-button
|
||||
ng-if="vm.user.userDisplayState.key === 'Active' && !vm.user.isCurrentUser"
|
||||
type="button"
|
||||
button-style="[danger,block]"
|
||||
action="vm.disableUser()"
|
||||
state="vm.disableUserButtonState"
|
||||
label="Disable"
|
||||
label-key="actions_disable"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
|
||||
<div style="margin-bottom: 10px;">
|
||||
<umb-button
|
||||
ng-if="vm.user.userDisplayState.key === 'Disabled' && !vm.user.isCurrentUser || vm.user.userDisplayState.key === 'LockedOut' && !vm.user.isCurrentUser"
|
||||
type="button"
|
||||
button-style="[success,block]"
|
||||
state="vm.enableUserButtonState"
|
||||
action="vm.enableUser()"
|
||||
label="Enable"
|
||||
label-key="actions_enable"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
|
||||
<umb-button
|
||||
type="button"
|
||||
button-style="[info,block]"
|
||||
action="vm.toggleChangePassword()"
|
||||
label="Change password"
|
||||
label-key="general_changePassword"
|
||||
state="changePasswordButtonState"
|
||||
ng-if="vm.changePasswordModel.isChanging === false"
|
||||
size="m">
|
||||
</umb-button>
|
||||
|
||||
<ng-form ng-if="vm.changePasswordModel.isChanging" name="passwordForm" class="block-form" val-form-manager>
|
||||
|
||||
<change-password
|
||||
password-values="vm.user.changePassword"
|
||||
config="vm.changePasswordModel.config">
|
||||
</change-password>
|
||||
|
||||
<umb-button
|
||||
type="button"
|
||||
action="vm.toggleChangePassword()"
|
||||
label="Cancel"
|
||||
label-key="general_cancel"
|
||||
button-style="cancel">
|
||||
</umb-button>
|
||||
|
||||
</ng-form>
|
||||
|
||||
<div ng-if="vm.user.resetPasswordValue">
|
||||
<p><br />Password reset to value: <strong>{{vm.user.resetPasswordValue}}</strong></p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</ng-form>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="umb-package-details__information-item">
|
||||
<div class="umb-package-details__information-item-label"><localize key="general_status">Status</localize>:</div>
|
||||
<div class="umb-package-details__information-item-content">
|
||||
<umb-badge style="margin-top: 4px;"
|
||||
size="s"
|
||||
color="{{vm.user.userDisplayState.color}}">
|
||||
{{vm.user.userDisplayState.name}}
|
||||
</umb-badge>
|
||||
</div>
|
||||
</div>
|
||||
</umb-editor-container>
|
||||
|
||||
<div class="umb-package-details__information-item">
|
||||
<div class="umb-package-details__information-item-label"><localize key="user_lastLogin">Last login</localize>:</div>
|
||||
<div class="umb-package-details__information-item-content">
|
||||
<span ng-if="vm.user.lastLoginDate">{{ vm.user.lastLoginDate }}</span>
|
||||
<span ng-if="!vm.user.lastLoginDate">{{ vm.user.name }} <localize key="user_noLogin">has not logged in yet</localize></span>
|
||||
</div>
|
||||
</div>
|
||||
<umb-editor-footer>
|
||||
|
||||
<div style="margin-top: 20px;">
|
||||
<div style="margin-bottom: 10px;">
|
||||
<umb-button ng-if="vm.user.userDisplayState.key === 'Active' && !vm.user.isCurrentUser"
|
||||
type="button"
|
||||
button-style="[danger,block]"
|
||||
action="vm.disableUser()"
|
||||
state="vm.disableUserButtonState"
|
||||
label="Disable"
|
||||
label-key="actions_disable"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
<umb-editor-footer-content-left>
|
||||
|
||||
<div style="margin-bottom: 10px;">
|
||||
<umb-button ng-if="vm.user.userDisplayState.key === 'Disabled' && !vm.user.isCurrentUser || vm.user.userDisplayState.key === 'LockedOut' && !vm.user.isCurrentUser"
|
||||
type="button"
|
||||
button-style="[success,block]"
|
||||
state="vm.enableUserButtonState"
|
||||
action="vm.enableUser()"
|
||||
label="Enable"
|
||||
label-key="actions_enable"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
|
||||
<umb-button type="button"
|
||||
button-style="[info,block]"
|
||||
action="vm.toggleChangePassword()"
|
||||
label="Change password"
|
||||
label-key="general_changePassword"
|
||||
state="changePasswordButtonState"
|
||||
ng-if="vm.changePasswordModel.isChanging === false"
|
||||
size="m">
|
||||
</umb-button>
|
||||
<umb-breadcrumbs
|
||||
ancestors="vm.breadcrumbs"
|
||||
allow-on-open="true"
|
||||
on-open="vm.goToPage(ancestor)">
|
||||
</umb-breadcrumbs>
|
||||
|
||||
<ng-form ng-if="vm.changePasswordModel.isChanging"
|
||||
name="passwordForm"
|
||||
class="block-form"
|
||||
val-form-manager>
|
||||
</umb-editor-footer-content-left>
|
||||
|
||||
<change-password password-values="vm.user.changePassword"
|
||||
config="vm.changePasswordModel.config">
|
||||
</change-password>
|
||||
<umb-editor-footer-content-right>
|
||||
|
||||
<umb-button type="button"
|
||||
action="vm.toggleChangePassword()"
|
||||
label="Cancel"
|
||||
label-key="general_cancel"
|
||||
button-style="cancel">
|
||||
<umb-button
|
||||
type="button"
|
||||
action="vm.goToPage(vm.breadcrumbs[0])"
|
||||
label="Return to list"
|
||||
label-key="buttons_returnToList">
|
||||
</umb-button>
|
||||
|
||||
</ng-form>
|
||||
<umb-button
|
||||
type="button"
|
||||
action="vm.save()"
|
||||
state="vm.page.saveButtonState"
|
||||
button-style="success"
|
||||
shortcut="ctrl+s"
|
||||
label="Save"
|
||||
label-key="buttons_save">
|
||||
</umb-button>
|
||||
|
||||
<div ng-if="vm.user.resetPasswordValue">
|
||||
</umb-editor-footer-content-right>
|
||||
|
||||
<p><br />Password reset to value: <strong>{{vm.user.resetPasswordValue}}</strong></p>
|
||||
</div>
|
||||
</umb-editor-footer>
|
||||
|
||||
</div>
|
||||
</umb-editor-view>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<umb-overlay
|
||||
ng-if="vm.userGroupPicker.show"
|
||||
model="vm.userGroupPicker"
|
||||
view="vm.userGroupPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
</div>
|
||||
<umb-overlay
|
||||
ng-if="vm.contentPicker.show"
|
||||
model="vm.contentPicker"
|
||||
view="vm.contentPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
</div>
|
||||
<umb-overlay
|
||||
ng-if="vm.mediaPicker.show"
|
||||
model="vm.mediaPicker"
|
||||
view="vm.mediaPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
</umb-editor-container>
|
||||
|
||||
<umb-editor-footer>
|
||||
|
||||
<umb-editor-footer-content-left>
|
||||
|
||||
<umb-breadcrumbs ancestors="vm.breadcrumbs"
|
||||
allow-on-open="true"
|
||||
on-open="vm.goToPage(ancestor)">
|
||||
</umb-breadcrumbs>
|
||||
|
||||
</umb-editor-footer-content-left>
|
||||
|
||||
<umb-editor-footer-content-right>
|
||||
|
||||
<umb-button type="button"
|
||||
action="vm.goToPage(vm.breadcrumbs[0])"
|
||||
label="Return to list"
|
||||
label-key="buttons_returnToList">
|
||||
</umb-button>
|
||||
|
||||
<umb-button type="button"
|
||||
action="vm.save()"
|
||||
state="vm.page.saveButtonState"
|
||||
button-style="success"
|
||||
shortcut="ctrl+s"
|
||||
label="Save"
|
||||
label-key="buttons_save">
|
||||
</umb-button>
|
||||
|
||||
</umb-editor-footer-content-right>
|
||||
|
||||
</umb-editor-footer>
|
||||
|
||||
</umb-editor-view>
|
||||
|
||||
</form>
|
||||
|
||||
<umb-overlay ng-if="vm.userGroupPicker.show"
|
||||
model="vm.userGroupPicker"
|
||||
view="vm.userGroupPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
<umb-overlay ng-if="vm.contentPicker.show"
|
||||
model="vm.contentPicker"
|
||||
view="vm.contentPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
<umb-overlay ng-if="vm.mediaPicker.show"
|
||||
model="vm.mediaPicker"
|
||||
view="vm.mediaPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -14,11 +14,11 @@
|
||||
vm.newUser = {};
|
||||
vm.usersOptions = {};
|
||||
vm.userSortData = [
|
||||
{ label: "Name (A-Z)", key: "Name", direction: "Ascending" },
|
||||
{ label: "Name (Z-A)", key: "Name", direction: "Descending" },
|
||||
{ label: "Newest", key: "CreateDate", direction: "Descending" },
|
||||
{ label: "Oldest", key: "CreateDate", direction: "Ascending" },
|
||||
{ label: "Last login", key: "LastLoginDate", direction: "Descending" }
|
||||
{ label: "Name (A-Z)", key: "Name", direction: "Ascending" },
|
||||
{ label: "Name (Z-A)", key: "Name", direction: "Descending" },
|
||||
{ label: "Newest", key: "CreateDate", direction: "Descending" },
|
||||
{ label: "Oldest", key: "CreateDate", direction: "Ascending" },
|
||||
{ label: "Last login", key: "LastLoginDate", direction: "Descending" }
|
||||
];
|
||||
vm.userStatesFilter = [];
|
||||
vm.newUser.userGroups = [];
|
||||
@@ -111,11 +111,11 @@
|
||||
}
|
||||
|
||||
function getSortLabel(sortKey, sortDirection) {
|
||||
var found = _.find(vm.userSortData,
|
||||
function (i) {
|
||||
return i.key === sortKey && i.direction === sortDirection;
|
||||
});
|
||||
return found ? found.label : sortKey;
|
||||
var found = _.find(vm.userSortData,
|
||||
function (i) {
|
||||
return i.key === sortKey && i.direction === sortDirection;
|
||||
});
|
||||
return found ? found.label : sortKey;
|
||||
}
|
||||
|
||||
function toggleFilter(type) {
|
||||
@@ -160,7 +160,7 @@
|
||||
function selectUser(user, selection, event) {
|
||||
|
||||
// prevent the current user to be selected
|
||||
if(!user.isCurrentUser) {
|
||||
if (!user.isCurrentUser) {
|
||||
|
||||
if (user.selected) {
|
||||
var index = selection.indexOf(user.id);
|
||||
@@ -170,10 +170,10 @@
|
||||
user.selected = true;
|
||||
vm.selection.push(user.id);
|
||||
}
|
||||
|
||||
|
||||
setBulkActions(vm.users);
|
||||
|
||||
if(event){
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
}
|
||||
@@ -188,7 +188,7 @@
|
||||
}
|
||||
|
||||
function clickUser(user) {
|
||||
if(vm.selection.length > 0) {
|
||||
if (vm.selection.length > 0) {
|
||||
selectUser(user, vm.selection);
|
||||
} else {
|
||||
goToUser(user.id);
|
||||
@@ -198,22 +198,22 @@
|
||||
function disableUsers() {
|
||||
vm.disableUserButtonState = "busy";
|
||||
usersResource.disableUsers(vm.selection).then(function (data) {
|
||||
// update userState
|
||||
angular.forEach(vm.selection, function (userId) {
|
||||
var user = getUserFromArrayById(userId, vm.users);
|
||||
if (user) {
|
||||
user.userState = 1;
|
||||
}
|
||||
});
|
||||
// show the correct badges
|
||||
setUserDisplayState(vm.users);
|
||||
// update userState
|
||||
angular.forEach(vm.selection, function (userId) {
|
||||
var user = getUserFromArrayById(userId, vm.users);
|
||||
if (user) {
|
||||
user.userState = 1;
|
||||
}
|
||||
});
|
||||
// show the correct badges
|
||||
setUserDisplayState(vm.users);
|
||||
|
||||
formHelper.showNotifications(data);
|
||||
|
||||
vm.disableUserButtonState = "init";
|
||||
clearSelection();
|
||||
formHelper.showNotifications(data);
|
||||
|
||||
}, function(error){
|
||||
vm.disableUserButtonState = "init";
|
||||
clearSelection();
|
||||
|
||||
}, function (error) {
|
||||
vm.disableUserButtonState = "error";
|
||||
formHelper.showNotifications(error.data);
|
||||
});
|
||||
@@ -222,27 +222,27 @@
|
||||
function enableUsers() {
|
||||
vm.enableUserButtonState = "busy";
|
||||
usersResource.enableUsers(vm.selection).then(function (data) {
|
||||
// update userState
|
||||
angular.forEach(vm.selection, function (userId) {
|
||||
var user = getUserFromArrayById(userId, vm.users);
|
||||
if (user) {
|
||||
user.userState = 0;
|
||||
}
|
||||
});
|
||||
// show the correct badges
|
||||
setUserDisplayState(vm.users);
|
||||
// show notification
|
||||
formHelper.showNotifications(data);
|
||||
vm.enableUserButtonState = "init";
|
||||
clearSelection();
|
||||
// update userState
|
||||
angular.forEach(vm.selection, function (userId) {
|
||||
var user = getUserFromArrayById(userId, vm.users);
|
||||
if (user) {
|
||||
user.userState = 0;
|
||||
}
|
||||
});
|
||||
// show the correct badges
|
||||
setUserDisplayState(vm.users);
|
||||
// show notification
|
||||
formHelper.showNotifications(data);
|
||||
vm.enableUserButtonState = "init";
|
||||
clearSelection();
|
||||
}, function (error) {
|
||||
vm.enableUserButtonState = "error";
|
||||
formHelper.showNotifications(error.data);
|
||||
formHelper.showNotifications(error.data);
|
||||
});
|
||||
}
|
||||
|
||||
function getUserFromArrayById(userId, users) {
|
||||
return _.find(users, function(u) { return u.id === userId });
|
||||
return _.find(users, function (u) { return u.id === userId });
|
||||
}
|
||||
|
||||
function openBulkUserGroupPicker(event) {
|
||||
@@ -264,7 +264,7 @@
|
||||
});
|
||||
// apply changes to UI
|
||||
_.each(vm.selection,
|
||||
function(userId) {
|
||||
function (userId) {
|
||||
var user = getUserFromArrayById(userId, vm.users);
|
||||
user.userGroups = vm.selectedBulkUserGroups;
|
||||
});
|
||||
@@ -327,7 +327,7 @@
|
||||
// select all users
|
||||
angular.forEach(vm.users, function (user) {
|
||||
// prevent the current user to be selected
|
||||
if(!user.isCurrentUser) {
|
||||
if (!user.isCurrentUser) {
|
||||
user.selected = true;
|
||||
vm.selection.push(user.id);
|
||||
}
|
||||
@@ -339,11 +339,11 @@
|
||||
// we need to check if the current user is part of the selection and
|
||||
// subtract the user from the total selection to find out if all users are selected
|
||||
var includesCurrentUser = vm.users.some(function (user) { return user.isCurrentUser === true; });
|
||||
|
||||
if(includesCurrentUser) {
|
||||
if (vm.selection.length === vm.users.length - 1) { return true;}
|
||||
|
||||
if (includesCurrentUser) {
|
||||
if (vm.selection.length === vm.users.length - 1) { return true; }
|
||||
} else {
|
||||
if (vm.selection.length === vm.users.length) { return true;}
|
||||
if (vm.selection.length === vm.users.length) { return true; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -362,7 +362,7 @@
|
||||
var found = false;
|
||||
angular.forEach(array, function (item) {
|
||||
if (item.selected) {
|
||||
if(!found) {
|
||||
if (!found) {
|
||||
name = item.name
|
||||
found = true;
|
||||
} else {
|
||||
@@ -374,14 +374,14 @@
|
||||
}
|
||||
|
||||
function setUserStatesFilter(userState) {
|
||||
|
||||
|
||||
if (!vm.usersOptions.userStates) {
|
||||
vm.usersOptions.userStates = [];
|
||||
}
|
||||
|
||||
//If the selection is "ALL" then we need to unselect everything else since this is an 'odd' filter
|
||||
if (userState.key === "All") {
|
||||
angular.forEach(vm.userStatesFilter, function(i) {
|
||||
angular.forEach(vm.userStatesFilter, function (i) {
|
||||
i.selected = false;
|
||||
});
|
||||
//we can't unselect All
|
||||
@@ -397,7 +397,7 @@
|
||||
});
|
||||
var indexOfAll = vm.usersOptions.userStates.indexOf("All");
|
||||
if (indexOfAll >= 0) {
|
||||
vm.usersOptions.userStates.splice(indexOfAll, 1);
|
||||
vm.usersOptions.userStates.splice(indexOfAll, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -414,11 +414,11 @@
|
||||
|
||||
function setUserGroupFilter(userGroup) {
|
||||
|
||||
if(!vm.usersOptions.userGroups) {
|
||||
if (!vm.usersOptions.userGroups) {
|
||||
vm.usersOptions.userGroups = [];
|
||||
}
|
||||
|
||||
if(userGroup.selected) {
|
||||
if (userGroup.selected) {
|
||||
vm.usersOptions.userGroups.push(userGroup.alias);
|
||||
} else {
|
||||
var index = vm.usersOptions.userGroups.indexOf(userGroup.alias);
|
||||
@@ -472,6 +472,9 @@
|
||||
.then(function (saved) {
|
||||
//success
|
||||
vm.page.createButtonState = "success";
|
||||
vm.newUser = saved;
|
||||
setUsersViewState('inviteUserSuccess');
|
||||
getUsers();
|
||||
}, function (err) {
|
||||
//error
|
||||
formHelper.handleError(err);
|
||||
@@ -489,7 +492,7 @@
|
||||
function copySuccess() {
|
||||
vm.page.copyPasswordButtonState = "success";
|
||||
}
|
||||
|
||||
|
||||
// copy to clip board error
|
||||
function copyError() {
|
||||
vm.page.copyPasswordButtonState = "error";
|
||||
@@ -520,7 +523,7 @@
|
||||
|
||||
vm.loading = false;
|
||||
|
||||
}, function(error){
|
||||
}, function (error) {
|
||||
|
||||
vm.loading = false;
|
||||
|
||||
@@ -528,7 +531,7 @@
|
||||
}
|
||||
|
||||
function setUserDisplayState(users) {
|
||||
angular.forEach(users, function(user){
|
||||
angular.forEach(users, function (user) {
|
||||
user.userDisplayState = usersHelper.getUserStateFromValue(user.userState);
|
||||
});
|
||||
}
|
||||
@@ -557,22 +560,22 @@
|
||||
}
|
||||
|
||||
// if the current user is selected prevent any bulk actions with the user included
|
||||
if(user.isCurrentUser) {
|
||||
if (user.isCurrentUser) {
|
||||
vm.allowDisableUser = false;
|
||||
vm.allowEnableUser = false;
|
||||
vm.allowSetUserGroup = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if(user.userDisplayState && user.userDisplayState.key === "Disabled") {
|
||||
if (user.userDisplayState && user.userDisplayState.key === "Disabled") {
|
||||
vm.allowDisableUser = false;
|
||||
}
|
||||
|
||||
if(user.userDisplayState && user.userDisplayState.key === "Active") {
|
||||
if (user.userDisplayState && user.userDisplayState.key === "Active") {
|
||||
vm.allowEnableUser = false;
|
||||
}
|
||||
|
||||
if(user.userDisplayState && user.userDisplayState.key === "Invited") {
|
||||
if (user.userDisplayState && user.userDisplayState.key === "Invited") {
|
||||
vm.allowEnableUser = false;
|
||||
}
|
||||
|
||||
@@ -584,7 +587,7 @@
|
||||
// for 2nd+ selected user, compare the user group aliases to determine if we should allow bulk editing.
|
||||
// we don't allow bulk editing of users not currently having the same assigned user groups, as we can't
|
||||
// really support that in the user group picker.
|
||||
var userGroups = user.userGroups.map(function(ug) { return ug.alias; });
|
||||
var userGroups = user.userGroups.map(function (ug) { return ug.alias; });
|
||||
if (_.difference(firstSelectedUserGroups, userGroups).length > 0) {
|
||||
vm.allowSetUserGroup = false;
|
||||
}
|
||||
|
||||
@@ -1,464 +1,519 @@
|
||||
<div ng-controller="Umbraco.Editors.Users.UsersController as vm" class="clearfix">
|
||||
|
||||
<umb-load-indicator ng-show="vm.loading"></umb-load-indicator>
|
||||
<!-- Users Overview -->
|
||||
<div ng-if="vm.usersViewState === 'overview'">
|
||||
|
||||
<!-- Users Overview -->
|
||||
<div ng-if="vm.usersViewState === 'overview'">
|
||||
<umb-load-indicator ng-show="vm.loading"></umb-load-indicator>
|
||||
|
||||
<umb-editor-sub-header>
|
||||
<umb-editor-sub-header>
|
||||
|
||||
<!-- No selection -->
|
||||
<umb-editor-sub-header-content-left ng-if="vm.selection.length === 0">
|
||||
<umb-button-group ng-if="vm.defaultButton"
|
||||
default-button="vm.defaultButton"
|
||||
sub-buttons="vm.subButtons">
|
||||
</umb-button-group>
|
||||
</umb-editor-sub-header-content-left>
|
||||
<!-- No selection -->
|
||||
<umb-editor-sub-header-content-left ng-if="vm.selection.length === 0">
|
||||
<umb-button-group
|
||||
ng-if="vm.defaultButton"
|
||||
default-button="vm.defaultButton"
|
||||
sub-buttons="vm.subButtons">
|
||||
</umb-button-group>
|
||||
</umb-editor-sub-header-content-left>
|
||||
|
||||
<umb-editor-sub-header-content-right ng-if="vm.selection.length === 0">
|
||||
<umb-editor-sub-header-section>
|
||||
<umb-layout-selector ng-if="vm.layouts"
|
||||
layouts="vm.layouts"
|
||||
active-layout="vm.activeLayout"
|
||||
on-layout-select="vm.selectLayout">
|
||||
</umb-layout-selector>
|
||||
</umb-editor-sub-header-section>
|
||||
<umb-editor-sub-header-section>
|
||||
<div class="form-search -no-margin-bottom pull-right">
|
||||
<div class="inner-addon left-addon">
|
||||
<i class="icon icon-search"></i>
|
||||
<input class="form-control search-input"
|
||||
type="text"
|
||||
localize="placeholder"
|
||||
placeholder="@general_typeToSearch"
|
||||
ng-model="vm.usersOptions.filter"
|
||||
ng-change="vm.searchUsers()"
|
||||
prevent-enter-submit
|
||||
no-dirty-check>
|
||||
</div>
|
||||
</div>
|
||||
</umb-editor-sub-header-section>
|
||||
</umb-editor-sub-header-content-right>
|
||||
<umb-editor-sub-header-content-right ng-if="vm.selection.length === 0">
|
||||
<umb-editor-sub-header-section>
|
||||
<umb-layout-selector
|
||||
ng-if="vm.layouts"
|
||||
layouts="vm.layouts"
|
||||
active-layout="vm.activeLayout"
|
||||
on-layout-select="vm.selectLayout">
|
||||
</umb-layout-selector>
|
||||
</umb-editor-sub-header-section>
|
||||
<umb-editor-sub-header-section>
|
||||
<div class="form-search -no-margin-bottom pull-right">
|
||||
<div class="inner-addon left-addon">
|
||||
<i class="icon icon-search"></i>
|
||||
<input
|
||||
class="form-control search-input"
|
||||
type="text" localize="placeholder"
|
||||
placeholder="@general_typeToSearch"
|
||||
ng-model="vm.usersOptions.filter"
|
||||
ng-change="vm.searchUsers()"
|
||||
prevent-enter-submit
|
||||
no-dirty-check>
|
||||
</div>
|
||||
</div>
|
||||
</umb-editor-sub-header-section>
|
||||
</umb-editor-sub-header-content-right>
|
||||
|
||||
<!-- With selection -->
|
||||
<umb-editor-sub-header-content-left ng-if="vm.selection.length > 0">
|
||||
<umb-editor-sub-header-section>
|
||||
<umb-button type="button"
|
||||
label="Clear selection"
|
||||
size="xs"
|
||||
label-key="buttons_clearSelection"
|
||||
action="vm.clearSelection()"
|
||||
disabled="actionInProgress">
|
||||
</umb-button>
|
||||
</umb-editor-sub-header-section>
|
||||
<umb-editor-sub-header-section>
|
||||
<strong>{{ vm.selection.length }} <localize key="general_of">of</localize> {{ vm.users.length }} <localize key="general_selected">selected</localize></strong>
|
||||
</umb-editor-sub-header-section>
|
||||
</umb-editor-sub-header-content-left>
|
||||
|
||||
<umb-editor-sub-header-content-right ng-if="vm.selection.length > 0">
|
||||
<div style="margin-right: 5px;">
|
||||
<umb-button ng-if="vm.allowSetUserGroup"
|
||||
<!-- With selection -->
|
||||
<umb-editor-sub-header-content-left ng-if="vm.selection.length > 0">
|
||||
<umb-editor-sub-header-section>
|
||||
<umb-button
|
||||
type="button"
|
||||
label="Clear selection"
|
||||
size="xs"
|
||||
label-key="buttons_clearSelection"
|
||||
action="vm.clearSelection()"
|
||||
disabled="actionInProgress">
|
||||
</umb-button>
|
||||
</umb-editor-sub-header-section>
|
||||
<umb-editor-sub-header-section>
|
||||
<strong>{{ vm.selection.length }} <localize key="general_of">of</localize> {{ vm.users.length }} <localize key="general_selected">selected</localize></strong>
|
||||
</umb-editor-sub-header-section>
|
||||
|
||||
</umb-editor-sub-header-content-left>
|
||||
|
||||
<umb-editor-sub-header-content-right ng-if="vm.selection.length > 0">
|
||||
<div style="margin-right: 5px;">
|
||||
<umb-button
|
||||
ng-if="vm.allowSetUserGroup"
|
||||
type="button" size="xs"
|
||||
label-key="actions_setGroup"
|
||||
icon="icon-users"
|
||||
action="vm.openBulkUserGroupPicker()">
|
||||
</umb-button>
|
||||
</div>
|
||||
<div style="margin-right: 5px;">
|
||||
<umb-button ng-if="vm.allowEnableUser"
|
||||
</umb-button>
|
||||
</div>
|
||||
<div style="margin-right: 5px;">
|
||||
<umb-button
|
||||
ng-if="vm.allowEnableUser"
|
||||
type="button"
|
||||
size="xs"
|
||||
state="vm.enableUserButtonState"
|
||||
label-key="actions_enable"
|
||||
icon="icon-check"
|
||||
action="vm.enableUsers()">
|
||||
</umb-button>
|
||||
</div>
|
||||
<div>
|
||||
<umb-button ng-if="vm.allowDisableUser"
|
||||
</umb-button>
|
||||
</div>
|
||||
<div>
|
||||
<umb-button
|
||||
ng-if="vm.allowDisableUser"
|
||||
type="button"
|
||||
size="xs"
|
||||
state="vm.disableUserButtonState"
|
||||
label-key="actions_disable"
|
||||
icon="icon-block"
|
||||
action="vm.disableUsers()">
|
||||
</umb-button>
|
||||
</div>
|
||||
</umb-editor-sub-header-content-right>
|
||||
</umb-button>
|
||||
</div>
|
||||
</umb-editor-sub-header-content-right>
|
||||
|
||||
</umb-editor-sub-header>
|
||||
</umb-editor-sub-header>
|
||||
|
||||
<!-- Filters -->
|
||||
<div style="margin-bottom: 20px;" class="flex items-center">
|
||||
<!-- Filters -->
|
||||
<div style="margin-bottom: 20px;" class="flex items-center">
|
||||
|
||||
<div style="font-size: 16px;">
|
||||
<span class="bold"><localize key="sections_users">Users</localize></span> <span ng-if="vm.usersOptions.totalItems">({{vm.usersOptions.totalItems}})</span>
|
||||
</div>
|
||||
|
||||
<div class="flex" style="margin-left: auto;">
|
||||
|
||||
<!-- State filter -->
|
||||
<div style="position: relative;" ng-if="vm.userStatesFilter.length > 0">
|
||||
<a class="btn btn-link dropdown-toggle flex" href="" ng-click="vm.toggleFilter('state')">
|
||||
<span><localize key="general_status">Status</localize>:</span>
|
||||
<span class="bold truncate dib" style="margin-left: 5px; margin-right: 3px; max-width: 150px;">{{ vm.getFilterName(vm.userStatesFilter) }}</span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<umb-dropdown class="pull-right" ng-if="vm.page.showStatusFilter" on-close="vm.page.showStatusFilter = false;">
|
||||
<umb-dropdown-item ng-repeat="userState in vm.userStatesFilter | filter:{ count: '!0', key: '!All'}" style="padding: 8px 20px 8px 16px;">
|
||||
<div class="flex items-center">
|
||||
<input id="state-{{$index}}" type="checkbox" ng-model="userState.selected" ng-change="vm.setUserStatesFilter(userState)" style="margin-right: 10px; margin-top: -3px;" />
|
||||
<label for="state-{{$index}}">{{ userState.name }} ({{userState.count}})</label>
|
||||
</div>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Groups filter -->
|
||||
<div style="position: relative;">
|
||||
<a class="btn btn-link dropdown-toggle flex" href="" ng-click="vm.toggleFilter('group')">
|
||||
<span><localize key="general_groups"></localize>:</span>
|
||||
<span class="bold truncate dib" style="margin-left: 5px; margin-right: 3px; max-width: 150px;">{{ vm.getFilterName(vm.userGroups) }}</span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<umb-dropdown class="pull-right" ng-if="vm.page.showGroupFilter" on-close="vm.page.showGroupFilter = false;">
|
||||
<umb-dropdown-item ng-repeat="userGroup in vm.userGroups" style="padding: 8px 20px 8px 16px;">
|
||||
<div class="flex items-center">
|
||||
<input id="group-{{$index}}" type="checkbox" ng-model="userGroup.selected" ng-change="vm.setUserGroupFilter(userGroup)" style="margin-right: 10px; margin-top: -3px;" />
|
||||
<label for="group-{{$index}}">{{ userGroup.name }}</label>
|
||||
</div>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Order By -->
|
||||
<div style="position: relative;">
|
||||
<a class="btn btn-link dropdown-toggle flex" href="" ng-click="vm.toggleFilter('orderBy')">
|
||||
<span><localize key="general_orderBy">Order by</localize>:</span>
|
||||
<span class="bold" style="margin-left: 2px;">{{ vm.getSortLabel(vm.usersOptions.orderBy, vm.usersOptions.orderDirection) }} </span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<umb-dropdown class="pull-right" ng-if="vm.page.showOrderByFilter" on-close="vm.page.showOrderByFilter = false;" umb-keyboard-list>
|
||||
<umb-dropdown-item ng-repeat="sortData in vm.userSortData">
|
||||
<a href="#" ng-click="vm.setOrderByFilter(sortData.key, sortData.direction)" prevent-default>{{sortData.label}}</a>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Empty states -->
|
||||
<umb-empty-state ng-if="!vm.users && vm.usersOptions.filter.length > 0"
|
||||
position="center">
|
||||
<localize key="general_searchNoResult"></localize>
|
||||
</umb-empty-state>
|
||||
|
||||
<!-- Layout: Cards -->
|
||||
<div class="umb-user-cards" ng-if="vm.activeLayout.path === '1' && vm.loading === false">
|
||||
<a href="" class="umb-user-card" ng-repeat="user in vm.users" ng-click="vm.clickUser(user)">
|
||||
<div class="umb-user-card__content" ng-class="{'umb-user-card__content--selected': user.selected}">
|
||||
<umb-badge class="umb-user-card__badge"
|
||||
size="xs"
|
||||
ng-if="user.userDisplayState.key !== 'Active'"
|
||||
color="{{user.userDisplayState.color}}">
|
||||
{{ user.userDisplayState.name }}
|
||||
</umb-badge>
|
||||
<div class="umb-user-card__avatar">
|
||||
<umb-avatar size="l"
|
||||
color="secondary"
|
||||
name="{{user.name}}"
|
||||
img-src="{{user.avatars[2]}}"
|
||||
img-srcset="{{user.avatars[3]}} 2x, {{user.avatars[4]}} 3x">
|
||||
</umb-avatar>
|
||||
</div>
|
||||
<div class="umb-user-card__checkmark" ng-class="{'umb-user-card__checkmark--visible': user.selected || vm.selection.length > 0 }" ng-click="vm.selectUser(user, vm.selection, $event)">
|
||||
<umb-checkmark ng-if="!user.isCurrentUser" checked="user.selected" size="s"></umb-checkmark>
|
||||
</div>
|
||||
<div class="umb-user-card__name" href="">{{user.name}}</div>
|
||||
<div class="umb-user-card__group">
|
||||
<span ng-repeat="userGroup in user.userGroups">{{ userGroup.name }}<span ng-if="!$last">, </span></span>
|
||||
</div>
|
||||
<div class="umb-user-card__last-login">
|
||||
<div ng-if="user.formattedLastLogin">
|
||||
<div><localize key="user_lastLogin">Last login</localize></div>
|
||||
{{ user.formattedLastLogin }}
|
||||
<div style="font-size: 16px;">
|
||||
<span class="bold"><localize key="sections_users">Users</localize></span> <span ng-if="vm.usersOptions.totalItems">({{vm.usersOptions.totalItems}})</span>
|
||||
</div>
|
||||
<div ng-if="!user.formattedLastLogin">
|
||||
<div>{{ user.name | umbWordLimit:1 }} <localize key="user_noLogin">has not logged in yet</localize></div>
|
||||
|
||||
<div class="flex" style="margin-left: auto;">
|
||||
|
||||
<!-- State filter -->
|
||||
<div style="position: relative;" ng-if="vm.userStatesFilter.length > 0">
|
||||
<a class="btn btn-link dropdown-toggle flex" href="" ng-click="vm.toggleFilter('state')">
|
||||
<span><localize key="general_status">Status</localize>:</span>
|
||||
<span class="bold truncate dib" style="margin-left: 5px; margin-right: 3px; max-width: 150px;">{{ vm.getFilterName(vm.userStatesFilter) }}</span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<umb-dropdown class="pull-right" ng-if="vm.page.showStatusFilter" on-close="vm.page.showStatusFilter = false;">
|
||||
<umb-dropdown-item ng-repeat="userState in vm.userStatesFilter | filter:{ count: '!0', key: '!All'}" style="padding: 8px 20px 8px 16px;">
|
||||
<div class="flex items-center">
|
||||
<input
|
||||
id="state-{{$index}}"
|
||||
type="checkbox"
|
||||
ng-model="userState.selected"
|
||||
ng-change="vm.setUserStatesFilter(userState)"
|
||||
style="margin-right: 10px; margin-top: -3px;" />
|
||||
<label for="state-{{$index}}">{{ userState.name }} ({{userState.count}})</label>
|
||||
</div>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Groups filter -->
|
||||
<div style="position: relative;">
|
||||
<a class="btn btn-link dropdown-toggle flex" href="" ng-click="vm.toggleFilter('group')">
|
||||
<span><localize key="general_groups"></localize>:</span>
|
||||
<span class="bold truncate dib" style="margin-left: 5px; margin-right: 3px; max-width: 150px;">{{ vm.getFilterName(vm.userGroups) }}</span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<umb-dropdown class="pull-right" ng-if="vm.page.showGroupFilter" on-close="vm.page.showGroupFilter = false;">
|
||||
<umb-dropdown-item ng-repeat="userGroup in vm.userGroups" style="padding: 8px 20px 8px 16px;">
|
||||
<div class="flex items-center">
|
||||
<input
|
||||
id="group-{{$index}}"
|
||||
type="checkbox"
|
||||
ng-model="userGroup.selected"
|
||||
ng-change="vm.setUserGroupFilter(userGroup)"
|
||||
style="margin-right: 10px; margin-top: -3px;" />
|
||||
<label for="group-{{$index}}">{{ userGroup.name }}</label>
|
||||
</div>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
</div>
|
||||
|
||||
<!-- Order By -->
|
||||
<div style="position: relative;">
|
||||
<a class="btn btn-link dropdown-toggle flex" href="" ng-click="vm.toggleFilter('orderBy')">
|
||||
<span><localize key="general_orderBy">Order by</localize>:</span>
|
||||
<span class="bold" style="margin-left: 2px;">{{ vm.getSortLabel(vm.usersOptions.orderBy, vm.usersOptions.orderDirection) }} </span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<umb-dropdown class="pull-right" ng-if="vm.page.showOrderByFilter" on-close="vm.page.showOrderByFilter = false;" umb-keyboard-list>
|
||||
<umb-dropdown-item ng-repeat="sortData in vm.userSortData">
|
||||
<a href="#" ng-click="vm.setOrderByFilter(sortData.key, sortData.direction)" prevent-default>{{sortData.label}}</a>
|
||||
</umb-dropdown-item>
|
||||
</umb-dropdown>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Layout: Table -->
|
||||
<div ng-if="vm.activeLayout.path === '2'">
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="padding-left: 10px; width: 10px;">
|
||||
<a href="" style="text-decoration: none;" ng-click="vm.selectAll()"><umb-checkmark checked="vm.areAllSelected()" size="xs"></umb-checkmark></a>
|
||||
</th>
|
||||
<th style="width: 70px;"></th>
|
||||
<th><localize key="general_name">Name</localize></th>
|
||||
<th><localize key="user_usergroup">User group</localize></th>
|
||||
<th><localize key="user_lastLogin">Last login</localize></th>
|
||||
<th><localize key="general_status">Status</localize></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="user in vm.users" ng-click="vm.clickUser(user)" style="cursor: pointer;" ng-mouseenter="user.hover = true" ng-mouseleave="user.hover = false">
|
||||
<td style="padding-left: 10px;">
|
||||
<div ng-if="!user.isCurrentUser" ng-click="vm.selectUser(user, vm.selection, $event)">
|
||||
<umb-checkmark
|
||||
ng-if="vm.selection.length > 0 || user.hover"
|
||||
checked="user.selected"
|
||||
size="xs">
|
||||
</umb-checkmark>
|
||||
</div>
|
||||
</td>
|
||||
<td scope="row">
|
||||
<umb-avatar size="xs"
|
||||
color="secondary"
|
||||
name="{{user.name}}"
|
||||
img-src="{{user.avatars[0]}}"
|
||||
img-srcset="{{user.avatars[1]}} 2x, {{user.avatars[2]}} 3x">
|
||||
</umb-avatar>
|
||||
</td>
|
||||
<td class="bold">{{user.name}}</td>
|
||||
<td><span ng-repeat="userGroup in user.userGroups">{{ userGroup.name }}<span ng-if="!$last">, </span></span></td>
|
||||
<td>{{ user.formattedLastLogin }}</td>
|
||||
<td style="text-transform: capitalize;">
|
||||
<umb-badge size="xs"
|
||||
ng-if="user.userDisplayState.key !== 'Active'"
|
||||
color="{{user.userDisplayState.color}}">
|
||||
{{ user.userDisplayState.name }}
|
||||
</umb-badge>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<div ng-if="!vm.loading" class="flex justify-center">
|
||||
<umb-pagination ng-if="vm.usersOptions.totalPages"
|
||||
page-number="vm.usersOptions.pageNumber"
|
||||
total-pages="vm.usersOptions.totalPages"
|
||||
on-change="vm.changePageNumber(pageNumber)">
|
||||
</umb-pagination>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Add user -->
|
||||
<div ng-if="vm.usersViewState === 'inviteUser' || vm.usersViewState === 'createUser'">
|
||||
|
||||
<umb-editor-sub-header>
|
||||
<umb-editor-sub-header-content-left>
|
||||
<a class="umb-package-details__back-link" href="" ng-click="vm.setUsersViewState('overview');">← <localize key="user_backToUsers">Back to users</localize></a>
|
||||
</umb-editor-sub-header-content-left>
|
||||
</umb-editor-sub-header>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<form name="addUserForm" no-validate val-form-manager style="max-width: 500px;" class="block-form">
|
||||
<div>
|
||||
<div ng-if="vm.usersViewState === 'inviteUser'">
|
||||
<h3 class="bold" style="margin-bottom: 0;"><localize key="user_inviteUser">Invite User</localize></h3>
|
||||
<p style="line-height: 1.6em; margin-bottom: 15px;">
|
||||
<localize key="user_inviteUserHelp"></localize>
|
||||
</p>
|
||||
</div>
|
||||
<div ng-if="vm.usersViewState === 'createUser'">
|
||||
<h3 class="bold" style="margin-bottom: 0;"><localize key="user_createUser">Create user</localize></h3>
|
||||
<p style="line-height: 1.6em; margin-bottom: 15px;">
|
||||
<localize key="user_createUserHelp"></localize>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<umb-control-group label="@general_name" label-for="name">
|
||||
<input type="text"
|
||||
name="name"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_entername"
|
||||
class="input-block-level"
|
||||
ng-model="vm.newUser.name"
|
||||
umb-auto-focus
|
||||
required
|
||||
val-server-field="Name"/>
|
||||
<span class="help-inline" val-msg-for="name" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="name" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
<!-- Empty states -->
|
||||
<umb-empty-state
|
||||
ng-if="!vm.users && vm.usersOptions.filter.length > 0"
|
||||
position="center">
|
||||
<localize key="general_searchNoResult"></localize>
|
||||
</umb-empty-state>
|
||||
|
||||
<umb-control-group label="@general_email" label-for="email">
|
||||
<input type="email"
|
||||
name="email"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_enteremail"
|
||||
class="input-block-level"
|
||||
ng-model="vm.newUser.email"
|
||||
required
|
||||
val-email
|
||||
val-server-field="Email"/>
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
<!-- Layout: Cards -->
|
||||
<div class="umb-user-cards" ng-if="vm.activeLayout.path === '1' && vm.loading === false">
|
||||
<a href="" class="umb-user-card" ng-repeat="user in vm.users" ng-click="vm.clickUser(user)">
|
||||
<div class="umb-user-card__content" ng-class="{'umb-user-card__content--selected': user.selected}">
|
||||
<umb-badge class="umb-user-card__badge" size="xs" ng-if="user.userDisplayState.key !== 'Active'" color="{{user.userDisplayState.color}}">
|
||||
{{ user.userDisplayState.name }}
|
||||
</umb-badge>
|
||||
<div class="umb-user-card__avatar">
|
||||
<umb-avatar size="l" color="secondary" name="{{user.name}}" img-src="{{user.avatars[2]}}" img-srcset="{{user.avatars[3]}} 2x, {{user.avatars[4]}} 3x">
|
||||
</umb-avatar>
|
||||
</div>
|
||||
<div class="umb-user-card__checkmark" ng-class="{'umb-user-card__checkmark--visible': user.selected || vm.selection.length > 0 }"
|
||||
ng-click="vm.selectUser(user, vm.selection, $event)">
|
||||
<umb-checkmark ng-if="!user.isCurrentUser" checked="user.selected" size="s"></umb-checkmark>
|
||||
</div>
|
||||
<div class="umb-user-card__name" href="">{{user.name}}</div>
|
||||
<div class="umb-user-card__group">
|
||||
<span ng-repeat="userGroup in user.userGroups">{{ userGroup.name }}<span ng-if="!$last">, </span></span>
|
||||
</div>
|
||||
<div class="umb-user-card__last-login">
|
||||
<div ng-if="user.formattedLastLogin">
|
||||
<div>
|
||||
<localize key="user_lastLogin">Last login</localize>
|
||||
</div>
|
||||
{{ user.formattedLastLogin }}
|
||||
</div>
|
||||
<div ng-if="!user.formattedLastLogin">
|
||||
<div>{{ user.name | umbWordLimit:1 }}
|
||||
<localize key="user_noLogin">has not logged in yet</localize>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<umb-control-group label="@user_usergroup" description="@user_groupsHelp">
|
||||
<!-- Layout: Table -->
|
||||
<div ng-if="vm.activeLayout.path === '2'">
|
||||
|
||||
<umb-user-group-preview ng-repeat="group in vm.newUser.userGroups"
|
||||
icon="group.icon"
|
||||
name="group.name"
|
||||
sections="group.sections"
|
||||
content-start-node="group.contentStartNode"
|
||||
media-start-node="group.mediaStartNode"
|
||||
allow-remove="true"
|
||||
on-remove="vm.removeSelectedUserGroup($index, vm.newUser.userGroups)">
|
||||
</umb-user-group-preview>
|
||||
<table class="table table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="padding-left: 10px; width: 10px;">
|
||||
<a href="" style="text-decoration: none;" ng-click="vm.selectAll()">
|
||||
<umb-checkmark checked="vm.areAllSelected()" size="xs"></umb-checkmark>
|
||||
</a>
|
||||
</th>
|
||||
<th style="width: 70px;"></th>
|
||||
<th><localize key="general_name">Name</localize></th>
|
||||
<th><localize key="user_usergroup">User group</localize></th>
|
||||
<th><localize key="user_lastLogin">Last login</localize></th>
|
||||
<th><localize key="general_status">Status</localize></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-repeat="user in vm.users" ng-click="vm.clickUser(user)" style="cursor: pointer;" ng-mouseenter="user.hover = true" ng-mouseleave="user.hover = false">
|
||||
<td style="padding-left: 10px;">
|
||||
<div ng-if="!user.isCurrentUser" ng-click="vm.selectUser(user, vm.selection, $event)">
|
||||
<umb-checkmark
|
||||
ng-if="vm.selection.length > 0 || user.hover"
|
||||
checked="user.selected"
|
||||
size="xs">
|
||||
</umb-checkmark>
|
||||
</div>
|
||||
</td>
|
||||
<td scope="row">
|
||||
<umb-avatar
|
||||
size="xs"
|
||||
color="secondary"
|
||||
name="{{user.name}}"
|
||||
img-src="{{user.avatars[0]}}"
|
||||
img-srcset="{{user.avatars[1]}} 2x, {{user.avatars[2]}} 3x">
|
||||
</umb-avatar>
|
||||
</td>
|
||||
<td class="bold">{{user.name}}</td>
|
||||
<td><span ng-repeat="userGroup in user.userGroups">{{ userGroup.name }}<span ng-if="!$last">, </span></span></td>
|
||||
<td>{{ user.formattedLastLogin }}</td>
|
||||
<td style="text-transform: capitalize;">
|
||||
<umb-badge
|
||||
size="xs"
|
||||
ng-if="user.userDisplayState.key !== 'Active'"
|
||||
color="{{user.userDisplayState.color}}">
|
||||
{{ user.userDisplayState.name }}
|
||||
</umb-badge>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<a href=""
|
||||
style="max-width: 100%;"
|
||||
class="umb-node-preview-add"
|
||||
ng-click="vm.openUserGroupPicker($event)"
|
||||
prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</umb-control-group>
|
||||
<!-- Pagination -->
|
||||
<div ng-if="!vm.loading" class="flex justify-center">
|
||||
<umb-pagination
|
||||
ng-if="vm.usersOptions.totalPages"
|
||||
page-number="vm.usersOptions.pageNumber"
|
||||
total-pages="vm.usersOptions.totalPages"
|
||||
on-change="vm.changePageNumber(pageNumber)">
|
||||
</umb-pagination>
|
||||
</div>
|
||||
|
||||
<umb-control-group label="@general_message" ng-if="vm.usersViewState === 'inviteUser'" label-for="message">
|
||||
<textarea name="message"
|
||||
type="text"
|
||||
class="input-block-level"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_enterMessage"
|
||||
ng-model="vm.newUser.message"
|
||||
rows="4"
|
||||
required
|
||||
val-server-field="Message">
|
||||
</textarea>
|
||||
<span class="help-inline" val-msg-for="message" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="message" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
</div>
|
||||
|
||||
<umb-button ng-if="vm.usersViewState === 'inviteUser'"
|
||||
<!-- Add user -->
|
||||
<div ng-if="vm.usersViewState === 'inviteUser' || vm.usersViewState === 'createUser'">
|
||||
|
||||
<umb-editor-sub-header>
|
||||
<umb-editor-sub-header-content-left>
|
||||
<a class="umb-package-details__back-link" href="" ng-click="vm.setUsersViewState('overview');">← <localize key="user_backToUsers">Back to users</localize></a>
|
||||
</umb-editor-sub-header-content-left>
|
||||
</umb-editor-sub-header>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<form name="addUserForm" no-validate val-form-manager style="max-width: 500px;" class="block-form">
|
||||
<div>
|
||||
<div ng-if="vm.usersViewState === 'inviteUser'">
|
||||
<h3 class="bold" style="margin-bottom: 0;">
|
||||
<localize key="user_inviteUser">Invite User</localize>
|
||||
</h3>
|
||||
<p style="line-height: 1.6em; margin-bottom: 15px;">
|
||||
<localize key="user_inviteUserHelp"></localize>
|
||||
</p>
|
||||
</div>
|
||||
<div ng-if="vm.usersViewState === 'createUser'">
|
||||
<h3 class="bold" style="margin-bottom: 0;">
|
||||
<localize key="user_createUser">Create user</localize>
|
||||
</h3>
|
||||
<p style="line-height: 1.6em; margin-bottom: 15px;">
|
||||
<localize key="user_createUserHelp"></localize>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<umb-control-group label="@general_name" label-for="name">
|
||||
<input type="text" name="name" localize="placeholder" placeholder="@placeholders_entername" class="input-block-level" ng-model="vm.newUser.name"
|
||||
umb-auto-focus required val-server-field="Name" />
|
||||
<span class="help-inline" val-msg-for="name" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="name" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group label="@general_email" label-for="email">
|
||||
<input type="email" name="email" localize="placeholder" placeholder="@placeholders_enteremail" class="input-block-level"
|
||||
ng-model="vm.newUser.email" required val-email val-server-field="Email" />
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="email" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group label="@user_usergroup" description="@user_groupsHelp">
|
||||
|
||||
<umb-user-group-preview
|
||||
ng-repeat="group in vm.newUser.userGroups"
|
||||
icon="group.icon"
|
||||
name="group.name"
|
||||
sections="group.sections"
|
||||
content-start-node="group.contentStartNode"
|
||||
media-start-node="group.mediaStartNode"
|
||||
allow-remove="true"
|
||||
on-remove="vm.removeSelectedUserGroup($index, vm.newUser.userGroups)">
|
||||
</umb-user-group-preview>
|
||||
|
||||
<a href="" style="max-width: 100%;" class="umb-node-preview-add" ng-click="vm.openUserGroupPicker($event)" prevent-default>
|
||||
<localize key="general_add">Add</localize>
|
||||
</a>
|
||||
|
||||
</umb-control-group>
|
||||
|
||||
<umb-control-group label="@general_message" ng-if="vm.usersViewState === 'inviteUser'" label-for="message">
|
||||
<textarea
|
||||
name="message"
|
||||
type="text"
|
||||
class="input-block-level"
|
||||
localize="placeholder"
|
||||
placeholder="@placeholders_enterMessage"
|
||||
ng-model="vm.newUser.message"
|
||||
rows="4"
|
||||
required val-server-field="Message">
|
||||
</textarea>
|
||||
<span class="help-inline" val-msg-for="message" val-toggle-msg="required"><localize key="general_required">Required</localize></span>
|
||||
<span class="help-inline" val-msg-for="message" val-toggle-msg="valServerField"></span>
|
||||
</umb-control-group>
|
||||
|
||||
<umb-button
|
||||
ng-if="vm.usersViewState === 'inviteUser'"
|
||||
button-style="success"
|
||||
state="vm.page.createButtonState"
|
||||
type="button"
|
||||
action="vm.inviteUser(addUserForm)"
|
||||
label-key="user_sendInvite"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</umb-button>
|
||||
|
||||
<umb-button ng-if="vm.usersViewState === 'createUser'"
|
||||
<umb-button
|
||||
ng-if="vm.usersViewState === 'createUser'"
|
||||
button-style="success"
|
||||
state="vm.page.createButtonState"
|
||||
type="button"
|
||||
action="vm.createUser(addUserForm)"
|
||||
label-key="user_createUser"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</umb-button>
|
||||
|
||||
</form>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Create user success -->
|
||||
<div ng-if="vm.usersViewState === 'createUserSuccess'">
|
||||
<umb-editor-sub-header>
|
||||
<umb-editor-sub-header-content-left>
|
||||
<a class="umb-package-details__back-link" href="" ng-click="vm.setUsersViewState('overview');">← <localize key="user_backToUsers">Back to users</localize></a>
|
||||
</umb-editor-sub-header-content-left>
|
||||
</umb-editor-sub-header>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<div style="max-width: 500px;">
|
||||
<div class="flex items-center" style="margin-bottom: 15px;">
|
||||
<umb-checkmark
|
||||
checked="vm.usersViewState === 'createUserSuccess'"
|
||||
size="m">
|
||||
</umb-checkmark>
|
||||
<h3 class="bold" style="margin: 0 0 0 10px;">
|
||||
{{vm.newUser.name | umbWordLimit:1}} <localize key="user_userCreated">has been created</localize>
|
||||
</h3>
|
||||
</div>
|
||||
<p style="line-height: 1.6em; margin-bottom: 20px;"><localize key="user_userCreatedSuccessHelp"></localize></p>
|
||||
<div>
|
||||
</div>
|
||||
|
||||
<label class="bold">
|
||||
<localize key="user_password">Password</localize>
|
||||
</label>
|
||||
<!-- Create user success -->
|
||||
<div ng-if="vm.usersViewState === 'createUserSuccess'">
|
||||
|
||||
<umb-editor-sub-header>
|
||||
<umb-editor-sub-header-content-left>
|
||||
<a class="umb-package-details__back-link" href="" ng-click="vm.setUsersViewState('overview');">← <localize key="user_backToUsers">Back to users</localize></a>
|
||||
</umb-editor-sub-header-content-left>
|
||||
</umb-editor-sub-header>
|
||||
|
||||
<div class="flex items-center justify-between" style="background-color: #f3f3f5; padding: 10px 20px; border-radius: 3px; margin-bottom: 30px;">
|
||||
|
||||
<div ng-show="vm.newUser.showPassword">{{vm.newUser.resetPasswordValue}}</div>
|
||||
<div ng-show="!vm.newUser.showPassword">••••••••</div>
|
||||
<div class="flex justify-center">
|
||||
<div style="max-width: 500px;">
|
||||
|
||||
<!-- Success text -->
|
||||
<div class="flex items-center" style="margin-bottom: 15px;">
|
||||
<umb-checkmark
|
||||
checked="vm.usersViewState === 'createUserSuccess'"
|
||||
size="m">
|
||||
</umb-checkmark>
|
||||
<h3 class="bold" style="margin: 0 0 0 10px;">
|
||||
{{vm.newUser.name | umbWordLimit:1}}
|
||||
<localize key="user_userCreated">has been created</localize>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<umb-button
|
||||
ng-if="!vm.newUser.showPassword"
|
||||
type="button"
|
||||
action="vm.toggleNewUserPassword()"
|
||||
label-key="general_show"
|
||||
size="xs">
|
||||
</umb-button>
|
||||
<p style="line-height: 1.6em; margin-bottom: 20px;"><localize key="user_userCreatedSuccessHelp"></localize></p>
|
||||
|
||||
<!-- New password -->
|
||||
<div>
|
||||
<label class="bold"><localize key="user_password">Password</localize></label>
|
||||
<div class="flex items-center justify-between" style="background-color: #f3f3f5; padding: 10px 20px; border-radius: 3px; margin-bottom: 30px;">
|
||||
<div ng-show="vm.newUser.showPassword">{{vm.newUser.resetPasswordValue}}</div>
|
||||
<div ng-show="!vm.newUser.showPassword">••••••••</div>
|
||||
<div>
|
||||
<umb-button
|
||||
ng-if="!vm.newUser.showPassword"
|
||||
type="button"
|
||||
action="vm.toggleNewUserPassword()"
|
||||
label-key="general_show"
|
||||
size="xs">
|
||||
</umb-button>
|
||||
<umb-button
|
||||
ng-if="vm.newUser.showPassword"
|
||||
type="button"
|
||||
action="vm.toggleNewUserPassword()"
|
||||
label-key="general_hide"
|
||||
size="xs">
|
||||
</umb-button>
|
||||
<umb-button
|
||||
ng-if="vm.newUser.resetPasswordValue"
|
||||
umb-clipboard
|
||||
umb-clipboard-success="vm.copySuccess()"
|
||||
umb-clipboard-error="vm.copyError()"
|
||||
umb-clipboard-text="vm.newUser.resetPasswordValue"
|
||||
state="vm.page.copyPasswordButtonState"
|
||||
type="button"
|
||||
label-key="general_copy" size="xs">
|
||||
</umb-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<umb-button
|
||||
ng-if="vm.newUser.showPassword"
|
||||
type="button"
|
||||
action="vm.toggleNewUserPassword()"
|
||||
label-key="general_hide"
|
||||
size="xs">
|
||||
</umb-button>
|
||||
|
||||
<umb-button
|
||||
ng-if="vm.newUser.resetPasswordValue"
|
||||
umb-clipboard
|
||||
umb-clipboard-success="vm.copySuccess()"
|
||||
umb-clipboard-error="vm.copyError()"
|
||||
umb-clipboard-text="vm.newUser.resetPasswordValue"
|
||||
state="vm.page.copyPasswordButtonState"
|
||||
type="button"
|
||||
label-key="general_copy"
|
||||
size="xs">
|
||||
</umb-button>
|
||||
<!-- actions -->
|
||||
<div>
|
||||
<umb-button
|
||||
type="button" button-style="info"
|
||||
label-key="user_createAnotherUser"
|
||||
action="vm.setUsersViewState('createUser');"
|
||||
size="m">
|
||||
</umb-button>
|
||||
<umb-button
|
||||
type="button"
|
||||
button-style="success"
|
||||
label-key="user_goToProfile"
|
||||
action="vm.goToUser(vm.newUser.id);"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div>
|
||||
<umb-button type="button"
|
||||
button-style="info"
|
||||
label-key="user_createAnotherUser"
|
||||
action="vm.setUsersViewState('createUser');"
|
||||
size="m">
|
||||
</umb-button>
|
||||
<umb-button type="button"
|
||||
button-style="success"
|
||||
label-key="user_goToProfile"
|
||||
action="vm.goToUser(vm.newUser.id);"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<umb-overlay ng-if="vm.userGroupPicker.show"
|
||||
model="vm.userGroupPicker"
|
||||
view="vm.userGroupPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
<!-- Invite user success -->
|
||||
<div ng-if="vm.usersViewState === 'inviteUserSuccess'">
|
||||
<umb-editor-sub-header>
|
||||
<umb-editor-sub-header-content-left>
|
||||
<a class="umb-package-details__back-link" href="" ng-click="vm.setUsersViewState('overview');">← <localize key="user_backToUsers">Back to users</localize></a>
|
||||
</umb-editor-sub-header-content-left>
|
||||
</umb-editor-sub-header>
|
||||
|
||||
<div class="flex justify-center">
|
||||
<div style="max-width: 500px;">
|
||||
|
||||
<!-- Success text -->
|
||||
<div class="flex items-center" style="margin-bottom: 15px;">
|
||||
<umb-checkmark
|
||||
checked="vm.usersViewState === 'inviteUserSuccess'"
|
||||
size="m">
|
||||
</umb-checkmark>
|
||||
<h3 class="bold" style="margin: 0 0 0 10px;">
|
||||
{{vm.newUser.name | umbWordLimit:1}}
|
||||
<localize key="user_userInvited">has been created</localize>
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<p style="line-height: 1.6em; margin-bottom: 20px;"><localize key="user_userInvitedSuccessHelp"></localize></p>
|
||||
|
||||
<!-- actions -->
|
||||
<div>
|
||||
<umb-button
|
||||
type="button" button-style="info"
|
||||
label-key="user_inviteAnotherUser"
|
||||
action="vm.setUsersViewState('inviteUser');"
|
||||
size="m">
|
||||
</umb-button>
|
||||
<umb-button
|
||||
type="button"
|
||||
button-style="success"
|
||||
label-key="user_goToProfile"
|
||||
action="vm.goToUser(vm.newUser.id);"
|
||||
size="m">
|
||||
</umb-button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<umb-overlay
|
||||
ng-if="vm.userGroupPicker.show"
|
||||
model="vm.userGroupPicker"
|
||||
view="vm.userGroupPicker.view"
|
||||
position="right">
|
||||
</umb-overlay>
|
||||
|
||||
</div>
|
||||
@@ -1523,6 +1523,7 @@ To manage your website, simply open the Umbraco back office and start adding con
|
||||
<key alias="excerptField">Excerpt field</key>
|
||||
<key alias="goToProfile">Go to user profile</key>
|
||||
<key alias="groupsHelp">Add groups to assign access and permissions</key>
|
||||
<key alias="inviteAnotherUser">Invite another user</key>
|
||||
<key alias="inviteUserHelp">Invite new users to give them access to Umbraco. An invite email will be sent to the user with information on how to log in to Umbraco.</key>
|
||||
<key alias="language">Language</key>
|
||||
<key alias="languageHelp">Set the language you will see in menus and dialogs</key>
|
||||
@@ -1569,6 +1570,8 @@ To manage your website, simply open the Umbraco back office and start adding con
|
||||
<key alias="userGroupPermissions">User group permissions</key>
|
||||
<key alias="usergroup">User group</key>
|
||||
<key alias="userGroups">User groups</key>
|
||||
<key alias="userInvited">has been invited</key>
|
||||
<key alias="userInvitedSuccessHelp">An invitation has been sent to the new user with details about how to log in to Umbraco.</key>
|
||||
<key alias="writer">Writer</key>
|
||||
<key alias="translator">Translator</key>
|
||||
<key alias="change">Change</key>
|
||||
|
||||
@@ -383,7 +383,7 @@ Możesz dodać dodatkowe języki w menu "Języki" po lewej stronie.]]></key>
|
||||
<key alias="allPropTypes">Wszystkie typy właściwości & dane właściwości</key>
|
||||
<key alias="willBeDeleted">używające tego typu danych zostaną usunięte na zawsze, potwierdź, że chcesz je także usunąć</key>
|
||||
<key alias="yesDelete">Tak, usuń</key>
|
||||
<key alias="andAllRelated">i wszystkie typy właściwości & dane właściwości używające tego typu danych/key>
|
||||
<key alias="andAllRelated">i wszystkie typy właściwości & dane właściwości używające tego typu danych</key>
|
||||
<key alias="selectFolder">Wybierz folder do przeniesienia</key>
|
||||
<key alias="inTheTree">do w strukturze drzewa poniżej</key>
|
||||
<key alias="wasMoved">został przeniesiony poniżej</key>
|
||||
@@ -815,7 +815,7 @@ Naciśnij przycisk <strong>instaluj</strong>, aby zainstalować bazę danych Umb
|
||||
<key alias="notifications">Powiadomienie</key>
|
||||
</area>
|
||||
<area alias="packager">
|
||||
<key alias="chooseLocalPackageText"><!CDATA[
|
||||
<key alias="chooseLocalPackageText"><![CDATA[
|
||||
Wskaż pakiet z Twojego komputera, poprzez kliknięcie na przycisk "Przeglądaj"<br />
|
||||
i wskaż gdzie jest zapisany. Pakiety Umbraco przeważnie posiadają rozszerzenie ".umb" lub ".zip".
|
||||
]]></key>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Umbraco.Web.Models.ContentEditing
|
||||
@@ -8,7 +9,7 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
/// Represents the data used to invite a user
|
||||
/// </summary>
|
||||
[DataContract(Name = "user", Namespace = "")]
|
||||
public class UserInvite : EntityBasic
|
||||
public class UserInvite : EntityBasic, IValidatableObject
|
||||
{
|
||||
[DataMember(Name = "userGroups")]
|
||||
[Required]
|
||||
@@ -21,6 +22,11 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
|
||||
[DataMember(Name = "message")]
|
||||
public string Message { get; set; }
|
||||
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
if (UserGroups.Any() == false)
|
||||
yield return new ValidationResult("A user must be assigned to at least one group", new[] { "UserGroups" });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
using System.Linq;
|
||||
using System.Runtime.Serialization;
|
||||
|
||||
namespace Umbraco.Web.Models.ContentEditing
|
||||
@@ -47,11 +48,8 @@ namespace Umbraco.Web.Models.ContentEditing
|
||||
|
||||
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
||||
{
|
||||
//TODO: Add other server side validation
|
||||
//if (CultureInfo.GetCultureInfo(Culture))
|
||||
// yield return new ValidationResult("The culture is invalid", new[] { "Culture" });
|
||||
|
||||
yield break;
|
||||
if (UserGroups.Any() == false)
|
||||
yield return new ValidationResult("A user must be assigned to at least one group", new[] { "UserGroups" });
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user