summaryrefslogtreecommitdiffstats
path: root/core/l10n/vi.js
blob: 1640eaf65cc3c813f7cfcc13951b5f7997d82ff0 (plain)
1
2
3
4
5
6
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Lite
OC.L10N.register(
    "core",
    {
    "Couldn't send mail to following users: %s " : "Không thể gửi thư cho người dùng: %s",
    "Turned on maintenance mode" : "Bật chế độ bảo trì",
    "Turned off maintenance mode" : "Tắt chế độ bảo trì",
    "Updated database" : "Cơ sở dữ liệu đã được cập nhật",
    "No image or file provided" : "Không có hình ảnh hoặc tập tin được cung cấp",
    "Unknown filetype" : "Không biết kiểu tập tin",
    "Invalid image" : "Hình ảnh không hợp lệ",
    "No temporary profile picture available, try again" : "Ảnh cá nhân tạm thời không có giá trị, hãy thử lại",
    "No crop data provided" : "Không có dữ liệu nguồn được cung cấp",
    "%s password reset" : "%s thiết lập lại mật khẩu",
    "Sunday" : "Chủ nhật",
    "Monday" : "Thứ 2",
    "Tuesday" : "Thứ 3",
    "Wednesday" : "Thứ 4",
    "Thursday" : "Thứ 5",
    "Friday" : "Thứ ",
    "Saturday" : "Thứ 7",
    "Sun." : "Chủ nhật",
    "Mon." : "Thứ hai",
    "Tue." : "Thứ ba",
    "Wed." : "Thứ tư",
    "Thu." : "Thứ năm",
    "Fri." : "Thứ sáu",
    "Sat." : "Thứ bảy",
    "January" : "Tháng 1",
    "February" : "Tháng 2",
    "March" : "Tháng 3",
    "April" : "Tháng 4",
    "May" : "Tháng 5",
    "June" : "Tháng 6",
    "July" : "Tháng 7",
    "August" : "Tháng 8",
    "September" : "Tháng 9",
    "October" : "Tháng 10",
    "November" : "Tháng 11",
    "December" : "Tháng 12",
    "Jan." : "Tháng 1",
    "Feb." : "Tháng 2",
    "Mar." : "Tháng 3",
    "Apr." : "Tháng 4",
    "May." : "Tháng 5",
    "Jun." : "Tháng 6",
    "Jul." : "Tháng 7",
    "Aug." : "Tháng 8",
    "Sep." : "Tháng 9",
    "Oct." : "Tháng 10",
    "Nov." : "Tháng 11",
    "Dec." : "Tháng 12",
    "Settings" : "Cài đặt",
    "Saving..." : "Đang lưu...",
    "seconds ago" : "vài giây trước",
    "No" : "Không",
    "Yes" : "Có",
    "Choose" : "Chọn",
    "Error loading file picker template: {error}" : "Lỗi khi tải mẫu tập tin picker: {error}",
    "Ok" : "Đồng ý",
    "Error loading message template: {error}" : "Lỗi khi tải mẫu thông điệp: {error}",
    "_{count} file conflict_::_{count} file conflicts_" : ["{count} tập tin xung đột"],
    "One file conflict" : "Một tập tin xung đột",
    "New Files" : "File mới",
    "Which files do you want to keep?" : "Bạn muốn tiếp tục với những tập tin nào?",
    "If you select both versions, the copied file will have a number added to its name." : "Nếu bạn chọn cả hai phiên bản, tập tin được sao chép sẽ được đánh thêm số vào tên của nó.",
    "Cancel" : "Hủy",
    "Continue" : "Tiếp tục",
    "(all selected)" : "(Tất cả các lựa chọn)",
    "({count} selected)" : "({count} được chọn)",
    "Error loading file exists template" : "Lỗi khi tải tập tin mẫu đã tồn tại",
    "Shared" : "Được chia sẻ",
    "Error" : "Lỗi",
    "Error while sharing" : "Lỗi trong quá trình chia sẻ",
    "Error while unsharing" : "Lỗi trong quá trình gỡ chia sẻ",
    "Error setting expiration date" : "Lỗi cấu hình ngày kết thúc",
    "Set expiration date" : "Đặt ngày kết thúc",
    "Expiration date" : "Ngày kết thúc",
    "Sending ..." : "Đang gởi ...",
    "Email sent" : "Email đã được gửi",
    "Resharing is not allowed" : "Chia sẻ lại không được cho phép",
    "Share link" : "Chia sẻ liên kết",
    "Password protect" : "Mật khẩu bảo vệ",
    "Password" : "Mật khẩu",
    "Email link to person" : "Liên kết email tới cá nhân",
    "Send" : "Gởi",
    "Shared with you and the group {group} by {owner}" : "Đã được chia sẽ với bạn và nhóm {group} bởi {owner}",
    "Shared with you by {owner}" : "Đã được chia sẽ bởi {owner}",
    "group" : "nhóm",
    "notify by email" : "Thông báo qua email",
    "Unshare" : "Bỏ chia sẻ",
    "can share" : "có thể chia sẽ",
    "can edit" : "có thể chỉnh sửa",
    "create" : "tạo",
    "delete" : "xóa",
    "access control" : "quản lý truy cập",
    "Share" : "Chia sẻ",
    "Warning" : "Cảnh báo",
    "Delete" : "Xóa",
    "Rename" : "Sửa tên",
    "The object type is not specified." : "Loại đối tượng không được chỉ định.",
    "Enter new" : "Nhập mới",
    "Add" : "Thêm",
    "Edit tags" : "Sửa thẻ",
    "Error loading dialog template: {error}" : "Lỗi khi tải mẫu hội thoại: {error}",
    "No tags selected for deletion." : "Không có thẻ nào được chọn để xóa",
    "Please reload the page." : "Vui lòng tải lại trang.",
    "The update was successful. Redirecting you to ownCloud now." : "Cập nhật thành công .Hệ thống sẽ đưa bạn tới ownCloud.",
    "Personal" : "Cá nhân",
    "Users" : "Người dùng",
    "Apps" : "Ứng dụng",
    "Admin" : "Quản trị",
    "Help" : "Giúp đỡ",
    "Error loading tags" : "Lỗi khi tải thẻ",
    "Tag already exists" : "Thẻ đã tồn tại",
    "Error deleting tag(s)" : "Lỗi khi xóa (nhiều)thẻ",
    "Error tagging" : "Lỗi gắn thẻ",
    "Error untagging" : "Lỗi không gắn thẻ",
    "Access forbidden" : "Truy cập bị cấm",
    "Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\n" : "Xin chào,\n\nbáo cho bạn biết rằng %s đã chia sẽ %s với bạn.\nXem nó: %s\n\n",
    "The share will expire on %s." : "Chia sẻ này sẽ hết hiệu lực vào %s.",
    "Cheers!" : "Chúc mừng!",
    "Your data directory and files are probably accessible from the internet because the .htaccess file does not work." : "Thư mục và file dữ liệu của bạn có thể được truy cập từ internet bởi vì file .htaccess không hoạt động",
    "Create an <strong>admin account</strong>" : "Tạo một <strong>tài khoản quản trị</strong>",
    "Username" : "Tên đăng nhập",
    "Data folder" : "Thư mục dữ liệu",
    "Configure the database" : "Cấu hình cơ sở dữ liệu",
    "Database user" : "Người dùng cơ sở dữ liệu",
    "Database password" : "Mật khẩu cơ sở dữ liệu",
    "Database name" : "Tên cơ sở dữ liệu",
    "Database tablespace" : "Cơ sở dữ liệu tablespace",
    "Database host" : "Database host",
    "Finish setup" : "Cài đặt hoàn tất",
    "Finishing …" : "Đang hoàn thành ...",
    "Log out" : "Đăng xuất",
    "Search" : "Tìm kiếm",
    "Server side authentication failed!" : "Xác thực phía máy chủ không thành công!",
    "Please contact your administrator." : "Vui lòng liên hệ với quản trị viên.",
    "Log in" : "Đăng nhập",
    "Alternative Logins" : "Đăng nhập khác",
    "Use the following link to reset your password: {link}" : "Dùng đường dẫn sau để khôi phục lại mật khẩu : {link}",
    "New password" : "Mật khẩu mới",
    "Reset password" : "Khôi phục mật khẩu",
    "This ownCloud instance is currently in single user mode." : "OwnCloud trong trường hợp này đang ở chế độ người dùng duy nhất.",
    "This means only administrators can use the instance." : "Điều này có nghĩa chỉ có người quản trị có thể sử dụng trong trường hợp này.",
    "Contact your system administrator if this message persists or appeared unexpectedly." : "Liên hệ với người quản trị nếu lỗi này vẫn tồn tại hoặc xuất hiện bất ngờ.",
    "Thank you for your patience." : "Cảm ơn sự kiên nhẫn của bạn."
},
"nplurals=1; plural=0;");
="p">()},data(){const t=(0,r.j)("settings","encryption-modules");return{encryptionReady:(0,r.j)("settings","encryption-ready"),encryptionEnabled:(0,r.j)("settings","encryption-enabled"),externalBackendsEnabled:(0,r.j)("settings","external-backends-enabled"),encryptionAdminDoc:(0,r.j)("settings","encryption-admin-doc"),encryptionModules:t,shouldDisplayWarning:!1,migrating:!1,defaultCheckedModule:Object.entries(t).find((t=>t[1].default))[0]}},computed:{migrationMessage:()=>t("settings",'You need to migrate your encryption keys from the old encryption (ownCloud <= 8.0) to the new one. Please enable the "Default encryption module" and run {command}',{command:'"occ encryption:migrate"'})},methods:{displayWarning(){this.encryptionEnabled?(this.encryptionEnabled=!1,this.shouldDisplayWarning=!1):this.shouldDisplayWarning=!this.shouldDisplayWarning},async update(e,n){await(0,U.confirmPassword)();const o=(0,w.generateOcsUrl)("/apps/provisioning_api/api/v1/config/apps/{appId}/{key}",{appId:"core",key:e}),r=n?"yes":"no";try{var s,i;const{data:t}=await a.Z.post(o,{value:r});this.handleResponse({status:null===(s=t.ocs)||void 0===s||null===(i=s.meta)||void 0===i?void 0:i.status})}catch(e){this.handleResponse({errorMessage:t("settings","Unable to update server side encryption config"),error:e})}},async checkDefaultModule(){await this.update("default_encryption_module",this.defaultCheckedModule)},async enableEncryption(){this.encryptionEnabled=!0,await this.update("encryption_enabled",!0)},async handleResponse(t){let{status:e,errorMessage:n,error:o}=t;"ok"!==e&&((0,$.x2)(n),P.error(n,{error:o}))}}};var L=o(15095),Y={};Y.styleTagTransform=F(),Y.setAttributes=D(),Y.insert=N().bind(null,"head"),Y.domAPI=S(),Y.insertStyleElement=O(),k()(L.Z,Y),L.Z&&L.Z.locals&&L.Z.locals;const z=(0,I.Z)(W,(function(){var t=this,e=t._self._c;return e("NcSettingsSection",{attrs:{title:t.t("settings","Server-side encryption"),description:t.t("settings","Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed."),"doc-url":t.encryptionAdminDoc}},[e("NcCheckboxRadioSwitch",{attrs:{checked:t.encryptionEnabled||t.shouldDisplayWarning,disabled:t.encryptionEnabled,type:"switch"},on:{"update:checked":t.displayWarning}},[t._v("\n\t\t"+t._s(t.t("settings","Enable server-side encryption"))+"\n\t")]),t._v(" "),t.shouldDisplayWarning&&!t.encryptionEnabled?e("div",{staticClass:"notecard warning",attrs:{role:"alert"}},[e("p",[t._v(t._s(t.t("settings","Please read carefully before activating server-side encryption:")))]),t._v(" "),e("ul",[e("li",[t._v(t._s(t.t("settings","Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met.")))]),t._v(" "),e("li",[t._v(t._s(t.t("settings","Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases.")))]),t._v(" "),e("li",[t._v(t._s(t.t("settings","Be aware that encryption always increases the file size.")))]),t._v(" "),e("li",[t._v(t._s(t.t("settings","It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data.")))])]),t._v(" "),e("p",{staticClass:"margin-bottom"},[t._v("\n\t\t\t"+t._s(t.t("settings","This is the final warning: Do you really want to enable encryption?"))+"\n\t\t")]),t._v(" "),e("NcButton",{attrs:{type:"primary"},on:{click:function(e){return t.enableEncryption()}}},[t._v("\n\t\t\t"+t._s(t.t("settings","Enable encryption"))+"\n\t\t")])],1):t._e(),t._v(" "),t.encryptionEnabled?e("div",[t.encryptionReady?e("div",[0===t.encryptionModules.length?e("p",[t._v("\n\t\t\t\t"+t._s(t.t("settings","No encryption module loaded, please enable an encryption module in the app menu."))+"\n\t\t\t")]):[e("h3",[t._v(t._s(t.t("settings","Select default encryption module:")))]),t._v(" "),e("fieldset",t._l(t.encryptionModules,(function(n,o){return e("NcCheckboxRadioSwitch",{key:o,attrs:{checked:t.defaultCheckedModule,value:o,type:"radio",name:"default_encryption_module"},on:{"update:checked":[function(e){t.defaultCheckedModule=e},t.checkDefaultModule]}},[t._v("\n\t\t\t\t\t\t"+t._s(n.displayName)+"\n\t\t\t\t\t")])})),1)]],2):t.externalBackendsEnabled?e("div",{domProps:{innerHTML:t._s(t.migrationMessage)}}):t._e()]):t._e()],1)}),[],!1,null,"bf04cb9e",null).exports;var H=o(20629);s.default.use(H.ZP);const J={setEnforced(t,e){s.default.set(t,"enforced",e)},setEnforcedGroups(t,e){s.default.set(t,"enforcedGroups",e)},setExcludedGroups(t,e){s.default.set(t,"excludedGroups",e)}},K=new H.yh({strict:!1,state:{enforced:!1,enforcedGroups:[],excludedGroups:[]},mutations:J});o.nc=btoa(OC.requestToken),s.default.prototype.t=t,window.OC=window.OC||{},window.OC.Settings=window.OC.Settings||{},K.replaceState((0,r.j)("settings","mandatory2FAState")),new(s.default.extend(Z))({store:K}).$mount("#two-factor-auth-settings"),(new(s.default.extend(z))).$mount("#vue-admin-encryption")},15095:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});var o=n(87537),r=n.n(o),s=n(23645),a=n.n(s)()(r());a.push([t.id,".notecard.success[data-v-bf04cb9e]{--note-background: rgba(var(--color-success-rgb), 0.2);--note-theme: var(--color-success)}.notecard.error[data-v-bf04cb9e]{--note-background: rgba(var(--color-error-rgb), 0.2);--note-theme: var(--color-error)}.notecard.warning[data-v-bf04cb9e]{--note-background: rgba(var(--color-warning-rgb), 0.2);--note-theme: var(--color-warning)}#body-settings .notecard[data-v-bf04cb9e]{color:var(--color-text-light);background-color:var(--note-background);border:1px solid var(--color-border);border-left:4px solid var(--note-theme);border-radius:var(--border-radius);box-shadow:rgba(43,42,51,.05) 0px 1px 2px 0px;margin:1rem 0;margin-top:1rem;padding:1rem}li[data-v-bf04cb9e]{list-style-type:initial;margin-left:1rem;padding:.25rem 0}.margin-bottom[data-v-bf04cb9e]{margin-bottom:.75rem}","",{version:3,sources:["webpack://./apps/settings/src/components/Encryption.vue"],names:[],mappings:"AAEA,mCACC,sDAAA,CACA,kCAAA,CAGD,iCACC,oDAAA,CACA,gCAAA,CAGD,mCACC,sDAAA,CACA,kCAAA,CAGD,0CACC,6BAAA,CACA,uCAAA,CACA,oCAAA,CACA,uCAAA,CACA,kCAAA,CACA,6CAAA,CACA,aAAA,CACA,eAAA,CACA,YAAA,CAGD,oBACC,uBAAA,CACA,gBAAA,CACA,gBAAA,CAGD,gCACC,oBAAA",sourcesContent:["\n\n.notecard.success {\n\t--note-background: rgba(var(--color-success-rgb), 0.2);\n\t--note-theme: var(--color-success);\n}\n\n.notecard.error {\n\t--note-background: rgba(var(--color-error-rgb), 0.2);\n\t--note-theme: var(--color-error);\n}\n\n.notecard.warning {\n\t--note-background: rgba(var(--color-warning-rgb), 0.2);\n\t--note-theme: var(--color-warning);\n}\n\n#body-settings .notecard {\n\tcolor: var(--color-text-light);\n\tbackground-color: var(--note-background);\n\tborder: 1px solid var(--color-border);\n\tborder-left: 4px solid var(--note-theme);\n\tborder-radius: var(--border-radius);\n\tbox-shadow: rgba(43, 42, 51, 0.05) 0px 1px 2px 0px;\n\tmargin: 1rem 0;\n\tmargin-top: 1rem;\n\tpadding: 1rem;\n}\n\nli {\n\tlist-style-type: initial;\n\tmargin-left: 1rem;\n\tpadding: 0.25rem 0;\n}\n\n.margin-bottom {\n\tmargin-bottom: 0.75rem;\n}\n"],sourceRoot:""}]);const i=a},82933:(t,e,n)=>{"use strict";n.d(e,{Z:()=>i});var o=n(87537),r=n.n(o),s=n(23645),a=n.n(s)()(r());a.push([t.id,"\n.two-factor-loading[data-v-4eff230c] {\n\tdisplay: inline-block;\n\tvertical-align: sub;\n\tmargin-left: -2px;\n\tmargin-right: 1px;\n}\n.top-margin[data-v-4eff230c] {\n\tmargin-top: 0.5rem;\n}\n","",{version:3,sources:["webpack://./apps/settings/src/components/AdminTwoFactor.vue"],names:[],mappings:";AAsLA;CACA,qBAAA;CACA,mBAAA;CACA,iBAAA;CACA,iBAAA;AACA;AAEA;CACA,kBAAA;AACA",sourcesContent:["<template>\n\t<NcSettingsSection :title=\"t('settings', 'Two-Factor Authentication')\"\n\t\t:description=\"t('settings', 'Two-factor authentication can be enforced for all users and specific groups. If they do not have a two-factor provider configured, they will be unable to log into the system.')\"\n\t\t:doc-url=\"twoFactorAdminDoc\">\n\t\t<p v-if=\"loading\">\n\t\t\t<span class=\"icon-loading-small two-factor-loading\" />\n\t\t\t<span>{{ t('settings', 'Enforce two-factor authentication') }}</span>\n\t\t</p>\n\t\t<NcCheckboxRadioSwitch v-else\n\t\t\tid=\"two-factor-enforced\"\n\t\t\t:checked.sync=\"enforced\"\n\t\t\ttype=\"switch\">\n\t\t\t{{ t('settings', 'Enforce two-factor authentication') }}\n\t\t</NcCheckboxRadioSwitch>\n\t\t<template v-if=\"enforced\">\n\t\t\t<h3>{{ t('settings', 'Limit to groups') }}</h3>\n\t\t\t{{ t('settings', 'Enforcement of two-factor authentication can be set for certain groups only.') }}\n\t\t\t<p class=\"top-margin\">\n\t\t\t\t{{ t('settings', 'Two-factor authentication is enforced for all members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"enforcedGroups\">\n\t\t\t\t\t<span>{{ t('settings', 'Enforced groups') }}</span>\n\t\t\t\t</label>\n\t\t\t\t<NcSelect input-id=\"enforcedGroups\"\n\t\t\t\t\tv-model=\"enforcedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p class=\"top-margin\">\n\t\t\t\t{{ t('settings', 'Two-factor authentication is not enforced for members of the following groups.') }}\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<label for=\"excludedGroups\">\n\t\t\t\t\t<span>{{ t('settings', 'Excluded groups') }}</span>\n\t\t\t\t</label>\n\t\t\t\t<NcSelect input-id=\"excludedGroups\"\n\t\t\t\t\tv-model=\"excludedGroups\"\n\t\t\t\t\t:options=\"groups\"\n\t\t\t\t\t:disabled=\"loading\"\n\t\t\t\t\t:multiple=\"true\"\n\t\t\t\t\t:loading=\"loadingGroups\"\n\t\t\t\t\t:close-on-select=\"false\"\n\t\t\t\t\t@search=\"searchGroup\" />\n\t\t\t</p>\n\t\t\t<p class=\"top-margin\">\n\t\t\t\t<em>\n\t\t\t\t\t\x3c!-- this text is also found in the documentation. update it there as well if it ever changes --\x3e\n\t\t\t\t\t{{ t('settings', 'When groups are selected/excluded, they use the following logic to determine if a user has 2FA enforced: If no groups are selected, 2FA is enabled for everyone except members of the excluded groups. If groups are selected, 2FA is enabled for all members of these. If a user is both in a selected and excluded group, the selected takes precedence and 2FA is enforced.') }}\n\t\t\t\t</em>\n\t\t\t</p>\n\t\t</template>\n\t\t<p class=\"top-margin\">\n\t\t\t<NcButton v-if=\"dirty\"\n\t\t\t\ttype=\"primary\"\n\t\t\t\t:disabled=\"loading\"\n\t\t\t\t@click=\"saveChanges\">\n\t\t\t\t{{ t('settings', 'Save changes') }}\n\t\t\t</NcButton>\n\t\t</p>\n\t</NcSettingsSection>\n</template>\n\n<script>\nimport axios from '@nextcloud/axios'\nimport NcSelect from '@nextcloud/vue/dist/Components/NcSelect.js'\nimport NcButton from '@nextcloud/vue/dist/Components/NcButton.js'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/dist/Components/NcCheckboxRadioSwitch.js'\nimport NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js'\nimport { loadState } from '@nextcloud/initial-state'\n\nimport sortedUniq from 'lodash/sortedUniq.js'\nimport uniq from 'lodash/uniq.js'\nimport debounce from 'lodash/debounce.js'\nimport { generateUrl, generateOcsUrl } from '@nextcloud/router'\n\nexport default {\n\tname: 'AdminTwoFactor',\n\tcomponents: {\n\t\tNcSelect,\n\t\tNcButton,\n\t\tNcCheckboxRadioSwitch,\n\t\tNcSettingsSection,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tdirty: false,\n\t\t\tgroups: [],\n\t\t\tloadingGroups: false,\n\t\t\ttwoFactorAdminDoc: loadState('settings', 'two-factor-admin-doc'),\n\t\t}\n\t},\n\tcomputed: {\n\t\tenforced: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforced\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforced', val)\n\t\t\t},\n\t\t},\n\t\tenforcedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.enforcedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setEnforcedGroups', val)\n\t\t\t},\n\t\t},\n\t\texcludedGroups: {\n\t\t\tget() {\n\t\t\t\treturn this.$store.state.excludedGroups\n\t\t\t},\n\t\t\tset(val) {\n\t\t\t\tthis.dirty = true\n\t\t\t\tthis.$store.commit('setExcludedGroups', val)\n\t\t\t},\n\t\t},\n\t},\n\tmounted() {\n\t\t// Groups are loaded dynamically, but the assigned ones *should*\n\t\t// be valid groups, so let's add them as initial state\n\t\tthis.groups = sortedUniq(uniq(this.enforcedGroups.concat(this.excludedGroups)))\n\n\t\t// Populate the groups with a first set so the dropdown is not empty\n\t\t// when opening the page the first time\n\t\tthis.searchGroup('')\n\t},\n\tmethods: {\n\t\tsearchGroup: debounce(function(query) {\n\t\t\tthis.loadingGroups = true\n\t\t\taxios.get(generateOcsUrl('cloud/groups?offset=0&search={query}&limit=20', { query }))\n\t\t\t\t.then(res => res.data.ocs)\n\t\t\t\t.then(ocs => ocs.data.groups)\n\t\t\t\t.then(groups => { this.groups = sortedUniq(uniq(this.groups.concat(groups))) })\n\t\t\t\t.catch(err => console.error('could not search groups', err))\n\t\t\t\t.then(() => { this.loadingGroups = false })\n\t\t}, 500),\n\n\t\tsaveChanges() {\n\t\t\tthis.loading = true\n\n\t\t\tconst data = {\n\t\t\t\tenforced: this.enforced,\n\t\t\t\tenforcedGroups: this.enforcedGroups,\n\t\t\t\texcludedGroups: this.excludedGroups,\n\t\t\t}\n\t\t\taxios.put(generateUrl('/settings/api/admin/twofactorauth'), data)\n\t\t\t\t.then(resp => resp.data)\n\t\t\t\t.then(state => {\n\t\t\t\t\tthis.state = state\n\t\t\t\t\tthis.dirty = false\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('could not save changes', err)\n\t\t\t\t})\n\t\t\t\t.then(() => { this.loading = false })\n\t\t},\n\t},\n}\n<\/script>\n\n<style scoped>\n\t.two-factor-loading {\n\t\tdisplay: inline-block;\n\t\tvertical-align: sub;\n\t\tmargin-left: -2px;\n\t\tmargin-right: 1px;\n\t}\n\n\t.top-margin {\n\t\tmargin-top: 0.5rem;\n\t}\n</style>\n"],sourceRoot:""}]);const i=a},1196:t=>{t.exports=function(t,e,n){for(var o=-1,r=null==t?0:t.length;++o<r;)if(n(e,t[o]))return!0;return!1}},93680:(t,e,n)=>{var o=n(77813);t.exports=function(t,e){for(var n=-1,r=t.length,s=0,a=[];++n<r;){var i=t[n],c=e?e(i):i;if(!n||!o(c,d)){var d=c;a[s++]=0===i?0:i}}return a}},45652:(t,e,n)=>{var o=n(88668),r=n(47443),s=n(1196),a=n(74757),i=n(23593),c=n(21814);t.exports=function(t,e,n){var d=-1,l=r,u=t.length,p=!0,g=[],f=g;if(n)p=!1,l=s;else if(u>=200){var h=e?null:i(t);if(h)return c(h);p=!1,l=a,f=new o}else f=e?[]:g;t:for(;++d<u;){var m=t[d],v=e?e(m):m;if(m=n||0!==m?m:0,p&&v==v){for(var b=f.length;b--;)if(f[b]===v)continue t;e&&f.push(v),g.push(m)}else l(f,v,n)||(f!==g&&f.push(v),g.push(m))}return g}},23593:(t,e,n)=>{var o=n(58525),r=n(50308),s=n(21814),a=o&&1/s(new o([,-0]))[1]==1/0?function(t){return new o(t)}:r;t.exports=a},23279:(t,e,n)=>{var o=n(13218),r=n(7771),s=n(14841),a=Math.max,i=Math.min;t.exports=function(t,e,n){var c,d,l,u,p,g,f=0,h=!1,m=!1,v=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function b(e){var n=c,o=d;return c=d=void 0,f=e,u=t.apply(o,n)}function y(t){var n=t-g;return void 0===g||n>=e||n<0||m&&t-f>=l}function A(){var t=r();if(y(t))return w(t);p=setTimeout(A,function(t){var n=e-(t-g);return m?i(n,l-(t-f)):n}(t))}function w(t){return p=void 0,v&&c?b(t):(c=d=void 0,u)}function x(){var t=r(),n=y(t);if(c=arguments,d=this,g=t,n){if(void 0===p)return function(t){return f=t,p=setTimeout(A,e),h?b(t):u}(g);if(m)return clearTimeout(p),p=setTimeout(A,e),b(g)}return void 0===p&&(p=setTimeout(A,e)),u}return e=s(e)||0,o(n)&&(h=!!n.leading,l=(m="maxWait"in n)?a(s(n.maxWait)||0,e):l,v="trailing"in n?!!n.trailing:v),x.cancel=function(){void 0!==p&&clearTimeout(p),f=0,c=g=d=p=void 0},x.flush=function(){return void 0===p?u:w(r())},x}},7771:(t,e,n)=>{var o=n(55639);t.exports=function(){return o.Date.now()}},97520:(t,e,n)=>{var o=n(93680);t.exports=function(t){return t&&t.length?o(t):[]}},44908:(t,e,n)=>{var o=n(45652);t.exports=function(t){return t&&t.length?o(t):[]}}},o={};function r(t){var e=o[t];if(void 0!==e)return e.exports;var s=o[t]={id:t,loaded:!1,exports:{}};return n[t].call(s.exports,s,s.exports,r),s.loaded=!0,s.exports}r.m=n,e=[],r.O=(t,n,o,s)=>{if(!n){var a=1/0;for(l=0;l<e.length;l++){n=e[l][0],o=e[l][1],s=e[l][2];for(var i=!0,c=0;c<n.length;c++)(!1&s||a>=s)&&Object.keys(r.O).every((t=>r.O[t](n[c])))?n.splice(c--,1):(i=!1,s<a&&(a=s));if(i){e.splice(l--,1);var d=o();void 0!==d&&(t=d)}}return t}s=s||0;for(var l=e.length;l>0&&e[l-1][2]>s;l--)e[l]=e[l-1];e[l]=[n,o,s]},r.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return r.d(e,{a:e}),e},r.d=(t,e)=>{for(var n in e)r.o(e,n)&&!r.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),r.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.nmd=t=>(t.paths=[],t.children||(t.children=[]),t),r.j=788,(()=>{r.b=document.baseURI||self.location.href;var t={788:0};r.O.j=e=>0===t[e];var e=(e,n)=>{var o,s,a=n[0],i=n[1],c=n[2],d=0;if(a.some((e=>0!==t[e]))){for(o in i)r.o(i,o)&&(r.m[o]=i[o]);if(c)var l=c(r)}for(e&&e(n);d<a.length;d++)s=a[d],r.o(t,s)&&t[s]&&t[s][0](),t[s]=0;return r.O(l)},n=self.webpackChunknextcloud=self.webpackChunknextcloud||[];n.forEach(e.bind(null,0)),n.push=e.bind(null,n.push.bind(n))})(),r.nc=void 0;var s=r.O(void 0,[7874],(()=>r(95922)));s=r.O(s)})(); //# sourceMappingURL=settings-vue-settings-admin-security.js.map?v=d7a8e1c729da224b4417