This commit is contained in:
2026-06-03 09:50:35 +02:00
16 changed files with 183 additions and 29 deletions
+1 -1
View File
@@ -31,7 +31,7 @@
</div> </div>
<div class="data-table-wrap" style="max-height:200px;overflow-y:auto"> <div class="data-table-wrap" style="max-height:200px;overflow-y:auto">
<table class="data-table"> <table class="data-table">
<thead><tr><th>@T["report.col.group"]</th><th>@T["bulkmembers.email"]</th><th>@T["bulkmembers.role"]</th><th>@T["bulkmembers.status"]</th></tr></thead> <thead><tr><th>@T["report.col.group"]<HelpTip Text="@T["help.spGroup"]" Wide="true" /></th><th>@T["bulkmembers.email"]</th><th>@T["bulkmembers.role"]<HelpTip Text="@T["help.spRole"]" Wide="true" /></th><th>@T["bulkmembers.status"]</th></tr></thead>
<tbody> <tbody>
@foreach (var row in _rows.Take(50)) @foreach (var row in _rows.Take(50))
{ {
+2 -2
View File
@@ -18,7 +18,7 @@
<div class="card"> <div class="card">
<div class="form-group"> <div class="form-group">
<label class="form-label">@T["bulksites.adminurl"]</label> <label class="form-label">@T["bulksites.adminurl"]<HelpTip Text="@T["help.adminUrl"]" Wide="true" /></label>
<input class="form-input" @bind="_adminUrl" placeholder="https://contoso-admin.sharepoint.com" /> <input class="form-input" @bind="_adminUrl" placeholder="https://contoso-admin.sharepoint.com" />
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -31,7 +31,7 @@
<div class="alert alert-info mt-8">@string.Format(T["bulksites.validcount"], _rows.Count(r => r.IsValid), _rows.Count(r => !r.IsValid))</div> <div class="alert alert-info mt-8">@string.Format(T["bulksites.validcount"], _rows.Count(r => r.IsValid), _rows.Count(r => !r.IsValid))</div>
<div class="data-table-wrap" style="max-height:200px;overflow-y:auto"> <div class="data-table-wrap" style="max-height:200px;overflow-y:auto">
<table class="data-table"> <table class="data-table">
<thead><tr><th>@T["bulksites.name"]</th><th>@T["bulksites.type"]</th><th>@T["bulksites.alias"]</th><th>@T["bulksites.col.status"]</th></tr></thead> <thead><tr><th>@T["bulksites.name"]</th><th>@T["bulksites.type"]<HelpTip Text="@T["help.siteType"]" Wide="true" /></th><th>@T["bulksites.alias"]<HelpTip Text="@T["help.siteAlias"]" Wide="true" /></th><th>@T["bulksites.col.status"]</th></tr></thead>
<tbody> <tbody>
@foreach (var row in _rows.Take(50)) @foreach (var row in _rows.Take(50))
{ {
+1 -1
View File
@@ -52,7 +52,7 @@
</select> </select>
</div> </div>
<div class="form-group" style="display:flex;align-items:center;padding-top:20px"> <div class="form-group" style="display:flex;align-items:center;padding-top:20px">
<label><input type="checkbox" @bind="_includeSourceFolder" /> @T["transfer.chk.include_source_short"]</label> <label><input type="checkbox" @bind="_includeSourceFolder" /> @T["transfer.chk.include_source_short"]<HelpTip Text="@T["transfer.chk.include_source.tooltip"]" Wide="true" /></label>
</div> </div>
</div> </div>
<div class="flex-row mt-8"> <div class="flex-row mt-8">
+4 -4
View File
@@ -24,9 +24,9 @@
<input class="form-input" type="number" @bind="_folderDepth" min="0" max="999" style="width:80px" /> <input class="form-input" type="number" @bind="_folderDepth" min="0" max="999" style="width:80px" />
</div> </div>
<div class="form-group" style="display:flex;align-items:center;gap:16px;padding-top:20px"> <div class="form-group" style="display:flex;align-items:center;gap:16px;padding-top:20px">
<label><input type="checkbox" @bind="_includeInherited" /> @T["chk.inherited.perms"]</label> <label><input type="checkbox" @bind="_includeInherited" /> @T["chk.inherited.perms"]<HelpTip Text="@T["help.inheritedPerms"]" /></label>
<label><input type="checkbox" @bind="_scanFolders" /> @T["chk.scan.folders"]</label> <label><input type="checkbox" @bind="_scanFolders" /> @T["chk.scan.folders"]</label>
<label><input type="checkbox" @bind="_includeSubsites" /> @T["chk.include.subsites"]</label> <label><input type="checkbox" @bind="_includeSubsites" /> @T["chk.include.subsites"]<HelpTip Text="@T["help.subsites"]" /></label>
</div> </div>
</div> </div>
<div class="flex-row mt-8"> <div class="flex-row mt-8">
@@ -63,8 +63,8 @@
<th>@T["directory.col.type"]</th> <th>@T["directory.col.type"]</th>
<th>@T["report.col.title"]</th> <th>@T["report.col.title"]</th>
<th>@T["perm.col.users"]</th> <th>@T["perm.col.users"]</th>
<th>@T["perm.col.permission"]</th> <th>@T["perm.col.permission"]<HelpTip Text="@T["help.permissionLevel"]" /></th>
<th>@T["report.col.granted_through"]</th> <th>@T["report.col.granted_through"]<HelpTip Text="@T["help.grantedThrough"]" /></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
+1 -1
View File
@@ -26,7 +26,7 @@
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="form-group"> <div class="form-group">
<label class="form-label">@T["lbl.regex"]</label> <label class="form-label">@T["lbl.regex"]<HelpTip Text="@T["help.regex"]" Wide="true" /></label>
<input class="form-input" @bind="_regex" placeholder="@T["ph.regex"]" /> <input class="form-input" @bind="_regex" placeholder="@T["ph.regex"]" />
</div> </div>
<div class="form-group"> <div class="form-group">
+4 -4
View File
@@ -27,9 +27,9 @@
</div> </div>
<div class="form-row"> <div class="form-row">
<div class="form-group" style="display:flex;align-items:center;gap:16px;padding-top:20px"> <div class="form-group" style="display:flex;align-items:center;gap:16px;padding-top:20px">
<label><input type="checkbox" @bind="_includeSubsites" /> @T["chk.include.subsites"]</label> <label><input type="checkbox" @bind="_includeSubsites" /> @T["chk.include.subsites"]<HelpTip Text="@T["help.subsites"]" /></label>
<label><input type="checkbox" @bind="_includeHidden" /> @T["stor.chk.include_hidden_libs"]</label> <label><input type="checkbox" @bind="_includeHidden" /> @T["stor.chk.include_hidden_libs"]<HelpTip Text="@T["help.hiddenLibs"]" /></label>
<label><input type="checkbox" @bind="_includeRecycleBin" /> @T["stor.chk.include_recycle_bin"]</label> <label><input type="checkbox" @bind="_includeRecycleBin" /> @T["stor.chk.include_recycle_bin"]<HelpTip Text="@T["help.recycleBin"]" /></label>
</div> </div>
</div> </div>
<div class="flex-row mt-8"> <div class="flex-row mt-8">
@@ -62,7 +62,7 @@
<th>@T["stor.col.site"]</th> <th>@T["stor.col.site"]</th>
<th class="num">@T["stor.col.files"]</th> <th class="num">@T["stor.col.files"]</th>
<th class="num">@T["stor.col.total_mb"]</th> <th class="num">@T["stor.col.total_mb"]</th>
<th class="num">@T["stor.col.versions_mb"]</th> <th class="num">@T["stor.col.versions_mb"]<HelpTip Text="@T["help.versionStorage"]" /></th>
<th>@T["stor.col.lastmod"]</th> <th>@T["stor.col.lastmod"]</th>
</tr> </tr>
</thead> </thead>
+5 -5
View File
@@ -17,16 +17,16 @@
<div style="display:grid;grid-template-columns:1fr 1fr;gap:16px"> <div style="display:grid;grid-template-columns:1fr 1fr;gap:16px">
<div class="card"> <div class="card">
<div class="card-title">@T["templates.capture"]</div> <div class="card-title">@T["templates.capture"]<HelpTip Text="@T["help.templateCapture"]" Wide="true" /></div>
<SitePicker Profile="Session.CurrentProfile!" @bind-SelectedSites="_captureSites" Single="true" /> <SitePicker Profile="Session.CurrentProfile!" @bind-SelectedSites="_captureSites" Single="true" />
<div class="form-group mt-8"> <div class="form-group mt-8">
<label class="form-label">@T["templates.name"]</label> <label class="form-label">@T["templates.name"]</label>
<input class="form-input" @bind="_captureName" placeholder="@T["templates.name.placeholder"]" /> <input class="form-input" @bind="_captureName" placeholder="@T["templates.name.placeholder"]" />
</div> </div>
<div class="flex-row" style="flex-wrap:wrap"> <div class="flex-row" style="flex-wrap:wrap">
<label><input type="checkbox" @bind="_capLibraries" /> @T["templates.opt.libraries"]</label> <label><input type="checkbox" @bind="_capLibraries" /> @T["templates.opt.libraries"]<HelpTip Text="@T["help.library"]" /></label>
<label><input type="checkbox" @bind="_capFolders" /> @T["templates.opt.folders"]</label> <label><input type="checkbox" @bind="_capFolders" /> @T["templates.opt.folders"]</label>
<label><input type="checkbox" @bind="_capGroups" /> @T["templates.opt.permissions"]</label> <label><input type="checkbox" @bind="_capGroups" /> @T["templates.opt.permissions"]<HelpTip Text="@T["help.permissionGroups"]" Wide="true" /></label>
</div> </div>
<button class="btn btn-primary mt-8" @onclick="CaptureTemplate" disabled="@_running"> <button class="btn btn-primary mt-8" @onclick="CaptureTemplate" disabled="@_running">
@(_running ? T["templates.btn.capturing"] : T["templates.btn.capture"]) @(_running ? T["templates.btn.capturing"] : T["templates.btn.capture"])
@@ -48,11 +48,11 @@
<input class="form-input" @bind="_newTitle" /> <input class="form-input" @bind="_newTitle" />
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">@T["templates.newalias"]</label> <label class="form-label">@T["templates.newalias"]<HelpTip Text="@T["help.siteAlias"]" Wide="true" /></label>
<input class="form-input" @bind="_newAlias" /> <input class="form-input" @bind="_newAlias" />
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="form-label">@T["templates.adminurl"]</label> <label class="form-label">@T["templates.adminurl"]<HelpTip Text="@T["help.adminUrl"]" Wide="true" /></label>
<input class="form-input" @bind="_adminUrl" placeholder="https://contoso-admin.sharepoint.com" /> <input class="form-input" @bind="_adminUrl" placeholder="https://contoso-admin.sharepoint.com" />
</div> </div>
<button class="btn btn-primary" @onclick="ApplyTemplate" disabled="@_running"> <button class="btn btn-primary" @onclick="ApplyTemplate" disabled="@_running">
+4 -4
View File
@@ -21,7 +21,7 @@
<div class="flex-row"> <div class="flex-row">
<label class="form-label" style="margin:0">@T["audit.lbl.users"]</label> <label class="form-label" style="margin:0">@T["audit.lbl.users"]</label>
<div class="spacer"></div> <div class="spacer"></div>
<label style="font-weight:normal"><input type="checkbox" @bind="_includeGuests" /> @T["directory.chk.guests"]</label> <label style="font-weight:normal"><input type="checkbox" @bind="_includeGuests" /> @T["directory.chk.guests"]<HelpTip Text="@T["help.guests"]" Wide="true" /></label>
<button class="btn btn-secondary btn-sm" @onclick="LoadUsers" disabled="@_loadingUsers"> <button class="btn btn-secondary btn-sm" @onclick="LoadUsers" disabled="@_loadingUsers">
@(_loadingUsers ? string.Format(T["audit.btn.loading"], _loadCount) : T["audit.btn.loadUsers"]) @(_loadingUsers ? string.Format(T["audit.btn.loading"], _loadCount) : T["audit.btn.loadUsers"])
</button> </button>
@@ -58,9 +58,9 @@
<SitePicker Profile="Session.CurrentProfile!" @bind-SelectedSites="_sites" /> <SitePicker Profile="Session.CurrentProfile!" @bind-SelectedSites="_sites" />
<div class="form-row"> <div class="form-row">
<div class="form-group" style="display:flex;align-items:center;gap:16px;padding-top:20px"> <div class="form-group" style="display:flex;align-items:center;gap:16px;padding-top:20px">
<label><input type="checkbox" @bind="_includeInherited" /> @T["audit.chk.includeInherited"]</label> <label><input type="checkbox" @bind="_includeInherited" /> @T["audit.chk.includeInherited"]<HelpTip Text="@T["help.inheritedPerms"]" /></label>
<label><input type="checkbox" @bind="_scanFolders" /> @T["chk.scan.folders"]</label> <label><input type="checkbox" @bind="_scanFolders" /> @T["chk.scan.folders"]</label>
<label><input type="checkbox" @bind="_includeSubsites" /> @T["chk.include.subsites"]</label> <label><input type="checkbox" @bind="_includeSubsites" /> @T["chk.include.subsites"]<HelpTip Text="@T["help.subsites"]" /></label>
</div> </div>
</div> </div>
<div class="flex-row mt-8"> <div class="flex-row mt-8">
@@ -85,7 +85,7 @@
</div> </div>
<div class="data-table-wrap"> <div class="data-table-wrap">
<table class="data-table"> <table class="data-table">
<thead><tr><th>@T["report.col.user"]</th><th>@T["report.col.site"]</th><th>@T["report.col.object"]</th><th>@T["audit.col.permission"]</th><th>@T["report.col.access_type"]</th><th>@T["report.col.granted_through"]</th></tr></thead> <thead><tr><th>@T["report.col.user"]</th><th>@T["report.col.site"]</th><th>@T["report.col.object"]</th><th>@T["audit.col.permission"]<HelpTip Text="@T["help.permissionLevel"]" /></th><th>@T["report.col.access_type"]<HelpTip Text="@T["help.accessType"]" Wide="true" /></th><th>@T["report.col.granted_through"]<HelpTip Text="@T["help.grantedThrough"]" /></th></tr></thead>
<tbody> <tbody>
@foreach (var r in _results.Take(500)) @foreach (var r in _results.Take(500))
{ {
+2 -2
View File
@@ -13,7 +13,7 @@
<div class="card"> <div class="card">
<div class="flex-row"> <div class="flex-row">
<label><input type="checkbox" @bind="_includeGuests" /> @T["directory.chk.guests"]</label> <label><input type="checkbox" @bind="_includeGuests" /> @T["directory.chk.guests"]<HelpTip Text="@T["help.guests"]" Wide="true" /></label>
<button class="btn btn-primary" @onclick="LoadUsers" disabled="@_running"> <button class="btn btn-primary" @onclick="LoadUsers" disabled="@_running">
@(_running ? string.Format(T["directory.btn.loading"], _loadCount) : T["directory.btn.loadUsers"]) @(_running ? string.Format(T["directory.btn.loading"], _loadCount) : T["directory.btn.loadUsers"])
</button> </button>
@@ -32,7 +32,7 @@
</div> </div>
<div class="data-table-wrap"> <div class="data-table-wrap">
<table class="data-table"> <table class="data-table">
<thead><tr><th>@T["directory.col.name"]</th><th>@T["directory.col.upn"]</th><th>@T["directory.col.department"]</th><th>@T["directory.col.jobtitle"]</th><th>@T["directory.col.type"]</th></tr></thead> <thead><tr><th>@T["directory.col.name"]</th><th>@T["directory.col.upn"]<HelpTip Text="@T["help.upn"]" Wide="true" /></th><th>@T["directory.col.department"]</th><th>@T["directory.col.jobtitle"]</th><th>@T["directory.col.type"]<HelpTip Text="@T["help.userType"]" Wide="true" /></th></tr></thead>
<tbody> <tbody>
@foreach (var u in FilteredUsers.Take(500)) @foreach (var u in FilteredUsers.Take(500))
{ {
+3 -3
View File
@@ -25,7 +25,7 @@
@if (_libraries.Count > 0) @if (_libraries.Count > 0)
{ {
<div class="form-group mt-8"> <div class="form-group mt-8">
<label class="form-label">@T["versions.lbl.libsNoneAll"]</label> <label class="form-label">@T["versions.lbl.libsNoneAll"]<HelpTip Text="@T["help.library"]" /></label>
<div style="max-height:200px;overflow-y:auto;border:1px solid var(--border);border-radius:4px;padding:4px"> <div style="max-height:200px;overflow-y:auto;border:1px solid var(--border);border-radius:4px;padding:4px">
@foreach (var lib in _libraries) @foreach (var lib in _libraries)
{ {
@@ -39,11 +39,11 @@
} }
<div class="form-row mt-8"> <div class="form-row mt-8">
<div class="form-group" style="flex:0 0 auto"> <div class="form-group" style="flex:0 0 auto">
<label class="form-label">@T["versions.lbl.keepLastN"]</label> <label class="form-label">@T["versions.lbl.keepLastN"]<HelpTip Text="@T["help.keepVersions"]" Wide="true" /></label>
<input class="form-input" type="number" @bind="_keepLast" min="0" max="999" style="width:80px" /> <input class="form-input" type="number" @bind="_keepLast" min="0" max="999" style="width:80px" />
</div> </div>
<div class="form-group" style="display:flex;align-items:center;padding-top:20px"> <div class="form-group" style="display:flex;align-items:center;padding-top:20px">
<label><input type="checkbox" @bind="_keepFirst" /> @T["versions.chk.keepFirstShort"]</label> <label><input type="checkbox" @bind="_keepFirst" /> @T["versions.chk.keepFirstShort"]<HelpTip Text="@T["help.keepFirst"]" /></label>
</div> </div>
</div> </div>
<div class="flex-row mt-8"> <div class="flex-row mt-8">
+35
View File
@@ -0,0 +1,35 @@
@* Clickable "?" button that reveals an explanatory tooltip. Use to demystify SharePoint
jargon for users with limited SharePoint knowledge. Pass the explanation via Text
(typically a localized string: <HelpTip Text="@T["some.help"]" />). Click toggles the
bubble; it closes on a second click or when focus leaves the button. *@
@if (!string.IsNullOrWhiteSpace(Text))
{
<span class="help-tip @(Wide ? "help-tip-wide" : "") @(_open ? "open" : "")">
<button type="button" class="help-tip-mark" @onclick="Toggle" @onclick:stopPropagation="true"
@onclick:preventDefault="true" @onfocusout="Close"
aria-label="@Text" aria-expanded="@_open" title="@Text">?</button>
<span class="help-tip-bubble" role="tooltip">@Text</span>
</span>
}
@code {
/// <summary>The explanation shown inside the tooltip bubble.</summary>
[Parameter] public string? Text { get; set; }
/// <summary>Use a wider bubble for longer explanations.</summary>
[Parameter] public bool Wide { get; set; }
private bool _open;
private void Toggle() => _open = !_open;
// Delay the close so a click that moves focus off the button still toggles cleanly,
// and so the bubble doesn't vanish before a click on it registers.
private async Task Close()
{
await Task.Delay(150);
_open = false;
StateHasChanged();
}
}
+1 -1
View File
@@ -4,7 +4,7 @@
@* Library name field with a picker: type a title, or click Browse to load and @* Library name field with a picker: type a title, or click Browse to load and
choose from the libraries on the selected site. *@ choose from the libraries on the selected site. *@
<div class="form-group library-picker"> <div class="form-group library-picker">
<label class="form-label">@Label</label> <label class="form-label">@Label<HelpTip Text="@T["help.library"]" /></label>
<div class="flex-row" style="gap:8px;align-items:stretch"> <div class="flex-row" style="gap:8px;align-items:stretch">
<input class="form-input" style="flex:1" <input class="form-input" style="flex:1"
placeholder="@Placeholder" placeholder="@Placeholder"
+1 -1
View File
@@ -4,7 +4,7 @@
<div class="site-picker"> <div class="site-picker">
<div class="flex-row" style="gap:8px;align-items:flex-end"> <div class="flex-row" style="gap:8px;align-items:flex-end">
<div class="form-group" style="flex:1"> <div class="form-group" style="flex:1">
<label class="form-label">@(Single ? T["sitepicker.label.site"] : T["sitepicker.label.sites"])</label> <label class="form-label">@(Single ? T["sitepicker.label.site"] : T["sitepicker.label.sites"])<HelpTip Text="@T["sitepicker.help.site"]" /></label>
<input class="form-input" @bind="_filter" @bind:event="oninput" placeholder="@T["sitepicker.ph.filter"]" /> <input class="form-input" @bind="_filter" @bind:event="oninput" placeholder="@T["sitepicker.ph.filter"]" />
</div> </div>
<button class="btn btn-secondary" @onclick="LoadSites" disabled="@_loading"> <button class="btn btn-secondary" @onclick="LoadSites" disabled="@_loading">
+24
View File
@@ -1863,4 +1863,28 @@ Cet onglet fait l'inverse : vous sélectionnez un ou plusieurs utilisateurs et i
<data name="writeguard.readonly.emphasis" xml:space="preserve"> <data name="writeguard.readonly.emphasis" xml:space="preserve">
<value>lecture seule</value> <value>lecture seule</value>
</data> </data>
<!-- Infobulles HelpTip : explications en langage clair du jargon SharePoint -->
<data name="sitepicker.help.site" xml:space="preserve"><value>Un site SharePoint est un conteneur (avec sa propre adresse) regroupant des bibliothèques de documents, des listes et des permissions — par exemple un espace d'équipe ou de projet.</value></data>
<data name="help.library" xml:space="preserve"><value>Une bibliothèque de documents est un conteneur SharePoint pour stocker des fichiers, avec historique des versions, métadonnées et permissions propres — comme un dossier partagé intelligent.</value></data>
<data name="help.inheritedPerms" xml:space="preserve"><value>Les permissions héritées sont transmises automatiquement depuis le site ou dossier parent. Incluez-les pour voir les accès obtenus indirectement, pas seulement ceux définis ici.</value></data>
<data name="help.subsites" xml:space="preserve"><value>Les sous-sites sont des sites imbriqués sous le site sélectionné. Activez pour les inclure aussi dans l'opération.</value></data>
<data name="help.permissionLevel" xml:space="preserve"><value>Un niveau d'autorisation est un ensemble nommé de droits (par ex. Contrôle total, Modifier, Lecture) définissant ce qu'un utilisateur peut faire.</value></data>
<data name="help.grantedThrough" xml:space="preserve"><value>Indique comment l'accès a été obtenu : accordé directement à l'utilisateur, ou via un groupe SharePoint ou Microsoft 365 auquel il appartient.</value></data>
<data name="help.hiddenLibs" xml:space="preserve"><value>Les bibliothèques masquées/système sont utilisées en interne par SharePoint et n'apparaissent pas dans la navigation normale. Incluez-les pour une vue complète du stockage.</value></data>
<data name="help.recycleBin" xml:space="preserve"><value>La corbeille conserve temporairement les éléments supprimés avant leur suppression définitive. Leur taille compte encore dans le stockage tant qu'ils ne sont pas purgés.</value></data>
<data name="help.versionStorage" xml:space="preserve"><value>Espace occupé par les anciennes versions enregistrées des fichiers. SharePoint conserve un historique de chaque fichier, et ces copies consomment du stockage.</value></data>
<data name="help.keepVersions" xml:space="preserve"><value>Nombre de versions les plus récentes à conserver pour chaque fichier. Les versions plus anciennes au-delà de ce nombre sont supprimées pour libérer de l'espace.</value></data>
<data name="help.keepFirst" xml:space="preserve"><value>Conserver aussi la toute première version (originale) de chaque fichier — utile pour la traçabilité — même en supprimant les autres anciennes versions.</value></data>
<data name="help.spGroup" xml:space="preserve"><value>Un groupe SharePoint est un ensemble nommé d'utilisateurs auquel les permissions sont attribuées (par ex. Propriétaires, Membres, Visiteurs du site).</value></data>
<data name="help.spRole" xml:space="preserve"><value>Le rôle / niveau d'autorisation donné à l'utilisateur dans le groupe : Propriétaire (contrôle total), Membre (modification) ou Visiteur (lecture).</value></data>
<data name="help.adminUrl" xml:space="preserve"><value>L'URL du centre d'administration SharePoint (par ex. https://contoso-admin.sharepoint.com). Requise pour créer ou gérer des sites à l'échelle du tenant.</value></data>
<data name="help.siteType" xml:space="preserve"><value>Le modèle de site : un site d'équipe pour la collaboration de groupe, ou un site de communication pour diffuser du contenu à de nombreux lecteurs.</value></data>
<data name="help.siteAlias" xml:space="preserve"><value>Le nom court et compatible URL du site, utilisé dans son adresse (par ex. « marketing » dans /sites/marketing) et son groupe Microsoft 365.</value></data>
<data name="help.regex" xml:space="preserve"><value>Une expression régulière : un motif avancé pour rechercher des noms de fichiers (par ex. ^Facture.*\.pdf$). Laissez vide pour tout inclure.</value></data>
<data name="help.guests" xml:space="preserve"><value>Les invités sont des utilisateurs externes, hors de votre organisation, à qui un accès a été accordé. Activez pour les inclure.</value></data>
<data name="help.accessType" xml:space="preserve"><value>Comment l'utilisateur atteint l'élément : par permissions directes, appartenance à un groupe, ou héritage d'un parent.</value></data>
<data name="help.upn" xml:space="preserve"><value>User Principal Name (UPN) — l'identifiant de connexion unique de l'utilisateur dans Entra ID (Azure AD), généralement au format e-mail.</value></data>
<data name="help.userType" xml:space="preserve"><value>Membre = un compte interne à votre organisation ; Invité = un utilisateur externe invité d'une autre organisation.</value></data>
<data name="help.templateCapture" xml:space="preserve"><value>La capture enregistre la structure d'un site (bibliothèques, dossiers, groupes de permissions) comme modèle réutilisable pour créer de nouveaux sites.</value></data>
<data name="help.permissionGroups" xml:space="preserve"><value>Les groupes de permissions du site (Propriétaires, Membres, Visiteurs) et leurs membres, afin de recréer la même configuration d'accès.</value></data>
</root> </root>
+24
View File
@@ -1863,4 +1863,28 @@ This tab does the reverse: you select one or more users and it finds every objec
<data name="writeguard.readonly.emphasis" xml:space="preserve"> <data name="writeguard.readonly.emphasis" xml:space="preserve">
<value>read-only</value> <value>read-only</value>
</data> </data>
<!-- HelpTip explanations: plain-language hints for SharePoint jargon -->
<data name="sitepicker.help.site" xml:space="preserve"><value>A SharePoint site is a container (with its own address) that holds document libraries, lists and permissions — for example a team or project workspace.</value></data>
<data name="help.library" xml:space="preserve"><value>A document library is a SharePoint container for storing files, with version history, metadata and its own permissions — like a smart shared folder.</value></data>
<data name="help.inheritedPerms" xml:space="preserve"><value>Inherited permissions are passed down automatically from the parent site or folder. Include them to see access users get indirectly, not just access set directly here.</value></data>
<data name="help.subsites" xml:space="preserve"><value>Subsites are sites nested under the selected site. Enable to include them in the operation as well.</value></data>
<data name="help.permissionLevel" xml:space="preserve"><value>A permission level is a named bundle of rights (e.g. Full Control, Edit, Read) that defines what a user is allowed to do.</value></data>
<data name="help.grantedThrough" xml:space="preserve"><value>Shows how the access was obtained: granted directly to the user, or via a SharePoint or Microsoft 365 group they belong to.</value></data>
<data name="help.hiddenLibs" xml:space="preserve"><value>Hidden/system libraries are used internally by SharePoint and don't appear in normal navigation. Include them for a complete storage picture.</value></data>
<data name="help.recycleBin" xml:space="preserve"><value>The recycle bin holds deleted items temporarily before final removal. Their size still counts against storage until purged.</value></data>
<data name="help.versionStorage" xml:space="preserve"><value>Space used by older saved versions of files. SharePoint keeps a history of each file, and those copies consume storage.</value></data>
<data name="help.keepVersions" xml:space="preserve"><value>How many of the most recent versions of each file to keep. Older versions beyond this number are deleted to free storage.</value></data>
<data name="help.keepFirst" xml:space="preserve"><value>Also preserve the very first (original) version of each file — useful for audit trails — even when deleting other old versions.</value></data>
<data name="help.spGroup" xml:space="preserve"><value>A SharePoint group is a named collection of users that permissions are assigned to (e.g. Site Owners, Members, Visitors).</value></data>
<data name="help.spRole" xml:space="preserve"><value>The role / permission level given to the user in the group: Owner (full control), Member (edit) or Visitor (read).</value></data>
<data name="help.adminUrl" xml:space="preserve"><value>The SharePoint admin center URL (e.g. https://contoso-admin.sharepoint.com). Required to create or manage sites across the whole tenant.</value></data>
<data name="help.siteType" xml:space="preserve"><value>The site template: a Team site for group collaboration, or a Communication site for broadcasting content to many readers.</value></data>
<data name="help.siteAlias" xml:space="preserve"><value>The short, URL-friendly name for the site, used in its address (e.g. 'marketing' in /sites/marketing) and its Microsoft 365 group.</value></data>
<data name="help.regex" xml:space="preserve"><value>A regular expression: an advanced pattern for matching file names (e.g. ^Invoice.*\.pdf$). Leave blank to match everything.</value></data>
<data name="help.guests" xml:space="preserve"><value>Guests are external users from outside your organization who have been granted access. Enable to include them.</value></data>
<data name="help.accessType" xml:space="preserve"><value>How the user reaches the item: through direct permissions, group membership, or inherited from a parent.</value></data>
<data name="help.upn" xml:space="preserve"><value>User Principal Name — the unique sign-in identifier for the user in Entra ID (Azure AD), usually in email format.</value></data>
<data name="help.userType" xml:space="preserve"><value>Member = an account inside your organization; Guest = an external user invited from another organization.</value></data>
<data name="help.templateCapture" xml:space="preserve"><value>Capturing saves a site's structure (libraries, folders, permission groups) as a reusable template you can later apply to create new sites.</value></data>
<data name="help.permissionGroups" xml:space="preserve"><value>The site's permission groups (Owners, Members, Visitors) and their members, so the same access setup can be recreated.</value></data>
</root> </root>
+71
View File
@@ -382,5 +382,76 @@ body {
.folder-node { display: flex; flex-direction: column; gap: 6px; } .folder-node { display: flex; flex-direction: column; gap: 6px; }
.folder-node .folder-node { border-left: 1px solid var(--border); padding-left: 6px; } .folder-node .folder-node { border-left: 1px solid var(--border); padding-left: 6px; }
/* ── HelpTip ("?" badge + hover tooltip explaining SharePoint jargon) ── */
.help-tip {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
vertical-align: middle;
margin-left: 5px;
cursor: help;
outline: none;
}
.help-tip-mark {
display: inline-flex;
align-items: center;
justify-content: center;
width: 16px; height: 16px;
padding: 0; margin: 0;
border: none;
border-radius: 50%;
background: var(--accent-soft);
color: var(--accent);
font-size: 10px; font-weight: 700;
font-family: var(--font, inherit);
line-height: 1;
cursor: pointer;
user-select: none;
}
.help-tip-mark:hover,
.help-tip.open .help-tip-mark { background: var(--accent); color: #fff; }
.help-tip-mark:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.help-tip-bubble {
position: absolute;
bottom: calc(100% + 8px);
left: -8px;
transform: translateY(4px);
z-index: 60;
width: max-content;
max-width: 280px;
padding: 8px 10px;
border-radius: var(--radius-md);
background: var(--card-bg);
color: var(--text);
border: 1px solid var(--border);
box-shadow: var(--shadow-card);
font-size: 12px;
font-weight: 400;
line-height: 1.45;
text-align: left;
text-transform: none;
letter-spacing: normal;
white-space: normal;
opacity: 0;
visibility: hidden;
pointer-events: none;
transition: opacity .12s ease, transform .12s ease;
}
.help-tip-wide .help-tip-bubble { max-width: 340px; }
.help-tip-bubble::after {
content: "";
position: absolute;
top: 100%;
left: 12px;
border: 5px solid transparent;
border-top-color: var(--border);
}
.help-tip.open .help-tip-bubble {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
/* ── Theme (light-only palette; System resolves via JS) ── */ /* ── Theme (light-only palette; System resolves via JS) ── */
[data-theme="light"] { color-scheme: light; } [data-theme="light"] { color-scheme: light; }