diff --git a/zero.Core/Api/LanguagesApi.cs b/zero.Core/Api/LanguagesApi.cs index 7bd6a386..6a050d7e 100644 --- a/zero.Core/Api/LanguagesApi.cs +++ b/zero.Core/Api/LanguagesApi.cs @@ -31,16 +31,22 @@ namespace zero.Core.Api } + /// + public async Task> GetByIds(params string[] ids) + { + return await GetByIds(ids); + } + + /// public async Task> GetAll() { - using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) - { - return await session.Query() - .Scope(Scope) - .OrderByDescending(x => x.CreatedDate) - .ToListAsync(); - } + using IAsyncDocumentSession session = Raven.OpenAsyncSession(); + + return await session.Query() + .Scope(Scope) + .OrderByDescending(x => x.CreatedDate) + .ToListAsync(); } @@ -66,12 +72,9 @@ namespace zero.Core.Api { query.SearchFor(entity => entity.Name); - using (IAsyncDocumentSession session = Raven.OpenAsyncSession()) - { - return await session.Query() - .Scope(Scope) - .ToQueriedListAsync(query); - } + using IAsyncDocumentSession session = Raven.OpenAsyncSession(); + + return await session.Query().Scope(Scope).ToQueriedListAsync(query); } @@ -97,6 +100,11 @@ namespace zero.Core.Api /// Task GetById(string id); + /// + /// Get countries by ids + /// + Task> GetByIds(params string[] ids); + /// /// Get all available languages /// diff --git a/zero.Core/Entities/Language.cs b/zero.Core/Entities/Language.cs index 6469a60a..1f3ee8e7 100644 --- a/zero.Core/Entities/Language.cs +++ b/zero.Core/Entities/Language.cs @@ -13,6 +13,9 @@ namespace zero.Core.Entities /// public bool IsDefault { get; set; } + /// + public bool IsOptional { get; set; } + /// public string InheritedLanguageId { get; set; } } @@ -30,6 +33,11 @@ namespace zero.Core.Entities /// bool IsDefault { get; set; } + /// + /// Whether this language is optional and does not have to be filled out + /// + bool IsOptional { get; set; } + /// /// If this language is inherited it gets all missing properties from its parent /// diff --git a/zero.Web.UI/App/components/forms/toggle.vue b/zero.Web.UI/App/components/forms/toggle.vue index feca30af..fc09e710 100644 --- a/zero.Web.UI/App/components/forms/toggle.vue +++ b/zero.Web.UI/App/components/forms/toggle.vue @@ -99,11 +99,11 @@ transform: translateX(14px); } - .is-primary & + /*.is-primary & { background: var(--color-primary); box-shadow: 0 0 0 4px var(--color-primary-low); - } + }*/ } } diff --git a/zero.Web.UI/App/editor/fields/language.vue b/zero.Web.UI/App/editor/fields/language.vue new file mode 100644 index 00000000..0e1c3eea --- /dev/null +++ b/zero.Web.UI/App/editor/fields/language.vue @@ -0,0 +1,47 @@ + + + + \ No newline at end of file diff --git a/zero.Web.UI/App/renderers/language.js b/zero.Web.UI/App/renderers/language.js index 3e47c6ff..f8109488 100644 --- a/zero.Web.UI/App/renderers/language.js +++ b/zero.Web.UI/App/renderers/language.js @@ -20,11 +20,20 @@ }, { field: 'code', - display: 'text' + display: 'text', + required: true + }, + { + field: 'inheritedLanguageId', + display: 'language' }, { field: 'isDefault', display: 'toggle' + }, + { + field: 'isOptional', + display: 'toggle' } ] }; \ No newline at end of file diff --git a/zero.Web.UI/App/resources/languages.js b/zero.Web.UI/App/resources/languages.js index ce00def4..d72a7951 100644 --- a/zero.Web.UI/App/resources/languages.js +++ b/zero.Web.UI/App/resources/languages.js @@ -32,6 +32,16 @@ export default { return Axios.get('languages/getSupportedCultures').then(res => Promise.resolve(res.data)); }, + getPreviews(ids) + { + return Axios.get('languages/getPreviews', { params: { ids } }).then(res => Promise.resolve(res.data)); + }, + + getForPicker() + { + return Axios.get('languages/getForPicker').then(res => Promise.resolve(res.data)); + }, + // save a language save(model) { diff --git a/zero.Web.UI/Sass/Core/_forms.scss b/zero.Web.UI/Sass/Core/_forms.scss index 575df9c8..9e42d9ba 100644 --- a/zero.Web.UI/Sass/Core/_forms.scss +++ b/zero.Web.UI/Sass/Core/_forms.scss @@ -61,6 +61,7 @@ textarea -webkit-appearance: none; border: none; font-size: var(--font-size); + background: none; } &:after diff --git a/zero.Web/Controllers/LanguagesController.cs b/zero.Web/Controllers/LanguagesController.cs index eecae652..2734ea11 100644 --- a/zero.Web/Controllers/LanguagesController.cs +++ b/zero.Web/Controllers/LanguagesController.cs @@ -1,4 +1,6 @@ using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using zero.Core.Api; using zero.Core.Entities; @@ -49,6 +51,25 @@ namespace zero.Web.Controllers public IActionResult GetSupportedCultures() => Json(Api.GetAllCultures(Options.SupportedLanguages)); + public async Task GetForPicker() => Json((await Api.GetAll()).Select(x => new SelectModel() + { + Id = x.Id, + Name = x.Name, + IsActive = x.IsActive + })); + + + public async Task GetPreviews(List ids) + { + return JsonPreviews(await Api.GetByIds(ids.ToArray()), item => new PreviewModel() + { + Id = item.Id, + Icon = "fth-globe", + Name = item.Name + }); + } + + /// /// Save language /// diff --git a/zero.Web/Resources/Localization/zero.en-us.json b/zero.Web/Resources/Localization/zero.en-us.json index 25fce9df..d2323173 100644 --- a/zero.Web/Resources/Localization/zero.en-us.json +++ b/zero.Web/Resources/Localization/zero.en-us.json @@ -331,7 +331,9 @@ "code_text": "Code in ISO 3166-1 format", "isDefault": "Default", "isDefault_text": "Use as default language", - "inheritedLanguageId": "Inherit from", + "isOptional": "Optional", + "isOptional_text": "Values for an optional language must not be entered, even if the field is required", + "inheritedLanguageId": "Fallback", "inheritedLanguageId_text": "To allow multi-lingual content to fall back to another language if not present in the requested language, select it here" } },