diff --git a/zero.Web.UI/App/components/forms/alias.vue b/zero.Web.UI/App/components/forms/alias.vue
new file mode 100644
index 00000000..3d25d5cc
--- /dev/null
+++ b/zero.Web.UI/App/components/forms/alias.vue
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/zero.Web.UI/App/components/forms/form-header.vue b/zero.Web.UI/App/components/forms/form-header.vue
index e4678f89..d871ba5e 100644
--- a/zero.Web.UI/App/components/forms/form-header.vue
+++ b/zero.Web.UI/App/components/forms/form-header.vue
@@ -3,6 +3,7 @@
@@ -58,6 +59,10 @@
activeToggle: {
type: Boolean,
default: false
+ },
+ hasAlias: {
+ type: Boolean,
+ default: true
}
},
@@ -118,6 +123,11 @@
}
}
+ .ui-header-bar-title
+ {
+ position: relative;
+ }
+
input[type="text"].ui-form-header-title-input
{
font-family: var(--font);
@@ -132,4 +142,17 @@
border: 1px dashed var(--color-text-dim-one);
}*/
}
+
+ .ui-form-header-title-alias
+ {
+ position: absolute;
+ right: 10px;
+ top: 11px;
+ z-index: 2;
+
+ .ui-alias-lock
+ {
+ background: none;
+ }
+ }
\ No newline at end of file
diff --git a/zero.Web.UI/App/editor/fields/alias.vue b/zero.Web.UI/App/editor/fields/alias.vue
new file mode 100644
index 00000000..4849bf88
--- /dev/null
+++ b/zero.Web.UI/App/editor/fields/alias.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/zero.Web.UI/App/renderers/country.js b/zero.Web.UI/App/renderers/country.js
index d2332077..180ab20d 100644
--- a/zero.Web.UI/App/renderers/country.js
+++ b/zero.Web.UI/App/renderers/country.js
@@ -19,6 +19,12 @@
required: true,
maxLength: 120
},
+ {
+ field: 'alias',
+ display: 'alias',
+ label: '@ui.alias',
+ required: true
+ },
{
field: 'code',
display: 'text',
diff --git a/zero.Web.UI/App/resources/utils.js b/zero.Web.UI/App/resources/utils.js
new file mode 100644
index 00000000..472e8f4e
--- /dev/null
+++ b/zero.Web.UI/App/resources/utils.js
@@ -0,0 +1,11 @@
+import Axios from 'axios';
+
+const base = 'utils/';
+
+export default {
+
+ generateAlias(name)
+ {
+ return Axios.get(base + 'generateAlias', { params: { name } }).then(res => Promise.resolve(res.data));
+ }
+};
\ No newline at end of file
diff --git a/zero.Web/Controllers/UtilsController.cs b/zero.Web/Controllers/UtilsController.cs
new file mode 100644
index 00000000..b1999e3c
--- /dev/null
+++ b/zero.Web/Controllers/UtilsController.cs
@@ -0,0 +1,13 @@
+using Microsoft.AspNetCore.Mvc;
+using zero.Core.Api;
+
+namespace zero.Web.Controllers
+{
+ public class UtilsController : BackofficeController
+ {
+ ///
+ /// Generate alias from name
+ ///
+ public IActionResult GenerateAlias([FromQuery] string name) => Json(Safenames.Alias(name));
+ }
+}
diff --git a/zero.Web/Resources/Localization/zero.en-us.json b/zero.Web/Resources/Localization/zero.en-us.json
index 2c3ad997..35a1c04f 100644
--- a/zero.Web/Resources/Localization/zero.en-us.json
+++ b/zero.Web/Resources/Localization/zero.en-us.json
@@ -22,6 +22,7 @@
"delete": "Delete",
"default": "Default",
"remove": "Remove",
+ "alias": "Alias",
"pagination": {
"xofy": "Page {x} of {y}",
"next": "Next page",