Files
Fuchs_Intranet/Fuchs/wwwroot/web/fis.admin.de.min.js
T
StefanandClaude Sonnet 5 a5f497090e
Playwright Tests / test (push) Canceled after 0s
Add Administration user management: list, password reset, email change, group assignments
Wires the previously-unused fis_admin_* user/group stored procs into the Admin
module (fds_sys-gated), adds a users grid with a per-row ribbon (reset
password, change email, manage group membership), and always emails a
password reset result to the user rather than showing it to the admin.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-09 10:34:04 +02:00

1 line
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
let $adt={mdl:"Administration",sub_info:"System",sub_status:"Status & Konnektivität",sub_tests:"Tests",startup:"Startup-Prüfungen",startup_notrun:"Die Startup-Prüfungen sind deaktiviert oder wurden noch nicht ausgeführt (Fuchs:StartupChecks:Enabled).",startup_on:"Host",startup_at:"Ausgeführt (UTC)",chk_ok:"OK",chk_fail:"Fehler",chk_skipped:"übersprungen",chk_KeyVault:"Azure Key Vault",chk_Database:"SQL-Datenbank",chk_MFR:"MFR (ERP)",chk_PdfLicense:"Spire.PDF-Lizenz",chk_Mailer:"E-Mail (Startup-Probe)",host:"Host / Server",machine:"Hostname",os:"Betriebssystem",framework:"Framework",env:"Umgebung",testdep:"Test-Deployment",pid:"Prozess-ID",uptime:"Laufzeit",since:"Start (UTC)",hours:"Std.",db:"SQL-Datenbank",mail:"E-Mail-Dienst",blob:"Azure Blob Storage",mfr:"MFR (ERP)",kv:"Azure Key Vault",server:"Server",catalog:"Datenbank",login:"Login",mailer:"Mailer aktiv",baseurl:"Base-URL",account:"Account",serverid:"Server-ID",token:"Token hinterlegt",override:"OverrideRecipient",overrideActive:"Umleitung aktiv",enabled:"Aktiviert",configured:"Konfiguriert",invContainer:"Rechnungs-Container",remContainer:"Mahnungs-Container",host_l:"Host",creds:"Zugangsdaten hinterlegt",sync:"Sync aktiv",vault:"Vault-URI",appname:"App-Präfix",seccount:"Verwaltete Secrets",clientreg:"Client registriert",duration:"Dauer",checked:"Geprüft",detail:"Detail",st_ok:"OK",st_error:"Fehler",st_disabled:"Deaktiviert",st_unconfigured:"Nicht konfiguriert",st_checking:"Prüfe…",refresh:"Aktualisieren",refreshAll:"Alle prüfen",yes:"Ja",no:"Nein",testmail:"Test-E-Mail",testmail_btn:"Test-E-Mail senden",tm_to:"Empfänger",tm_subject:"Betreff",tm_body:"Nachricht",tm_hint:"Der Versand nutzt die normale E-Mail-Pipeline; bei gesetztem OverrideRecipient wird die Nachricht dorthin umgeleitet.",tm_sent:"Test-E-Mail übergeben.",tm_failed:"Test-E-Mail konnte nicht gesendet werden.",tm_default_subject:"Fuchs Intranet – Test-E-Mail",tm_default_body:"Dies ist eine Test-E-Mail aus dem Administrationsbereich des Fuchs Intranet.",loadfail:"Der Systemstatus konnte nicht geladen werden.",sub_users:"Benutzerverwaltung",u_title:"Benutzerkonten",u_col_name:"Name",u_col_email:"E-Mail",u_col_status:"Status",u_active:"Aktiv",u_disabled:"Deaktiviert",u_pwdreset:"Passwort zurücksetzen",u_pwdreset_btn:"Zurücksetzen",u_pwd_field:"Neues Passwort",u_pwd_hint:"Leer lassen, um automatisch ein Passwort zu generieren. In jedem Fall wird das neue Passwort per E-Mail an den Benutzer gesendet.",u_pwdreset_sent:"Das neue Passwort wurde per E-Mail an den Benutzer gesendet.",u_pwdreset_noemail:"Das Passwort wurde zurückgesetzt, konnte aber nicht per E-Mail zugestellt werden.",u_email:"E-Mail-Adresse ändern",u_email_field:"E-Mail-Adresse",u_groups:"Gruppenzugehörigkeit",u_groups_title:"Gruppen – {0}",u_err:{requirements:"Das Passwort erfüllt nicht die Mindestanforderungen (mind. 6 Zeichen).",duplicate_email:"Diese E-Mail-Adresse ist bereits einem anderen Benutzerkonto zugeordnet.",reset_failed:"Das Passwort konnte nicht zurückgesetzt werden.",change_failed:"Die Änderung konnte nicht gespeichert werden."},u_err_generic:"Die Änderung konnte nicht gespeichert werden."},$adm={init2:function(){$ocms.getScript([],(function(){$adm.init3()}))},init3:function(){$fis.cf(!0),$fis.lf(!0),$("#activemodule").text($adt.mdl),$adm.topbar();let e=$$.dc("admfrm",$("#contentframe")).ldng(1);$adm.load(e)},topbar:function(){return $("#topbar").ocmsmenu([{lbl:$adt.refreshAll,id:"adm_refresh_all",ico:"glyphicon glyphicon-refresh",fnc:function(){$adm.init3()}}])},uMn:function(e){return $("#topbar").ocmsmenu([{lbl:$adt.u_pwdreset,fnc:function(){$adm.pwdResetDlg(e)}},{lbl:$adt.u_email,fnc:function(){$adm.emailDlg(e)}},{lbl:$adt.u_groups,fnc:function(){$adm.groupsDlg(e)}}])},load:function(e){$ocms.postXT({url:$ocms.url("admin/status"),success:function(t){e.empty(),$adm.render(e,t.info||{},t.probes||[])},error:function(){e.empty(),$$.dc("adm_err",e).text($adt.loadfail)},complete:function(){e.ldng(0)}})},render:function(e,t,a){let d={};$.each(a,(function(e,t){d[t.component]=t})),$$.dc("adm_sec",e).text($adt.sub_info),$adm.sysCard(e,t),$adm.startupCard(e,t.startupChecks),$$.dc("adm_sec",e).text($adt.sub_status);let r=$$.dc("adm_grid",e);$adm.dbCard(r,t.database||{},d.database),$adm.mailCard(r,t.email||{}),$adm.blobCard(r,t.blob||{},d.blob),$adm.mfrCard(r,t.mfr||{},d.mfr),$adm.kvCard(r,t.keyVault||{},d.keyvault),$$.dc("adm_sec",e).text($adt.sub_users),$adm.usersCard(e)},usersCard:function(e){let t=$$.dc("adm_card adm_card_wide",e),a=$$.dc("adm_card_hd",t);$$.s($adt.u_title).appendTo(a);let d=$$.dc("adm_card_bd adm_users_bd",t);$adm.renderUsers(d)},renderUsers:function(e){e.empty();let t=$$.tblset({},e),a=$$.tr(t.hd);$.each([$adt.u_col_name,$adt.u_col_email,$adt.u_col_status],(function(e,t){$$.th(a).text(t)})),$ocms.postXT({url:$ocms.url("admin/users"),success:function(e){$.each(e.users||[],(function(e,a){let d=$$.tr(t.bdy,{id:"adu"+a.useraccount_id});$$.td(d).text(`${a.firstname||""} ${a.name||""}`.trim()),$$.td(d).text(a.email||""),$$.td(d).text(!0===bool(a.disabled,!1)?$adt.u_disabled:$adt.u_active),d.click((function(){d.toggleClass("selected").siblings().rC("selected"),!0===d.is(".selected")?$adm.uMn(a):$adm.topbar()}))}))},error:function(){$$.dc("adm_err",e).text($adt.loadfail)}})},pwdResetDlg:function(e){$ocms.dlgform([{name:"useraccount_id",type:"hidden",value:e.useraccount_id},{name:"newpassword",label:$adt.u_pwd_field,type:"string",note:$adt.u_pwd_hint}],{title:$adt.u_pwdreset,button:$adt.u_pwdreset_btn,submit:function(e){let t=$(this).ldng(1),a=t.serializeObject(!0,{typedvalues:!0});$ocms.postXT({url:$ocms.url("admin/userpwdreset"),data:a,success:function(e){alert(!0===e.emailed?$adt.u_pwdreset_sent:$adt.u_pwdreset_noemail),t.trigger("modal_close")},error:function(e){let t=((e||{}).responseJSON||{}).error;alert($adt.u_err[t]||$adt.u_err_generic)},complete:function(){t.ldng(0),$adm.renderUsers($(".adm_users_bd")),$adm.topbar()}})}})},emailDlg:function(e){$ocms.dlgform([{name:"useraccount_id",type:"hidden",value:e.useraccount_id},{name:"email",label:$adt.u_email_field,type:"email",required:!0,value:e.email}],{title:$adt.u_email,submit:function(e){let t=$(this).ldng(1),a=t.serializeObject(!0,{typedvalues:!0});$ocms.postXT({url:$ocms.url("admin/useremail"),data:a,success:function(){t.trigger("modal_close")},error:function(e){let t=((e||{}).responseJSON||{}).error;alert($adt.u_err[t]||$adt.u_err_generic)},complete:function(){t.ldng(0),$adm.renderUsers($(".adm_users_bd")),$adm.topbar()}})}})},groupsDlg:function(e){let t=$$.dc("adm_groups_dlg");$ocms.postXT({url:$ocms.url("admin/usergroups"),data:{useraccount_id:e.useraccount_id},success:function(a){$.each(a.groups||[],(function(a,d){let r=$$.dc("adm_group_row",t),n="adg"+d.usergroup_id,s=$$.i({type:"checkbox",id:n}).prop("checked",bool(d.member,!1)).appendTo(r);$$.lbl(d.name,{for:n}).appendTo(r),s.change((function(){let t=s.prop("checked");$ocms.postXT({url:$ocms.url("admin/usergroupset"),data:{useraccount_id:e.useraccount_id,usergroup_id:d.usergroup_id,member:t},error:function(){s.prop("checked",!t),alert($adt.u_err_generic)}})}))}))}}),$ocms.dlg(t,{title:string($adt.u_groups_title,[`${e.firstname||""} ${e.name||""}`.trim()]),size:[420,380]})},kvTable:function(e,t){let a=$$.tbl().addClass("adm_kv");return $.each(t||[],(function(e,t){if(!t)return!0;let d=$$.tr(a);$$.td(d).addClass("k").text(null==t[0]?"":String(t[0]));let r=$$.td(d).addClass("v");t[1]instanceof jQuery?r.append(t[1]):r.text(null==t[1]?"":String(t[1]))})),e instanceof jQuery&&e.append(a),a},yesNo:function(e){return $$.sc("adm_bool adm_bool_"+(e?"y":"n"),e?$adt.yes:$adt.no)},setPill:function(e,t){let a=(t=t||{}).status||"unconfigured",d={ok:$adt.st_ok,error:$adt.st_error,disabled:$adt.st_disabled,unconfigured:$adt.st_unconfigured,checking:$adt.st_checking}[a]||a;return e.attr("class","adm_pill adm_pill_"+a).text(d),e},probeCard:function(e,t,a,d,r){let n=$$.dc("adm_card",e),s=$$.dc("adm_card_hd",n);$$.s(t).appendTo(s);let i=$$.sc("adm_pill").appendTo(s),o=$$.bbtn($adt.refresh,"adm_btn").appendTo(s),c=$$.dc("adm_card_bd",n);$adm.kvTable(c,d);let l=$$.dc("adm_probe",c),u=$$.dc("adm_probe_msg",l),m=$$.dc("adm_probe_metrics",l),_=$$.dc("adm_probe_det",l),p=$$.dc("adm_probe_dur",l),f=function(e){e=e||{},$adm.setPill(i,e),u.text(e.message||""),m.empty(),$.each(e.metrics||[],(function(e,t){let a=$$.dc("adm_metric",m);$$.sc("adm_metric_k").text(t.label||"").appendTo(a),$$.sc("adm_metric_v").text(null==t.value?"":String(t.value)).appendTo(a)})),_.text(e.detail||""),p.text(null!=e.durationMs?e.durationMs+" ms":"")};return f(r),o.click((function(){$adm.setPill(i,{status:"checking"}),u.text(""),m.empty(),_.text(""),p.text(""),$ocms.postXT({url:$ocms.url("admin/probe/"+a),success:function(e){f(e.probe)},error:function(){$adm.setPill(i,{status:"error"}),u.text($adt.st_error)}})})),n},sysCard:function(e,t){let a=$$.dc("adm_card adm_card_wide",e),d=$$.dc("adm_card_hd",a);$$.s($adt.host).appendTo(d);let r=$$.sc("adm_env").text(t.environment||"");!0===t.isTestDeployment&&r.aC("adm_env_test"),r.appendTo(d);let n=$$.dc("adm_card_bd",a);$adm.kvTable(n,[[$adt.machine,t.machineName],[$adt.os,t.osDescription],[$adt.framework,t.frameworkDescription],[$adt.env,t.environment],[$adt.testdep,$adm.yesNo(!0===t.isTestDeployment)],[$adt.pid,t.processId],[$adt.since,t.processStartUtc?fdt(t.processStartUtc):""],[$adt.uptime,null!=t.uptimeHours?t.uptimeHours+" "+$adt.hours:""]])},startupCard:function(e,t){let a=$$.dc("adm_card adm_card_wide",e),d=$$.dc("adm_card_hd",a);$$.s($adt.startup).appendTo(d);let r=$$.dc("adm_card_bd",a);if(!t||!0!==t.ran)return $adm.setPill($$.sc("adm_pill").appendTo(d),{status:"disabled"}),void $$.dc("adm_note",r).text($adt.startup_notrun);let n=t.items||[],s=!1;$.each(n,(function(e,t){!0===t.enabled&&!0!==t.ok&&(s=!0)})),$adm.setPill($$.sc("adm_pill").appendTo(d),{status:s?"error":"ok"}),$adm.kvTable(r,[[$adt.startup_on,t.machineName],[$adt.startup_at,t.completedUtc?fdt(t.completedUtc):""]]);let i=$$.dc("adm_checks",r);$.each(n,(function(e,t){let a=$$.dc("adm_check",i);$$.sc("adm_check_k").text($adt["chk_"+t.name]||t.name).appendTo(a);let d=!0!==t.enabled?"skipped":!0===t.ok?"ok":"fail",r={ok:$adt.chk_ok,fail:$adt.chk_fail,skipped:$adt.chk_skipped}[d];$$.sc("adm_check_v adm_check_"+d).text(r).appendTo(a)}))},dbCard:function(e,t,a){$adm.probeCard(e,$adt.db,"database",[[$adt.configured,$adm.yesNo(!0===t.configured)],[$adt.server,t.server],[$adt.catalog,t.catalog],[$adt.login,t.userId]],a)},mailCard:function(e,t){let a=$$.dc("adm_card",e),d=$$.dc("adm_card_hd",a);$$.s($adt.mail).appendTo(d),$adm.setPill($$.sc("adm_pill").appendTo(d),{status:!0===t.mailerEnabled?"ok":"disabled"});let r=$$.dc("adm_card_bd",a),n=[[$adt.mailer,$adm.yesNo(!0===t.mailerEnabled)],[$adt.baseurl,t.baseUrl],[$adt.account,t.accountId],[$adt.serverid,t.serverId],[$adt.token,$adm.yesNo(!0===t.tokenConfigured)],[$adt.overrideActive,$adm.yesNo(!0===t.overrideActive)]];!0===t.overrideActive&&n.push([$adt.override,t.overrideRecipient]),$adm.kvTable(r,n);let s=$$.dc("adm_card_ft",a);$$.bbtn($adt.testmail_btn,"adm_btn adm_btn_primary").appendTo(s).click($adm.testMailDlg)},blobCard:function(e,t,a){$adm.probeCard(e,$adt.blob,"blob",[[$adt.enabled,$adm.yesNo(!0===t.enabled)],[$adt.configured,$adm.yesNo(!0===t.configured)],[$adt.invContainer,t.invoiceContainer],[$adt.remContainer,t.reminderContainer]],a)},mfrCard:function(e,t,a){$adm.probeCard(e,$adt.mfr,"mfr",[[$adt.host_l,t.host],[$adt.creds,$adm.yesNo(!0===t.credentialsConfigured)],[$adt.sync,$adm.yesNo(!0===t.syncEnabled)]],a)},kvCard:function(e,t,a){$adm.probeCard(e,$adt.kv,"keyvault",[[$adt.vault,t.vaultUri],[$adt.appname,t.appName],[$adt.seccount,t.managedSecretCount],[$adt.clientreg,$adm.yesNo(!0===t.clientRegistered)]],a)},testMailDlg:function(){$ocms.dlgform([{name:"to",label:$adt.tm_to,type:"email",required:!0,value:$ocms.auth.email||""},{name:"subject",label:$adt.tm_subject,type:"string",required:!0,value:$adt.tm_default_subject},{name:"body",label:$adt.tm_body,type:"text",required:!0,value:$adt.tm_default_body}],{title:$adt.testmail,button:$adt.testmail_btn,size:[420,560],addcontent:$$.dc("adm_note").text($adt.tm_hint),url:$ocms.url("admin/testmail"),typedvalues:!0,success:function(e){let t=e&&e.result||{};alert(t.message||(!0===t.sent?$adt.tm_sent:$adt.tm_failed))}})}},$$adm={init2:$adm.init2,auth:{}};export default $$adm;