Merge remote-tracking branch 'origin/dev' into config-panel

This commit is contained in:
ljf 2021-09-12 16:52:09 +02:00
commit 41a8367f21
19 changed files with 403 additions and 57 deletions

View file

@ -38,8 +38,8 @@ import { openWebSocket, getResponseData, handleError } from './handlers'
* @param {Boolean} [options.addLocale=false] - Option to append the locale to the query string.
* @return {URLSearchParams}
*/
export function objectToParams (obj, { addLocale = false } = {}) {
const urlParams = new URLSearchParams()
export function objectToParams (obj, { addLocale = false } = {}, formData = false) {
const urlParams = (formData) ? new FormData() : new URLSearchParams()
for (const [key, value] of Object.entries(obj)) {
if (Array.isArray(value)) {
value.forEach(v => urlParams.append(key, v))
@ -96,7 +96,7 @@ export default {
if (method === 'GET') {
uri += `${uri.includes('?') ? '&' : '?'}locale=${store.getters.locale}`
} else {
options = { ...options, method, body: objectToParams(data, { addLocale: true }) }
options = { ...options, method, body: objectToParams(data, { addLocale: true }, true) }
}
const response = await fetch('/yunohost/api/' + uri, options)

View file

@ -89,6 +89,9 @@ export default {
::v-deep .btn {
margin-left: .5rem;
&.dropdown-toggle-split {
margin-left: 0;
}
}
}
}

View file

@ -11,7 +11,11 @@
:required="required"
:placeholder="_placeholder"
:accept="accept"
:drop-placeholder="dropPlaceholder"
:state="state"
:browse-text="$t('words.browse')"
@blur="$parent.$emit('touch', name)"
@focusout.native="$parent.$emit('touch', name)"
/>
</b-button-group>
</template>
@ -30,7 +34,9 @@ export default {
id: { type: String, default: null },
value: { type: [File, null], default: null },
placeholder: { type: String, default: 'Choose a file or drop it here...' },
dropPlaceholder: { type: String, default: null },
accept: { type: String, default: null },
state: { type: Boolean, default: null },
required: { type: Boolean, default: false },
name: { type: String, default: null }
},

View file

@ -4,6 +4,18 @@ import { helpers } from 'vuelidate/lib/validators'
// Unicode ranges are taken from https://stackoverflow.com/a/37668315
const nonAsciiWordCharacters = '\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC'
/**
* Turns a comma separated list of media types to a its equivalent file extension.
*
* @param {String} types - a comma separated list of media like `text/csv, application/json`.
* @return {String} a comma separated list of media extension like `.csv, .json`.
*/
function mediaTypeToExt (types) {
return types.split(', ').map(type => {
return '.' + type.split('/')[1]
}).join(', ')
}
const alphalownum_ = helpers.regex('alphalownum_', /^[a-z0-9_]+$/)
@ -34,6 +46,13 @@ const emailForward = value => helpers.withParams(
}
)(value)
// Refer to IANA Media Types (https://www.iana.org/assignments/media-types/media-types.xhtml)
// for a complete list of standard media types.
const fileMediaTypeMatch = acceptedTypes => file => helpers.withParams(
{ type: 'fileMediaTypeMatch', arg: mediaTypeToExt(acceptedTypes), value: file.type },
file => !helpers.req(file) || acceptedTypes.includes(file.type)
)(file)
const githubLink = helpers.regex('githubLink', /^https:\/\/github.com\/[a-zA-Z0-9-_.]+\/[a-zA-Z0-9-_.]+[/]?$/)
const includes = items => item => helpers.withParams(
@ -56,6 +75,7 @@ export {
emailForward,
emailForwardLocalPart,
emailLocalPart,
fileMediaTypeMatch,
githubLink,
includes,
name,

View file

@ -304,7 +304,7 @@
"operation_failed_explanation": "Die Operation ist fehlgeschlagen! Das tut uns leid :( Sie können Sich <a href='https://yunohost.org/help'>hier Hilfe holen</a>. Bitte stellen Sie *die ganzen Logs* der Operation bereit, damit Ihnen besser geholfen werden kann. Dies tun Sie, indem Sie auf den grünen 'mit Yunopaste teilen' Knopf drücken. Wenn Sie die Logs teilen, wird Yunohost automatisch versuchen Ihre privaten Daten wie Domainnamen und IP's zu anonymisieren.",
"diagnosis_explanation": "Die Diagnose Funktion wird versuchen, gängige Probleme in verschiedenen Teilen deines Servers zu finden, damit alles reibungslos läuft. Die Diagnose wird auch automatisch zweimal täglich ausgeführt, falls Fehler gefunden werden, bekommt der Administrator ein E-Mail. Beachte, dass einige tests nicht relevant sind, wenn du einzelne Features (zum Beispiel XMPP) nicht benutzt oder du ein komplexes Setup hast. In diesem Fall und wenn du weisst was du tust ist es in Ordnung die dazugehoerigen Warnungen und Hinweise zu ignorieren.",
"pending_migrations": "Es gibt einige ausstehende Migrationen, die darauf warten, ausgeführt zu werden. Bitte gehen Sie auf <a href='#/tools/migrations'>Werkzeuge > Migrationen</a> um diese auszuführen.",
"tip_about_user_email": "Benutzer:innen werden mit einer verknüpften E-Mail-Adresse (und XMPP Account) erstellt im Format username@domain.tld. Zusätzliche E-Mail-Aliasse and E-Mail-Weiterleitungen können später durch den/die Admin und Benutzer*in hinzugefügt werden.",
"tip_about_user_email": "Benutzer:innen werden mit einer verknüpften E-Mail-Adresse (und XMPP Account) erstellt im Format username@domain.tld. Zusätzliche E-Mail-Aliasse and E-Mail-Weiterleitungen können später durch den/die Admin und Benutzer:in hinzugefügt werden.",
"logs_suboperations": "Unter-Operationen",
"api_errors_titles": {
"APIBadRequestError": "Es ist ein Fehler in Yunohost aufgetreten",
@ -409,7 +409,7 @@
"notInUsers": "Der/die Benutzer:in '{value}' existiert bereits.",
"minValue": "Der Wert muss eine Zahl sein, die gleich oder größer als {min} ist.",
"name": "Namen dürfen keine Sonderzeichen außer <code>, .'- </code> enthalten",
"githubLink": "Die URL muss ein gültiger Github-Link zu einem Repository sein",
"githubLink": "Die URL muss ein gültiger GitHub-Link zu einem Repository sein",
"emailForward": "Ungültige E-Mail-Weiterleitung: Sie darf nur aus alphanumerischen Zeichen und <code> _.-+</code> bestehen (z. B. jemand+tag@example.com, s0me-1+tag@example.com)",
"email": "Ungültige E-Mail: Sie darf nur aus alphanumerischen Zeichen und <code> _.-</code> bestehen (z. B. jemand@example.com, s0me-1@example.com)",
"dynDomain": "Ungültiger Domainname: Er darf nur aus alphanumerischen Kleinbuchstaben und Bindestrichen bestehen",

View file

@ -172,8 +172,9 @@
"dynDomain": "Invalid domain name: Must be lower-case alphanumeric and dash characters only",
"email": "Invalid email: must be alphanumeric and <code>_.-</code> characters only (e.g. someone@example.com, s0me-1@example.com)",
"emailForward": "Invalid email forward: must be alphanumeric and <code>_.-+</code> characters only (e.g. someone+tag@example.com, s0me-1+tag@example.com)",
"githubLink": "Url must be a valid Github link to a repository",
"name": "Names may not include special characters except <code> ,.'-</code>",
"fileMediaTypeMatch": "Invalid file type: must be <code>{arg}</code>.",
"githubLink": "URL must be a valid GitHub link to a repository",
"name": "Names may not includes special characters except <code> ,.'-</code>",
"minValue": "Value must be a number equal or greater than {min}.",
"maxValue": "Value must be a number equal or lesser than {max}.",
"notInUsers": "The user '{value}' already exists.",
@ -296,7 +297,8 @@
"firstname": "John",
"lastname": "Doe",
"groupname": "My group name",
"domain": "my-domain.com"
"domain": "my-domain.com",
"file": "Browse a file or drag and drop it"
},
"logs": "Logs",
"logs_suboperations": "Sub-operations",
@ -322,7 +324,8 @@
"port": "Port",
"ports": "Ports",
"postinstall": {
"force": "Force the post-install"
"force": "Force the post-install",
"title": "Postinstall"
},
"postinstall_domain": "This is the first domain name linked to your YunoHost server, but also the one which will be used by your server's users to access the authentication portal. Accordingly, it will be visible by everyone, so choose it carefully.",
"postinstall_intro_1": "Congratulations! YunoHost has been successfully installed.",
@ -492,14 +495,26 @@
"users": "Users",
"users_new": "New user",
"users_no": "No users.",
"users_import": "Import users",
"users_export": "Export users",
"users_import_csv_file": "CSV File",
"users_import_update": "Update existing users",
"users_import_delete": "Delete non listed users",
"users_import_csv_file_desc": "The CSV file should be in UTF-8 and with columns username, password, groups, email and quota. For an example import CSV file, you can <a href='/yunohost/api/users/export' target='_BLANK'>export your users in CSV file</a> and change the file.",
"users_import_update_desc": "If checked, all existing users contained in the CSV file will be updated with the new value",
"users_import_delete_desc": "If checked, all existing users that are not in the CSV file will be deleted (and purged).",
"users_import_confirm_destructive": "Are you sure you want to delete users that are not present in this file?",
"users_import_delete_others": "Delete unlisted users",
"version": "Version",
"warnings": "{count} warnings",
"words": {
"browse": "Browse",
"collapse": "Collapse",
"default": "Default"
},
"wrong_password": "Wrong password",
"yes": "Yes",
"yunohost_admin": "YunoHost Admin",
"certificate_alert_not_valid": "CRITICAL: Current certificate is not valid! HTTPS won't work at all!",
"certificate_alert_selfsigned": "WARNING: Current certificate is self-signed. Browsers will display a spooky warning to new visitors!",
"certificate_alert_letsencrypt_about_to_expire": "Current certificate is about to expire. It should soon be renewed automatically.",

View file

@ -2,15 +2,15 @@
"api_error": {
"error_message": "پیغام خطا :",
"view_error": "مشاهده خطا",
"sorry": "از این بابت واقعاً متاسفم.",
"server_said": "هنگام پردازش و اجرای دستورات ، سرور مذکور:",
"sorry": "واقعاً از این بابت متاسفم.",
"server_said": "هنگام پردازش و اجرای دستورات ، سمت سرور:",
"info": "اطلاعات زیر ممکن است برای شخصی که به شما کمک می کند مفید باشد :",
"help": "برای دریافت کمک شما بایدببینید<a href=\"https://forum.yunohost.org/\">انجمن تخصصی</a> یا <a href=\"https://chat.yunohost.org/\">گفتگوی آنلاین</a>و برای برطرف کردن مشکلات و یا گزارش اشکال و خطا مراجعه کنید به آدرس<a href=\"https://github.com/YunoHost/issues\"> ردگیری باگ و خطا</a>."
},
"api": {
"query_status": {
"warning": "با خطا یا هشدار با موفقیت انجام شد",
"success": "با موفقیت انجام شد",
"success": "با موفقیّت انجام شد",
"pending": "در حال پیش رفت",
"error": "ناموفّق"
},
@ -33,12 +33,12 @@
"api_not_found": "به نظر می رسد مدیر وب سعی کرده است از چیزی که وجود ندارد پرس و جو کند.",
"all_apps": "همه اپلیکیشن ها",
"api_errors_titles": {
"APIConnexionError": "سیستم با خطای اتصال مواجه شده",
"APINotRespondingError": "رابط کاربری سیستم پاسخ نمی دهد",
"APINotFoundError": "رابط کاربری سیستم نتوانست مسیری را پیدا کند",
"APIInternalError": "سیستم با خطای داخلی مواجه شده",
"APIBadRequestError": "سیستم با خطا مواجه شده",
"APIError": "سیستم با خطای غیر منتظره ای روبرو شده"
"APIConnexionError": "سیستم YunoHost با خطای اتصال مواجه شده",
"APINotRespondingError": "رابط کاربری سیستم YunoHost پاسخ نمی دهد",
"APINotFoundError": "رابط کاربری سیستم YunoHost نتوانست مسیری را پیدا کند",
"APIInternalError": "سیستم YunoHost با خطای داخلی مواجه شده",
"APIBadRequestError": "سیستم YunoHost با خطا مواجه شده",
"APIError": "سیستم YunoHost با خطای غیر منتظره ای روبرو شده"
},
"form_errors": {
"name": "اسامی نبایدشامل کاراکتر های خاص باشند! بغیر از:<code> ,.'-</code>",
@ -98,7 +98,7 @@
"diagnosis_first_run": "ویژگی عیب یابی سعی می کند مسائل رایج در جنبه های مختلف سرور شما را شناسایی کند تا مطمئن شوید همه چیز بدون مشکل اجرا می شود. لطفاً اگر بلافاصله پس از راه اندازی سرور خطاهای زیادی را مشاهده کردید نگران نشوید : این دقیقاً به منظور کمک به شناسایی و تشخیص مشکلات و راهنمایی شما برای رفع آنها است. همچنین عیب یابی سیستم ، دو بار در روز بطور خودکار انجام می شود و در صورت وجود هرگونه مشکلی، ایمیل و ابلاغ به مدیر سیستم ارسال می شود.",
"diagnosis_experimental_disclaimer": "توجه داشته باشید که ویژگی عیب یابی سیستم هنوز آزمایشی است و در حال اصلاح است و ممکن است کاملاً قابل اعتماد نباشد.",
"diagnosis": "عیب یابی",
"domain_dns_conf_is_just_a_recommendation": "این صفحه پیکربندی * توصیه شده * را به شما نشان می دهد. برای شما سیستم نام دامنه DNS را پیکربندی *نمی کند*. پیکربندی منطقه سیستم نام دامنه مطابق این توصیه در ثبت کننده سیستم نام دامنه خود، بعهده شماست.",
"domain_dns_conf_is_just_a_recommendation": "این صفحه پیکربندی * توصیه شده * را به شما نشان می دهد. برای شما سرور نام دامنه را پیکربندی *نمی کند*. این بعهده شماست که مطابق این پیکره بندی توصیه شده ، منطقه سرور نام دامنه خود را در ثبت کننده نام دامنه خود پیکربندی کنید.",
"details": "جزئیات",
"description": "شرح",
"delete": "حذف",
@ -166,8 +166,8 @@
"app_choose_category": "یک دسته را انتخاب کنید",
"app_actions_label": "اجراءکردن اقدامات",
"app_actions": "اقدامات",
"api_waiting": "منتظر پاسخ سِرورها باشید...",
"api_not_responding": "رابط کاربری سیستم پاسخ نمی دهد، شاید 'yunohost-api' خاموش و یا راه اندازی مجدد شده؟",
"api_waiting": "در انتظار پاسخ سِرورها...",
"api_not_responding": "رابط کاربری سیستم YunoHost پاسخ نمی دهد، شاید 'yunohost-api' خاموش و یا راه اندازی مجدد شده؟",
"purge_user_data_warning": "پاکسازی داده های کاربر برگشت پذیر نیست. مطمئن باشید که می دانید چه می کنید!",
"purge_user_data_checkbox": "داده های {name} پاک شود؟ (با این کار محتوای فهرست های خانه و ایمیل آن حذف می شود.)",
"revert_to_selfsigned_cert": "بازگشت به گواهی خود امضا شده",
@ -177,11 +177,11 @@
"manually_renew_letsencrypt": "اکنون به صورت دستی تمدید کنید",
"manually_renew_letsencrypt_message": "گواهینامه بطور خودکار تمدید می شود پس از طی 15 روز اعتبار. در صورت تمایل می توانید آن را به صورت دستی تمدید کنید. (توصیه نمیشود).",
"install_letsencrypt_cert": "نصب گواهینامه اجازه رمزنگاری",
"domain_not_eligible_for_ACME": "به نظر می رسد این دامنه برای گواهی اجازه رمزنگاری آماده نیست. لطفا پیکربندی DNS و قابلیت دسترسی سرور HTTP خود را بررسی کنید. بخش 'DNS records' و بخش 'Web' در <a href='#/diagnosis'>صفحه تشخیص عیب یابی</a> می تواند به شما کمک کند بفهمید چه چیزی اشتباه تنظیم شده است.",
"domain_not_eligible_for_ACME": "به نظر می رسد این دامنه برای گواهی اجازه رمزنگاری آماده نیست. لطفا پیکربندی DNS و قابلیت دسترسی سرور HTTP خود را بررسی کنید. بخش 'DNS records' و بخش 'Web' در <a href='#/diagnosis'>صفحه معاینه و عیب یابی</a> می تواند به شما کمک کند بفهمید چه چیزی اشتباه تنظیم شده است.",
"domain_is_eligible_for_ACME": "به نظر می رسد این دامنه برای نصب گواهی اجازه رمزگذاری ، به درستی پیکربندی شده است!",
"validity": "اعتبار",
"certificate_authority": "مرجع صدور گواهینامه",
"certificate_status": "وضعیت گواهینامه",
"certificate_status": "وضعیّت گواهینامه",
"certificate": "گواهی نامه",
"confirm_cert_revert_to_selfsigned": "آیا مطمئن هستید که می خواهید این دامنه را به گواهی خود امضا برگردانید؟",
"confirm_cert_manual_renew_LE": "آیا مطمئن هستید که می خواهید گواهی اجازه رمزگذاری را برای این دامنه به صورت دستی تمدید کنید؟",
@ -440,7 +440,7 @@
"mailbox_quota_example": "گنجایش یک سی-دی 700 مگابایت، و یک دی-وی-دی 4700 مگابایت میباشد",
"mailbox_quota_description": "محدودیت اندازه ذخیره سازی برای محتوای ایمیل تعیین کنید. <br> برای غیرفعال کردن روی 0 تنظیم کنید.",
"logout": "خروج",
"login": "ورود",
"login": "ورود به سیستم",
"local_archives": "بایگانی های محلی",
"license": "لایسنس، مجوز",
"last_ran": "زمان آخرین اجرا:",
@ -461,7 +461,7 @@
},
"issues": "{count} مسائل",
"installed": "نصب شد",
"installation_complete": "نصب کامل",
"installation_complete": "عملیّات نصب کامل شد",
"install_time": "زمان نصب",
"install_name": "نصب {id}",
"install": "نصب",
@ -507,8 +507,8 @@
"group_all_users": "تمام کاربران",
"group_name": "نام گروه",
"group": "گروه",
"good_practices_about_user_password": "اکنون در حال تعریف رمز عبور کاربر جدید هستید. گذرواژه باید حداقل 8 کاراکتر باشد - استفاده از رمز عبور طولانی تمرین خوبی است (یعنی عبارت عبور) و/یا استفاده وترکیب انواع مختلف کاراکترها (حروف بزرگ ، کوچک ، عدد و کاراکترهای خاص).",
"good_practices_about_admin_password": "اکنون در حال تعریف رمز عبور جدید مدیر سیستم هستید. گذرواژه باید حداقل 8 کاراکتر باشد - هرچند استفاده از رمز عبور طولانی تمرین خوبی است (یعنی عبارت عبور) و/یا استفاده وترکیب انواع مختلف کاراکترها (حروف بزرگ ، کوچک ، عدد و کاراکترهای خاص).",
"good_practices_about_user_password": "اکنون در حال تعریف رمز عبور کاربر جدید هستید. گذرواژه باید حداقل 8 کاراکتر طول داشته باشد - هرچند استفاده از رمز عبور طولانی تمرین خوبی است (یعنی عبارت عبور) و/یا با استفاده و ترکیب انواع مختلف کاراکترها (حروف بزرگ ، کوچک ، عدد و کاراکترهای خاص).",
"good_practices_about_admin_password": "اکنون در حال تعریف رمز عبور جدید مدیر سیستم هستید. گذرواژه باید حداقل 8 کاراکتر طول داشته باشد - هرچند استفاده از رمز عبور طولانی تمرین خوبی است (یعنی عبارت عبور) و/یا با استفاده و ترکیب انواع مختلف کاراکترها (حروف بزرگ ، کوچک ، عدد و کاراکترهای خاص).",
"go_back": "برگشتن به عقب",
"from_to": "از {0} تا {1}",
"form_input_example": "مثال : {example}",

View file

@ -282,7 +282,8 @@
"warnings": "{count} avertissements",
"words": {
"default": "Défaut",
"collapse": "Replier"
"collapse": "Replier",
"browse": "Parcourir"
},
"configuration": "Configuration",
"since": "depuis",
@ -335,7 +336,8 @@
"groupname": "Le nom de mon groupe",
"lastname": "Dupont",
"firstname": "Jean",
"username": "jeandupont"
"username": "jeandupont",
"file": "Parcourir un fichier ou le faire glisser et déposer"
},
"perform": "Exécuter",
"migrations_disclaimer_not_checked": "Cette migration nécessite que vous preniez connaissance de sa décharge de responsabilité avant de l'exécuter.",
@ -372,14 +374,15 @@
"notInUsers": "L'utilisateur '{value}' existe déjà.",
"minValue": "La valeur doit être un nombre égal ou supérieur à {min}.",
"name": "Les noms ne peuvent pas comporter de caractères spéciaux, sauf <code> ,.'-</code>",
"githubLink": "L'URL doit être un lien Github valide vers un dépôt",
"githubLink": "L'URL doit être un lien GitHub valide vers un dépôt",
"emailForward": "Adresse de transfert de courrier électronique invalide : elle doit être composée de caractères alphanumérique et de <code>_.-+</code> seulement (par exemple, someone+tag@example.com, s0me-1+tag@example.com)",
"email": "Adresse de courriel invalide : elle doit être composée de caractères alphanumérique et des caractères <code>_.-</code> seulement (par exemple someone@example.com, s0me-1@example.com)",
"dynDomain": "Nom de domaine invalide : Il doit être composé de minuscules alphanumériques et de tirets uniquement",
"domain": "Nom de domaine invalide : Il doit être composé de minuscules alphanumériques, de points et de tirets uniquement",
"between": "La valeur doit être comprise entre {min} et {max}.",
"alpha": "La chaîne de caractères ne doit contenir que des lettres.",
"alphalownum_": "La chaîne de caractères doit être composé uniquement de caractères alphanumériques minuscules et de tirets bas (aussi appelé tiret du 8 ou underscore)."
"alphalownum_": "La chaîne de caractères doit être composé uniquement de caractères alphanumériques minuscules et de tirets bas (aussi appelé tiret du 8 ou underscore).",
"fileMediaTypeMatch": "Type de fichier non valide : doit être <code>{arg}</code>."
},
"footer": {
"donate": "Faire un don",
@ -526,5 +529,15 @@
"adminpw": "Changer le mot de passe administrateur"
},
"items_verbose_items_left": "Il reste des {items}.",
"confirm_group_add_access_permission": "Voulez-vous vraiment accorder l'accès à {perm} à {name} ? Un tel accès augmente considérablement la surface d'attaque si {name} se trouve être une personne malveillante. Vous ne devriez le faire que si vous FAITES CONFIANCE à cette personne/ ce groupe."
"confirm_group_add_access_permission": "Voulez-vous vraiment accorder l'accès à {perm} à {name} ? Un tel accès augmente considérablement la surface d'attaque si {name} se trouve être une personne malveillante. Vous ne devriez le faire que si vous FAITES CONFIANCE à cette personne/ ce groupe.",
"users_import": "Importer des utilisateurs",
"users_export": "Exporter les utilisateurs",
"users_import_csv_file": "Fichier CSV",
"users_import_update": "Mettre à jour les utilisateurs existants",
"users_import_delete": "Supprimer les utilisateurs non répertoriés",
"users_import_update_desc": "Si coché, tous les utilisateurs existants contenus dans le fichier CSV seront mis à jour avec les nouvelles valeurs",
"users_import_delete_desc": "Si coché, tous les utilisateurs existants qui ne sont pas dans le fichier CSV seront supprimés (et purgés).",
"users_import_confirm_destructive": "Êtes-vous sûr de vouloir supprimer les utilisateurs qui ne sont pas présents dans ce fichier ?",
"users_import_delete_others": "Supprimer les utilisateurs non répertoriés",
"users_import_csv_file_desc": "Le fichier CSV doit être au format UTF-8 et avec les colonnes nom d'utilisateur, mot de passe, groupes, email et quota. Pour un exemple d'importation de fichier CSV, vous pouvez <a href='/yunohost/api/users/export' target='_BLANK'>exporter vos utilisateurs dans un fichier CSV</a> et modifier le fichier."
}

View file

@ -155,14 +155,15 @@
"notInUsers": "A usuaria '{value}' xa existe.",
"minValue": "O valor debe ser un número igual ou superior a {min}.",
"name": "Os nomes non inclúen caracteres especiais excepto <code> ,.'-</code>",
"githubLink": "A URL debe ser unha ligazón de Github a un repositorio",
"githubLink": "URL debe ser unha ligazón a un repositorio de GitHub",
"emailForward": "Email de reenvío non válido: ten que ser alfanumérico e caracteres <code>_.-+</code> (ex. menganito+etiqueta@exemplo.com, m3ng4ni7-o+etiqueta@exemplo.com)",
"email": "Email non válido: debe ser alfanumércio e caracteres <code>_.-</code> (ex. menganito@exemplo.com, p4c-0@exemplo.com)",
"dynDomain": "Nome de dominio non válido: Só pode ter caracteres alfanuméricos en minúscula e barra",
"domain": "Nome de dominio non válido: Só pode ser alfanumérico en minúsculas, punto e barra",
"between": "O valor ten que estar entre {min} e {max}.",
"alphalownum_": "O valor só pode ter caracteres alfanuméricos en minúscula e trazos baixos.",
"alpha": "O valor só pode ter caracteres alfanuméricos."
"alpha": "O valor só pode ter caracteres alfanuméricos.",
"fileMediaTypeMatch": "Tipo de ficheiro non válido: ten que ser <code>{arg}</code>."
},
"footer": {
"donate": "Doa",
@ -304,7 +305,8 @@
"groupname": "Nome do grupo",
"lastname": "Pérez",
"firstname": "Josefa",
"username": "pepitaperez"
"username": "pepitaperez",
"file": "Navega ata o ficheiro ou arrastra e sóltao"
},
"perform": "Realizar",
"path": "Ruta",
@ -512,7 +514,8 @@
"wrong_password": "Contrasinal incorrecto",
"words": {
"default": "Por defecto",
"collapse": "Pechar"
"collapse": "Pechar",
"browse": "Navegar"
},
"warnings": "{count} avisos",
"version": "Versión",
@ -524,5 +527,15 @@
"user_new_forward": "novoreenvio@omeudominoexterno.org",
"user_mailbox_use": "Espazo de correo utilizado",
"user_mailbox_quota": "Cota de correo",
"user_interface_link": "Interface de usuaria"
"user_interface_link": "Interface de usuaria",
"users_import": "Importar usuarias",
"users_export": "Exportar usuarias",
"users_import_csv_file": "Ficheiro CSV",
"users_import_update": "Actualizar usuarias existentes",
"users_import_delete": "Eliminar usuarias fóra da lista",
"users_import_csv_file_desc": "O ficheiro CSV ten que usar UTF-8 coas columnas nome de usuaria, contrasinal, grupos, email e cota. A xeito de exemplo de importación CSV, podes <a href='/yunohost/api/users/export' target='_BLANK'>exportar as túas usuarias a un ficheiro CSV</a> e edita o ficheiro.",
"users_import_update_desc": "Se está marcado, tódalas usuarias existentes contidas no ficheiro CSV vanse actualizar co novo valor",
"users_import_delete_desc": "Se está marcado, tódalas usuarias existentes que non están no ficheiro CSV van ser borradas (e eliminadas).",
"users_import_confirm_destructive": "Tes a certeza de querer eliminar as usuarias que non están presentes neste ficheiro?",
"users_import_delete_others": "Eliminar usuarias de fóra da lista"
}

View file

@ -0,0 +1,32 @@
{
"add": "Tambahkan",
"address": {
"domain_description": {
"email": "Pilih sebuah domain untuk surel Anda.",
"domain": "Pilih sebuah domain."
},
"local_part_description": {
"domain": "Pilih sebuah subdomain."
}
},
"administration_password": "Kata sandi administrasi",
"all": "Semua",
"api": {
"processing": "Server sedang memproses tindakan...",
"query_status": {
"error": "Gagal",
"pending": "Sedang berjalan",
"success": "Berhasil"
}
},
"api_error": {
"server_said": "Ketika memproses tindakan server mengatakan:",
"sorry": "Maaf tentang itu.",
"info": "Informasi berikut mungkin berguna untuk orang yang membantu Anda:"
},
"api_errors_titles": {
"APINotRespondingError": "API YunoHost tidak menjawab"
},
"all_apps": "Semua aplikasi",
"api_waiting": "Menunggu jawaban server..."
}

View file

@ -47,7 +47,7 @@
"backup": "Резервне копіювання",
"archive_empty": "Порожній архів",
"applications": "Застосунки",
"app_state_working_explanation": "Творець застосунку позначив його як \"працює\". Це означає, що він повинен бути робочим (на рівні застосунку), але не перевірений спільнотою. Він може містити помилки або не повністю інтегрований з YunoHost.",
"app_state_working_explanation": "Творець застосунку позначив його як «працює». Це означає, що він повинен бути робочим (на рівні застосунку), але не перевірений спільнотою. Він може містити помилки або не повністю інтегрований з YunoHost.",
"app_state_working": "працює",
"app_state_highquality_explanation": "Цей застосунок добре інтегрований з YunoHost принаймні з останнього року.",
"app_state_highquality": "висока якість",
@ -150,7 +150,7 @@
"everything_good": "Усе справно!",
"experimental": "Експериментальне",
"firewall": "Фаєрвол",
"footer_version": "Створено <a href='https://yunohost.org'></a> {version} ({repo}).",
"footer_version": "Створено <a href='https://yunohost.org'>YunoHost</a> {version} ({repo}).",
"footer": {
"documentation": "Документація",
"help": "Потрібна допомога?",
@ -162,7 +162,7 @@
"domain": "Неприпустиме доменне ім'я: воно має складатися тільки з букв і чисел у нижньому регістрі, крапок і тире",
"dynDomain": "Неприпустиме доменне ім'я: воно має складатися тільки з букв і чисел в нижньому регістрі та тире",
"email": "Неприпустима е-пошта: в ній мають бути лише букви та числа <code>_.-</code> (на зразок cholovyaha@example.com, ch0lov-1@example.com)",
"githubLink": "URL-адреса має бути дійсним посиланням на репозиторій Github",
"githubLink": "URL-адреса має бути дійсним посиланням на репозиторій GitHub",
"name": "Імена не можуть містити спеціальні символи, за винятком <code> ,.'-</code>",
"minValue": "Значення має бути числом, рівним або більшим, ніж {min}.",
"notInUsers": "Користувач '{value}' вже існує.",
@ -171,7 +171,8 @@
"passwordMatch": "Паролі не збігаються.",
"required": "Обов'язкове поле.",
"alphalownum_": "У значенні можуть бути тільки букви в нижньому регістрі, числа та знак нижнього підкреслення.",
"emailForward": "Неприпустима переадресація е-пошти: в ній мають бути лише букви та числа <code>_.-</code> (на зразок cholovyaha@example.com, ch0lov-1@example.com)"
"emailForward": "Неприпустима переадресація е-пошти: в ній мають бути лише букви та числа <code>_.-</code> (на зразок cholovyaha@example.com, ch0lov-1@example.com)",
"fileMediaTypeMatch": "Неприпустимий тип файлу: має бути <code>{arg}</code>."
},
"form_input_example": "Приклад: {example}",
"from_to": "від {0} до {1}",
@ -266,7 +267,8 @@
"firstname": "Ivan",
"lastname": "Melnyk",
"groupname": "Назва моєї групи",
"domain": "miy-domen.ua"
"domain": "miy-domen.ua",
"file": "Оберіть файл у огляді чи перетягніть його"
},
"logs": "Журнали",
"logs_suboperations": "Субоперації",
@ -454,7 +456,8 @@
"warnings": "{count} попереджень",
"words": {
"collapse": "Колапс",
"default": "Типово"
"default": "Типово",
"browse": "Огляд"
},
"wrong_password": "Неправильний пароль",
"yes": "Так",
@ -524,5 +527,15 @@
"confirm_cert_revert_to_selfsigned": "Ви справді бажаєте повернути цей домен до самопідписаного сертифікату безпеки?",
"domain_not_eligible_for_ACME": "Цей домен, схоже, не готовий для сертифіката безпеки Let's Encrypt. Будь ласка, перевірте конфігурацію DNS і досяжність HTTP-сервера. Розділи 'DNS-записи' і 'Мережа' на <a href='#/diagnosis'>сторінці діагностики</a> можуть допомогти вам зрозуміти, що саме неправильно сконфігуровано.",
"purge_user_data_checkbox": "Очистити дані {name}? (це видалить вміст його домівки та поштових каталогів).",
"purge_user_data_warning": "Очищення даних користувача не є відновлюваним. Будьте впевнені, що ви знаєте, що робите!"
"purge_user_data_warning": "Очищення даних користувача не є відновлюваним. Будьте впевнені, що ви знаєте, що робите!",
"users_import": "Імпорт користувачів",
"users_export": "Експорт користувачів",
"users_import_csv_file": "Файл CSV",
"users_import_update": "Оновити наявних користувачів",
"users_import_update_desc": "Якщо встановити прапорець, усі наявні користувачі, що містяться у файлі CSV, будуть оновлені новими значеннями",
"users_import_confirm_destructive": "Ви впевнені, що хочете видалити користувачів, яких немає у цьому файлі?",
"users_import_delete_others": "Видалити не перелічених користувачів",
"users_import_delete": "Видалити не перелічених користувачів",
"users_import_csv_file_desc": "Файл CSV має бути у кодуванні UTF-8 і містити стовпці з іменем користувача, паролем, групами, е-поштою та квотою. Для прикладу імпорту файла CSV, ви можете <a href='/yunohost/api/users/export' target='_BLANK'>експортувати своїх користувачів у файл CSV</a> та змінити дані файлу.",
"users_import_delete_desc": "Якщо встановити прапорець, усі наявні користувачі, яких немає у файлі CSV, будуть видалені (і очищені)."
}

View file

@ -37,9 +37,19 @@ export default {
eu: {
name: 'Euskara'
},
fa: {
name: 'فارسی',
dateFnsLocale: 'fa-IR'
},
fi: {
name: 'Suomi'
},
fr: {
name: 'Français'
},
gl: {
name: 'Galego'
},
hi: {
name: 'हिन्दी'
},
@ -79,6 +89,9 @@ export default {
tr: {
name: 'Türkçe'
},
uk: {
name: 'Українська'
},
zh_Hans: {
name: '简化字',
dateFnsLocale: 'zh-CN'

View file

@ -1,5 +1,6 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import i18n from '@/i18n'
import routes from './routes'
import store from '@/store'
@ -39,4 +40,30 @@ router.beforeEach((to, from, next) => {
}
})
router.afterEach((to, from) => {
// Display a simplified breadcrumb as the document title.
const routeParams = to.params
let breadcrumb = to.meta.breadcrumb
if (breadcrumb.length === 0) {
breadcrumb = [to.name]
} else if (breadcrumb.length > 2) {
breadcrumb = breadcrumb.slice(breadcrumb.length - 2)
}
const title = breadcrumb.map(name => {
const route = routes.find(route => route.name === name)
const { trad, param } = route ? route.meta.args : {}
// if a traduction key string has been given and we also need to pass
// the route param as a variable.
if (trad && param) {
return i18n.t(trad, { [param]: routeParams[param] })
} else if (trad) {
return i18n.t(trad)
}
return routeParams[param]
}).reverse().join(' / ')
document.title = `${title} | ${i18n.t('yunohost_admin')}`
})
export default router

View file

@ -18,14 +18,21 @@ const routes = [
path: '/',
component: Home,
// Leave the empty breadcrumb as it is used by the animated transition to know which way to go
meta: { breadcrumb: [] }
meta: {
args: { trad: 'home' },
breadcrumb: []
}
},
{
name: 'login',
path: '/login',
component: Login,
meta: { noAuth: true, breadcrumb: [] }
meta: {
noAuth: true,
args: { trad: 'login' },
breadcrumb: []
}
},
/*
@ -36,7 +43,11 @@ const routes = [
path: '/postinstall',
component: () => import(/* webpackChunkName: "views/post-install" */ '@/views/PostInstall'),
// Leave the breadcrumb
meta: { noAuth: true, breadcrumb: [] }
meta: {
noAuth: true,
args: { trad: 'postinstall.title' },
breadcrumb: []
}
},
/*
@ -60,6 +71,16 @@ const routes = [
breadcrumb: ['user-list', 'user-create']
}
},
{
name: 'user-import',
path: '/users/import',
component: () => import(/* webpackChunkName: "views/user/import" */ '@/views/user/UserImport'),
props: true,
meta: {
args: { param: 'name' },
breadcrumb: ['user-list', 'user-import']
}
},
{
name: 'user-info',
path: '/users/:name',

View file

@ -112,11 +112,52 @@ body {
top: 2px;
}
// limit the size of toggle dropdown buttons to a square
.dropdown-toggle-split {
max-width: 2.5rem;
}
// Fork-awesome overrides
.fa-fw {
width: 1.25em !important;
}
// custom css
.actions {
margin-bottom: 2rem;
display: flex;
justify-content: space-between;
@include media-breakpoint-down(xs) {
.buttons {
flex-direction: column;
justify-content: space-between;
}
}
@include media-breakpoint-down(sm) {
flex-direction: column-reverse;
margin-bottom: 2rem;
.buttons {
display: flex;
justify-content: space-between;
.btn {
margin-bottom: .5rem;
}
}
}
@include media-breakpoint-up(md) {
.btn ~ .btn {
margin-left: .5rem;
}
.btn ~ .dropdown-toggle-split {
margin-left: 0;
}
}
}
// Do not display ligatures in invalid-feedback to avoid confusion.
.invalid-feedback {
code {

View file

@ -146,6 +146,16 @@ export default {
return api.fetch('DELETE', param ? `${uri}/${param}` : uri, data, humanKey, options).then(() => {
commit('DEL_' + storeKey.toUpperCase(), [param, extraParams].filter(item => !isEmptyValue(item)))
})
},
'RESET_CACHE_DATA' ({ state }, keys = Object.keys(state)) {
for (const key of keys) {
if (key === 'users_details') {
state[key] = {}
} else {
state[key] = undefined
}
}
}
},

View file

@ -0,0 +1,103 @@
<template>
<card-form
:title="$t('users_import')" icon="user-plus"
:validation="$v" :server-error="serverError"
@submit.prevent="onSubmit"
>
<!-- CSV FILE -->
<form-field v-bind="fields.csvfile" v-model="form.csvfile" :validation="$v.form.csvfile" />
<!-- UPDATE -->
<form-field v-bind="fields.update" v-model="form.update" />
<!-- DELETE -->
<form-field v-bind="fields.delete" v-model="form.delete" />
</card-form>
</template>
<script>
import api from '@/api'
import { validationMixin } from 'vuelidate'
import { formatFormData } from '@/helpers/yunohostArguments'
import { required, fileMediaTypeMatch } from '@/helpers/validators'
export default {
name: 'UserImport',
data () {
return {
form: {
csvfile: '',
update: false,
delete: false
},
serverError: '',
fields: {
csvfile: {
label: this.$i18n.t('users_import_csv_file'),
description: this.$i18n.t('users_import_csv_file_desc'),
component: 'FileItem',
props: {
id: 'csvfile',
placeholder: this.$i18n.t('placeholder.file')
}
},
update: {
label: this.$i18n.t('users_import_update'),
description: this.$i18n.t('users_import_update_desc'),
component: 'CheckboxItem',
props: {
id: 'update'
}
},
delete: {
label: this.$i18n.t('users_import_delete'),
description: this.$i18n.t('users_import_delete_desc'),
component: 'CheckboxItem',
props: {
id: 'delete'
}
}
}
}
},
validations: {
form: {
csvfile: { required, fileMediaTypeMatch: fileMediaTypeMatch('text/csv') }
}
},
methods: {
async onSubmit () {
if (this.form.delete) {
const confirmed = await this.$askConfirmation(
this.$i18n.t('users_import_confirm_destructive'),
{ okTitle: this.$i18n.t('users_import_delete_others') }
)
if (!confirmed) return
}
var requestArgs = {}
Object.assign(requestArgs, this.form)
if (!requestArgs.delete) delete requestArgs.delete
if (!requestArgs.update) delete requestArgs.update
const data = formatFormData(requestArgs)
api.post('users/import', data, { asFormData: true }).then(() => {
// Reset all cached data related to users.
this.$store.dispatch('RESET_CACHE_DATA', ['users', 'users_details', 'groups', 'permissions'])
this.$router.push({ name: 'user-list' })
}).catch(error => {
this.serverError = error.message
})
}
},
mixins: [validationMixin]
}
</script>

View file

@ -8,14 +8,25 @@
>
<template #top-bar-buttons>
<b-button variant="info" :to="{ name: 'group-list' }">
<icon iname="key-modern" />
{{ $t('groups_and_permissions_manage') }}
<icon iname="key-modern" /> {{ $t('groups_and_permissions_manage') }}
</b-button>
<b-button variant="success" :to="{ name: 'user-create' }">
<icon iname="plus" />
{{ $t('users_new') }}
</b-button>
<b-dropdown
:split-to="{ name: 'user-create' }"
split variant="outline-success" right
split-variant="success"
>
<template #button-content>
<icon iname="plus" /> {{ $t('users_new') }}
</template>
<b-dropdown-item :to="{ name: 'user-import' }">
<icon iname="plus" /> {{ $t('users_import') }}
</b-dropdown-item>
<b-dropdown-item @click="downloadExport">
<icon iname="download" /> {{ $t('users_export') }}
</b-dropdown-item>
</b-dropdown>
</template>
<b-list-group>
@ -48,12 +59,17 @@ export default {
data () {
return {
queries: [
['GET', { uri: 'users' }]
['GET', { uri: 'users?fields=username&fields=fullname&fields=mail&fields=mailbox-quota&fields=groups' }]
],
search: ''
}
},
methods: {
downloadExport () {
const host = this.$store.getters.host
window.open(`https://${host}/yunohost/api/users/export`, '_blank')
}
},
computed: {
...mapGetters(['users']),
@ -61,7 +77,7 @@ export default {
if (!this.users) return
const search = this.search.toLowerCase()
const filtered = this.users.filter(user => {
return user.username.toLowerCase().includes(search)
return user.username.toLowerCase().includes(search) || user.groups.includes(search)
})
return filtered.length === 0 ? null : filtered
}

View file

@ -12,7 +12,7 @@ const dateFnsLocales = [
'eo',
'es',
'eu',
'fa',
'fa-IR',
'fi',
'fr', // for 'fr' & 'br'
'gl',