Browse Source

Help (#931)

* Fix timeouts.

* Correctly save the Validate flag of workflows.

* New bulk endpoint.

* Update packages.

* Fix tests

* Fix SDK version.

* Add some docs.

* Improve help screens and history.
pull/934/head
Sebastian Stehle 4 years ago
committed by GitHub
parent
commit
d36dd47ba1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 15
      backend/i18n/source/backend_en.json
  2. 74
      backend/src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs
  3. 11
      backend/src/Squidex.Domain.Apps.Entities/Teams/TeamHistoryEventsCreator.cs
  4. 25
      backend/src/Squidex.Shared/Texts.it.resx
  5. 25
      backend/src/Squidex.Shared/Texts.nl.resx
  6. 25
      backend/src/Squidex.Shared/Texts.resx
  7. 25
      backend/src/Squidex.Shared/Texts.zh.resx
  8. 2
      frontend/src/app/app.module.ts
  9. 53
      frontend/src/app/features/administration/module.ts
  10. 12
      frontend/src/app/features/administration/pages/event-consumers/event-consumers-page.component.html
  11. 116
      frontend/src/app/features/administration/pages/restore/restore-page.component.html
  12. 10
      frontend/src/app/features/administration/pages/users/users-page.component.html
  13. 9
      frontend/src/app/features/schemas/module.ts
  14. 4
      frontend/src/app/features/schemas/pages/schema/schema-page.component.html
  15. 62
      frontend/src/app/features/settings/module.ts
  16. 4
      frontend/src/app/features/settings/pages/asset-scripts/asset-scripts-page.component.html
  17. 20
      frontend/src/app/features/settings/pages/more/more-page.component.html
  18. 6
      frontend/src/app/features/settings/pages/plans/plans-page.component.html
  19. 16
      frontend/src/app/features/settings/pages/settings/settings-page.component.html
  20. 10
      frontend/src/app/features/settings/pages/templates/templates-page.component.html
  21. 4
      frontend/src/app/features/settings/pages/workflows/workflows-page.component.html
  22. 25
      frontend/src/app/features/teams/module.ts
  23. 18
      frontend/src/app/features/teams/pages/more/more-page.component.html
  24. 7
      frontend/src/app/features/teams/pages/plans/plans-page.component.html
  25. 14
      frontend/src/app/shared/components/assets/asset-history.component.scss
  26. 12
      frontend/src/app/shared/components/history/history-list.component.scss
  27. 5
      frontend/src/app/shared/components/history/history.component.ts
  28. 4
      frontend/src/app/shell/pages/internal/apps-menu.component.html
  29. 4
      frontend/src/app/theme/_common.scss

15
backend/i18n/source/backend_en.json

@ -217,6 +217,7 @@
"history.apps.clientUpdated": "updated client {[Id]}",
"history.apps.contributoreAssigned": "assigned {user:[Contributor]} as {[Role]}",
"history.apps.contributoreRemoved": "removed {user:[Contributor]} from app",
"history.apps.created": "created the app.",
"history.apps.imageRemoved": "removed app image",
"history.apps.imageUploaded": "uploaded a new app image",
"history.apps.languagedAdded": "added language {[Language]}",
@ -231,6 +232,9 @@
"history.apps.settingsUpdated": "updated UI settings",
"history.apps.transfered": "updated app to client",
"history.apps.updated": "updated general settings",
"history.apps.workflowAdded": "added workflow {[Name]}.",
"history.apps.workflowDeleted": "deleted a workflow.",
"history.apps.workflowUpdated": "updated a workflow.",
"history.assets.replaced": "replaced asset.",
"history.assets.updated": "updated asset.",
"history.assets.uploaded": "uploaded asset.",
@ -256,11 +260,12 @@
"history.schemas.unpublished": "unpublished schema {[Name]}.",
"history.schemas.updated": "updated schema {[Name]}.",
"history.statusChanged": "changed status of {[Schema]} content to {[Status]}.",
"history.teams.contributoreAssigned": "assigned {user:[Contributor]} as {[Role]}",
"history.teams.contributoreRemoved": "removed {user:[Contributor]} from team",
"history.teams.planChanged": "changed plan to {[Plan]}",
"history.teams.planReset": "resetted plan",
"history.teams.updated": "updated general settings",
"history.teams.contributoreAssigned": "assigned {user:[Contributor]} as {[Role]}.",
"history.teams.contributoreRemoved": "removed {user:[Contributor]} from team.",
"history.teams.created": "has created team {[Name]}.",
"history.teams.planChanged": "changed plan to {[Plan]}.",
"history.teams.planReset": "resetted plan.",
"history.teams.updated": "updated general settings and renamed name to {[Name]}.",
"login.githubPrivateEmail": "Your email address is set to private in Github. Please set it to public to use Github login.",
"rules.ruleAlreadyRunning": "Another rule is already running.",
"schemas.dateTimeCalculatedDefaultAndDefaultError": "Calculated default value and default value cannot be used together.",

74
backend/src/Squidex.Domain.Apps.Entities/Apps/AppHistoryEventsCreator.cs

@ -18,11 +18,11 @@ namespace Squidex.Domain.Apps.Entities.Apps
public AppHistoryEventsCreator(TypeNameRegistry typeNameRegistry)
: base(typeNameRegistry)
{
AddEventMessage<AppContributorAssigned>(
"history.apps.contributoreAssigned");
AddEventMessage<AppCreated>(
"history.apps.created");
AddEventMessage<AppContributorRemoved>(
"history.apps.contributoreRemoved");
AddEventMessage<AppAssetsScriptsConfigured>(
"history.apps.assetScriptsConfigured");
AddEventMessage<AppClientAttached>(
"history.apps.clientAdded");
@ -33,11 +33,17 @@ namespace Squidex.Domain.Apps.Entities.Apps
AddEventMessage<AppClientUpdated>(
"history.apps.clientUpdated");
AddEventMessage<AppPlanChanged>(
"history.apps.planChanged");
AddEventMessage<AppContributorAssigned>(
"history.apps.contributoreAssigned");
AddEventMessage<AppPlanReset>(
"history.apps.planReset");
AddEventMessage<AppContributorRemoved>(
"history.apps.contributoreRemoved");
AddEventMessage<AppImageRemoved>(
"history.apps.imageRemoved");
AddEventMessage<AppImageUploaded>(
"history.apps.imageUploaded");
AddEventMessage<AppLanguageAdded>(
"history.apps.languagedAdded");
@ -51,8 +57,11 @@ namespace Squidex.Domain.Apps.Entities.Apps
AddEventMessage<AppMasterLanguageSet>(
"history.apps.languagedSetToMaster");
AddEventMessage<AppSettingsUpdated>(
"history.apps.settingsUpdated");
AddEventMessage<AppPlanChanged>(
"history.apps.planChanged");
AddEventMessage<AppPlanReset>(
"history.apps.planReset");
AddEventMessage<AppRoleAdded>(
"history.apps.roleAdded");
@ -63,26 +72,31 @@ namespace Squidex.Domain.Apps.Entities.Apps
AddEventMessage<AppRoleUpdated>(
"history.apps.roleUpdated");
AddEventMessage<AppAssetsScriptsConfigured>(
"history.apps.assetScriptsConfigured");
AddEventMessage<AppUpdated>(
"history.apps.updated");
AddEventMessage<AppSettingsUpdated>(
"history.apps.settingsUpdated");
AddEventMessage<AppTransfered>(
"history.apps.transfered");
AddEventMessage<AppImageUploaded>(
"history.apps.imageUploaded");
AddEventMessage<AppUpdated>(
"history.apps.common.updated");
AddEventMessage<AppImageRemoved>(
"history.apps.imageRemoved");
AddEventMessage<AppWorkflowAdded>(
"history.apps.workflowAdded");
AddEventMessage<AppWorkflowDeleted>(
"history.apps.workflowDeleted");
AddEventMessage<AppWorkflowUpdated>(
"history.apps.workflowUpdated");
}
private HistoryEvent? CreateEvent(IEvent @event)
{
switch (@event)
{
case AppCreated e:
return CreateGeneralEvent(e);
case AppContributorAssigned e:
return CreateContributorsEvent(e, e.ContributorId, e.Role);
case AppContributorRemoved e:
@ -112,9 +126,9 @@ namespace Squidex.Domain.Apps.Entities.Apps
case AppPlanReset e:
return CreatePlansEvent(e);
case AppSettingsUpdated e:
return CreateAssetScriptsEvent(e);
return CreateUIEvent(e);
case AppAssetsScriptsConfigured e:
return CreateGeneralEvent(e);
return CreateAssetScriptsEvent(e);
case AppUpdated e:
return CreateGeneralEvent(e);
case AppTransfered e:
@ -123,6 +137,12 @@ namespace Squidex.Domain.Apps.Entities.Apps
return CreateGeneralEvent(e);
case AppImageRemoved e:
return CreateGeneralEvent(e);
case AppWorkflowAdded e:
return CreateWorkflowEvent(e, e.Name);
case AppWorkflowUpdated e:
return CreateWorkflowEvent(e);
case AppWorkflowDeleted e:
return CreateWorkflowEvent(e);
}
return null;
@ -130,7 +150,7 @@ namespace Squidex.Domain.Apps.Entities.Apps
private HistoryEvent CreateGeneralEvent(IEvent e)
{
return ForEvent(e, "general");
return ForEvent(e, "settings.general");
}
private HistoryEvent CreateContributorsEvent(IEvent e, string contributor, string? role = null)
@ -163,6 +183,16 @@ namespace Squidex.Domain.Apps.Entities.Apps
return ForEvent(e, "settings.assetScripts");
}
private HistoryEvent CreateWorkflowEvent(IEvent e, string? name = null)
{
return ForEvent(e, "settings.workflows").Param("Name", name);
}
private HistoryEvent CreateUIEvent(IEvent e)
{
return ForEvent(e, "settings.ui");
}
protected override Task<HistoryEvent?> CreateEventCoreAsync(Envelope<IEvent> @event)
{
return Task.FromResult(CreateEvent(@event.Payload));

11
backend/src/Squidex.Domain.Apps.Entities/Teams/TeamHistoryEventsCreator.cs

@ -17,6 +17,9 @@ namespace Squidex.Domain.Teams.Entities.Teams
public TeamHistoryEventsCreator(TypeNameRegistry typeNameRegistry)
: base(typeNameRegistry)
{
AddEventMessage<TeamCreated>(
"history.teams.created");
AddEventMessage<TeamContributorAssigned>(
"history.teams.contributoreAssigned");
@ -37,6 +40,8 @@ namespace Squidex.Domain.Teams.Entities.Teams
{
switch (@event)
{
case TeamCreated e:
return CreateGeneralEvent(e, e.Name);
case TeamContributorAssigned e:
return CreateContributorsEvent(e, e.ContributorId, e.Role);
case TeamContributorRemoved e:
@ -46,15 +51,15 @@ namespace Squidex.Domain.Teams.Entities.Teams
case TeamPlanReset e:
return CreatePlansEvent(e);
case TeamUpdated e:
return CreateGeneralEvent(e);
return CreateGeneralEvent(e, e.Name);
}
return null;
}
private HistoryEvent CreateGeneralEvent(IEvent e)
private HistoryEvent CreateGeneralEvent(IEvent e, string? name = null)
{
return ForEvent(e, "settings.general");
return ForEvent(e, "settings.general").Param("Name", name);
}
private HistoryEvent CreateContributorsEvent(IEvent e, string contributor, string? role = null)

25
backend/src/Squidex.Shared/Texts.it.resx

@ -736,6 +736,9 @@
<data name="history.apps.contributoreRemoved" xml:space="preserve">
<value>Rimosso {user:[Contributor]} dall'app</value>
</data>
<data name="history.apps.created" xml:space="preserve">
<value>created the app.</value>
</data>
<data name="history.apps.imageRemoved" xml:space="preserve">
<value>removed app image</value>
</data>
@ -778,6 +781,15 @@
<data name="history.apps.updated" xml:space="preserve">
<value>updated general settings</value>
</data>
<data name="history.apps.workflowAdded" xml:space="preserve">
<value>added workflow {[Name]}.</value>
</data>
<data name="history.apps.workflowDeleted" xml:space="preserve">
<value>deleted a workflow.</value>
</data>
<data name="history.apps.workflowUpdated" xml:space="preserve">
<value>updated a workflow.</value>
</data>
<data name="history.assets.replaced" xml:space="preserve">
<value>ha sostituito la risorsa.</value>
</data>
@ -854,19 +866,22 @@
<value>ha cambiato lo stato del contenuto {[Schema]} in {[Status]}.</value>
</data>
<data name="history.teams.contributoreAssigned" xml:space="preserve">
<value>assigned {user:[Contributor]} as {[Role]}</value>
<value>assigned {user:[Contributor]} as {[Role]}.</value>
</data>
<data name="history.teams.contributoreRemoved" xml:space="preserve">
<value>removed {user:[Contributor]} from team</value>
<value>removed {user:[Contributor]} from team.</value>
</data>
<data name="history.teams.created" xml:space="preserve">
<value>has created team {[Name]}.</value>
</data>
<data name="history.teams.planChanged" xml:space="preserve">
<value>changed plan to {[Plan]}</value>
<value>changed plan to {[Plan]}.</value>
</data>
<data name="history.teams.planReset" xml:space="preserve">
<value>resetted plan</value>
<value>resetted plan.</value>
</data>
<data name="history.teams.updated" xml:space="preserve">
<value>updated general settings</value>
<value>updated general settings and renamed name to {[Name]}.</value>
</data>
<data name="login.githubPrivateEmail" xml:space="preserve">
<value>Il tuo indirizzo email è impostato su privato in Github. Impostalo come pubblico per poter utilizzare il login Github.</value>

25
backend/src/Squidex.Shared/Texts.nl.resx

@ -736,6 +736,9 @@
<data name="history.apps.contributoreRemoved" xml:space="preserve">
<value>heeft {user:[Contributor]} verwijderd uit app</value>
</data>
<data name="history.apps.created" xml:space="preserve">
<value>created the app.</value>
</data>
<data name="history.apps.imageRemoved" xml:space="preserve">
<value>removed app image</value>
</data>
@ -778,6 +781,15 @@
<data name="history.apps.updated" xml:space="preserve">
<value>updated general settings</value>
</data>
<data name="history.apps.workflowAdded" xml:space="preserve">
<value>added workflow {[Name]}.</value>
</data>
<data name="history.apps.workflowDeleted" xml:space="preserve">
<value>deleted a workflow.</value>
</data>
<data name="history.apps.workflowUpdated" xml:space="preserve">
<value>updated a workflow.</value>
</data>
<data name="history.assets.replaced" xml:space="preserve">
<value>item vervangen.</value>
</data>
@ -854,19 +866,22 @@
<value>veranderde status van {[Schema]} inhoud in {[Status]}.</value>
</data>
<data name="history.teams.contributoreAssigned" xml:space="preserve">
<value>assigned {user:[Contributor]} as {[Role]}</value>
<value>assigned {user:[Contributor]} as {[Role]}.</value>
</data>
<data name="history.teams.contributoreRemoved" xml:space="preserve">
<value>removed {user:[Contributor]} from team</value>
<value>removed {user:[Contributor]} from team.</value>
</data>
<data name="history.teams.created" xml:space="preserve">
<value>has created team {[Name]}.</value>
</data>
<data name="history.teams.planChanged" xml:space="preserve">
<value>changed plan to {[Plan]}</value>
<value>changed plan to {[Plan]}.</value>
</data>
<data name="history.teams.planReset" xml:space="preserve">
<value>resetted plan</value>
<value>resetted plan.</value>
</data>
<data name="history.teams.updated" xml:space="preserve">
<value>updated general settings</value>
<value>updated general settings and renamed name to {[Name]}.</value>
</data>
<data name="login.githubPrivateEmail" xml:space="preserve">
<value>Jouw e-mailadres is ingesteld op privé in Github. Stel het in op openbaar om Github-login te gebruiken.</value>

25
backend/src/Squidex.Shared/Texts.resx

@ -736,6 +736,9 @@
<data name="history.apps.contributoreRemoved" xml:space="preserve">
<value>removed {user:[Contributor]} from app</value>
</data>
<data name="history.apps.created" xml:space="preserve">
<value>created the app.</value>
</data>
<data name="history.apps.imageRemoved" xml:space="preserve">
<value>removed app image</value>
</data>
@ -778,6 +781,15 @@
<data name="history.apps.updated" xml:space="preserve">
<value>updated general settings</value>
</data>
<data name="history.apps.workflowAdded" xml:space="preserve">
<value>added workflow {[Name]}.</value>
</data>
<data name="history.apps.workflowDeleted" xml:space="preserve">
<value>deleted a workflow.</value>
</data>
<data name="history.apps.workflowUpdated" xml:space="preserve">
<value>updated a workflow.</value>
</data>
<data name="history.assets.replaced" xml:space="preserve">
<value>replaced asset.</value>
</data>
@ -854,19 +866,22 @@
<value>changed status of {[Schema]} content to {[Status]}.</value>
</data>
<data name="history.teams.contributoreAssigned" xml:space="preserve">
<value>assigned {user:[Contributor]} as {[Role]}</value>
<value>assigned {user:[Contributor]} as {[Role]}.</value>
</data>
<data name="history.teams.contributoreRemoved" xml:space="preserve">
<value>removed {user:[Contributor]} from team</value>
<value>removed {user:[Contributor]} from team.</value>
</data>
<data name="history.teams.created" xml:space="preserve">
<value>has created team {[Name]}.</value>
</data>
<data name="history.teams.planChanged" xml:space="preserve">
<value>changed plan to {[Plan]}</value>
<value>changed plan to {[Plan]}.</value>
</data>
<data name="history.teams.planReset" xml:space="preserve">
<value>resetted plan</value>
<value>resetted plan.</value>
</data>
<data name="history.teams.updated" xml:space="preserve">
<value>updated general settings</value>
<value>updated general settings and renamed name to {[Name]}.</value>
</data>
<data name="login.githubPrivateEmail" xml:space="preserve">
<value>Your email address is set to private in Github. Please set it to public to use Github login.</value>

25
backend/src/Squidex.Shared/Texts.zh.resx

@ -736,6 +736,9 @@
<data name="history.apps.contributoreRemoved" xml:space="preserve">
<value>从应用中删除了 {user:[Contributor]}</value>
</data>
<data name="history.apps.created" xml:space="preserve">
<value>created the app.</value>
</data>
<data name="history.apps.imageRemoved" xml:space="preserve">
<value>removed app image</value>
</data>
@ -778,6 +781,15 @@
<data name="history.apps.updated" xml:space="preserve">
<value>updated general settings</value>
</data>
<data name="history.apps.workflowAdded" xml:space="preserve">
<value>added workflow {[Name]}.</value>
</data>
<data name="history.apps.workflowDeleted" xml:space="preserve">
<value>deleted a workflow.</value>
</data>
<data name="history.apps.workflowUpdated" xml:space="preserve">
<value>updated a workflow.</value>
</data>
<data name="history.assets.replaced" xml:space="preserve">
<value>替换的资源。</value>
</data>
@ -854,19 +866,22 @@
<value>已将 {[Schema]} 内容的状态更改为 {[Status]}。</value>
</data>
<data name="history.teams.contributoreAssigned" xml:space="preserve">
<value>assigned {user:[Contributor]} as {[Role]}</value>
<value>assigned {user:[Contributor]} as {[Role]}.</value>
</data>
<data name="history.teams.contributoreRemoved" xml:space="preserve">
<value>removed {user:[Contributor]} from team</value>
<value>removed {user:[Contributor]} from team.</value>
</data>
<data name="history.teams.created" xml:space="preserve">
<value>has created team {[Name]}.</value>
</data>
<data name="history.teams.planChanged" xml:space="preserve">
<value>changed plan to {[Plan]}</value>
<value>changed plan to {[Plan]}.</value>
</data>
<data name="history.teams.planReset" xml:space="preserve">
<value>resetted plan</value>
<value>resetted plan.</value>
</data>
<data name="history.teams.updated" xml:space="preserve">
<value>updated general settings</value>
<value>updated general settings and renamed name to {[Name]}.</value>
</data>
<data name="login.githubPrivateEmail" xml:space="preserve">
<value>您的邮箱在 Github 中设置为私有。请设置为公开以使用 Github 登录。</value>

2
frontend/src/app/app.module.ts

@ -121,7 +121,7 @@ export class AppModule {
appRef.bootstrap(AppComponent);
} catch (e) {
// eslint-disable-next-line no-console
console.log('Application element not found');
console.log('Application element not found.');
}
}
}

53
frontend/src/app/features/administration/module.ts

@ -7,7 +7,7 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SqxFrameworkModule, SqxSharedModule } from '@app/shared';
import { HelpComponent, SqxFrameworkModule, SqxSharedModule } from '@app/shared';
import { AdministrationAreaComponent, EventConsumerComponent, EventConsumersPageComponent, EventConsumersService, EventConsumersState, RestorePageComponent, UserComponent, UserMustExistGuard, UserPageComponent, UsersPageComponent, UsersService, UsersState } from './declarations';
const routes: Routes = [
@ -17,29 +17,50 @@ const routes: Routes = [
children: [
{
path: '',
pathMatch: 'full',
redirectTo: 'users',
},
{
path: 'event-consumers',
component: EventConsumersPageComponent,
children: [
{
path: 'event-consumers',
component: EventConsumersPageComponent,
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/admin-consumers',
},
},
],
},
{
path: 'restore',
component: RestorePageComponent,
children: [
{
path: 'restore',
component: RestorePageComponent,
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/admin-restore',
},
},
],
},
{
path: 'users',
component: UsersPageComponent,
children: [
{
path: 'users',
component: UsersPageComponent,
children: [
{
path: ':userId',
component: UserPageComponent,
canActivate: [UserMustExistGuard],
},
],
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/admin-users',
},
},
{
path: '',
redirectTo: 'users',
path: ':userId',
component: UserPageComponent,
canActivate: [UserMustExistGuard],
},
],
},

12
frontend/src/app/features/administration/pages/event-consumers/event-consumers-page.component.html

@ -1,6 +1,6 @@
<sqx-title message="i18n:eventConsumers.pageTitle"></sqx-title>
<sqx-layout layout="main" titleText="i18n:common.consumers" titleIcon="time" [innerWidth]="50" [hideSidebar]="true">
<sqx-layout layout="main" titleText="i18n:common.consumers" titleIcon="time" [innerWidth]="50">
<ng-container menu>
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="i18n:eventConsumers.refreshTooltip" shortcut="CTRL + B">
<i class="icon-reset"></i> {{ 'common.refresh' | sqxTranslate }}
@ -39,8 +39,18 @@
</ng-container>
</sqx-list-view>
</ng-container>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>
<ng-container *sqxModal="eventConsumerErrorDialog">
<sqx-modal-dialog (close)="eventConsumerErrorDialog.hide()">
<ng-container title>

116
frontend/src/app/features/administration/pages/restore/restore-page.component.html

@ -1,68 +1,80 @@
<sqx-title message="i18n:backups.restorePageTitle"></sqx-title>
<sqx-layout layout="main" titleText="i18n:backups.restoreTitle" titleIcon="backup" [innerWidth]="70">
<sqx-list-view innerWidth="70rem">
<div class="card section" *ngIf="restoreJob | async; let job">
<div class="card-header">
<div class="row gx-2 align-items-center">
<div class="col-auto">
<div *ngIf="job.status === 'Started'" class="restore-status restore-status-pending spin">
<i class="icon-hour-glass"></i>
<ng-container>
<sqx-list-view innerWidth="70rem">
<div class="card section" *ngIf="restoreJob | async; let job">
<div class="card-header">
<div class="row gx-2 align-items-center">
<div class="col-auto">
<div *ngIf="job.status === 'Started'" class="restore-status restore-status-pending spin">
<i class="icon-hour-glass"></i>
</div>
<div *ngIf="job.status === 'Failed'" class="restore-status restore-status-failed">
<i class="icon-exclamation"></i>
</div>
<div *ngIf="job.status === 'Completed'" class="restore-status restore-status-success">
<i class="icon-checkmark"></i>
</div>
</div>
<div *ngIf="job.status === 'Failed'" class="restore-status restore-status-failed">
<i class="icon-exclamation"></i>
<div class="col">
<h3>{{ 'backups.restoreLastStatus' | sqxTranslate }}</h3>
</div>
<div *ngIf="job.status === 'Completed'" class="restore-status restore-status-success">
<i class="icon-checkmark"></i>
</div>
</div>
<div class="col">
<h3>{{ 'backups.restoreLastStatus' | sqxTranslate }}</h3>
</div>
<div class="col text-end restore-url">
{{job.url}}
<div class="col text-end restore-url">
{{job.url}}
</div>
</div>
</div>
</div>
<div class="card-body">
<div *ngFor="let row of job.log">
{{row}}
</div>
</div>
<div class="card-footer small text-muted">
<div class="row">
<div class="col">
{{ 'backups.restoreStartedLabel' | sqxTranslate }}: {{job.started | sqxISODate}}
<div class="card-body">
<div *ngFor="let row of job.log">
{{row}}
</div>
<div class="col text-end" *ngIf="job.stopped">
{{ 'backups.restoreStoppedLabel' | sqxTranslate }}: {{job.stopped | sqxISODate}}
</div>
<div class="card-footer small text-muted">
<div class="row">
<div class="col">
{{ 'backups.restoreStartedLabel' | sqxTranslate }}: {{job.started | sqxISODate}}
</div>
<div class="col text-end" *ngIf="job.stopped">
{{ 'backups.restoreStoppedLabel' | sqxTranslate }}: {{job.stopped | sqxISODate}}
</div>
</div>
</div>
</div>
</div>
<div class="table-items-row table-items-row-summary">
<form [formGroup]="restoreForm.form" (ngSubmit)="restore()">
<div class="row gx-2">
<div class="col">
<sqx-control-errors for="url"></sqx-control-errors>
<div class="table-items-row table-items-row-summary">
<form [formGroup]="restoreForm.form" (ngSubmit)="restore()">
<div class="row gx-2">
<div class="col">
<sqx-control-errors for="url"></sqx-control-errors>
<input class="form-control" formControlName="url" placeholder="{{ 'backups.restoreLastUrl' | sqxTranslate }}">
</div>
<div class="col">
<sqx-control-errors for="name"></sqx-control-errors>
<input class="form-control" formControlName="url" placeholder="{{ 'backups.restoreLastUrl' | sqxTranslate }}">
</div>
<div class="col">
<sqx-control-errors for="name"></sqx-control-errors>
<input class="form-control" formControlName="name" placeholder="{{ 'backups.restoreNewAppName' | sqxTranslate }}">
</div>
<div class="col-auto">
<button type="submit" class="btn btn-success" [disabled]="restoreForm.hasNoUrl | async">
{{ 'backups.restore' | sqxTranslate }}
</button>
<input class="form-control" formControlName="name" placeholder="{{ 'backups.restoreNewAppName' | sqxTranslate }}">
</div>
<div class="col-auto">
<button type="submit" class="btn btn-success" [disabled]="restoreForm.hasNoUrl | async">
{{ 'backups.restore' | sqxTranslate }}
</button>
</div>
</div>
</div>
</form>
</form>
</div>
</sqx-list-view>
</ng-container>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</sqx-list-view>
</sqx-layout>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>

10
frontend/src/app/features/administration/pages/users/users-page.component.html

@ -55,6 +55,14 @@
</ng-container>
</sqx-list-view>
</ng-container>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>
<router-outlet></router-outlet>

9
frontend/src/app/features/schemas/module.ts

@ -7,7 +7,7 @@
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { HelpComponent, LoadSchemasGuard, SchemaMustExistGuard, SqxFrameworkModule, SqxSharedModule } from '@app/shared';
import { HelpComponent, HistoryComponent, LoadSchemasGuard, SchemaMustExistGuard, SqxFrameworkModule, SqxSharedModule } from '@app/shared';
import { ArrayValidationComponent, AssetsUIComponent, AssetsValidationComponent, BooleanUIComponent, BooleanValidationComponent, ComponentsUIComponent, ComponentsValidationComponent, DateTimeUIComponent, DateTimeValidationComponent, FieldComponent, FieldFormCommonComponent, FieldFormComponent, FieldFormUIComponent, FieldFormValidationComponent, FieldListComponent, FieldWizardComponent, GeolocationUIComponent, GeolocationValidationComponent, JsonMoreComponent, JsonUIComponent, JsonValidationComponent, NumberUIComponent, NumberValidationComponent, ReferencesUIComponent, ReferencesValidationComponent, SchemaEditFormComponent, SchemaExportFormComponent, SchemaFieldRulesFormComponent, SchemaFieldsComponent, SchemaFormComponent, SchemaPageComponent, SchemaPreviewUrlsFormComponent, SchemaScriptNamePipe, SchemaScriptsFormComponent, SchemasPageComponent, SchemaUIFormComponent, StringUIComponent, StringValidationComponent, TagsUIComponent, TagsValidationComponent } from './declarations';
import { ComponentUIComponent } from './pages/schema/fields/types/component-ui.component';
import { ComponentValidationComponent } from './pages/schema/fields/types/component-validation.component';
@ -30,6 +30,13 @@ const routes: Routes = [
helpPage: '05-integrated/schemas',
},
},
{
path: 'history',
component: HistoryComponent,
data: {
channel: 'schemas.{schemaId}',
},
},
],
},
],

4
frontend/src/app/features/schemas/pages/schema/schema-page.component.html

@ -118,6 +118,10 @@
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help"></i>
</a>

62
frontend/src/app/features/settings/module.ts

@ -18,6 +18,22 @@ const routes: Routes = [
{
path: 'more',
component: MorePageComponent,
children: [
{
path: 'history',
component: HistoryComponent,
data: {
channel: 'settings.general',
},
},
{
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/more',
},
},
],
},
{
path: 'backups',
@ -95,10 +111,35 @@ const routes: Routes = [
{
path: 'settings',
component: SettingsPageComponent,
children: [
{
path: 'history',
component: HistoryComponent,
data: {
channel: 'settings.ui',
},
},
{
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/settings',
},
},
],
},
{
path: 'templates',
component: TemplatesPageComponent,
children: [
{
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/templates',
},
},
],
},
{
path: 'plans',
@ -111,6 +152,13 @@ const routes: Routes = [
channel: 'settings.plan',
},
},
{
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/plans',
},
},
],
},
{
@ -137,6 +185,13 @@ const routes: Routes = [
path: 'workflows',
component: WorkflowsPageComponent,
children: [
{
path: 'history',
component: HistoryComponent,
data: {
channel: 'settings.workflows',
},
},
{
path: 'help',
component: HelpComponent,
@ -150,6 +205,13 @@ const routes: Routes = [
path: 'asset-scripts',
component: AssetScriptsPageComponent,
children: [
{
path: 'history',
component: HistoryComponent,
data: {
channel: 'settings.assetScripts',
},
},
{
path: 'help',
component: HelpComponent,

4
frontend/src/app/features/settings/pages/asset-scripts/asset-scripts-page.component.html

@ -37,6 +37,10 @@
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>

20
frontend/src/app/features/settings/pages/more/more-page.component.html

@ -1,4 +1,4 @@
<sqx-layout layout="main" titleText="i18n:common.settings" titleIcon="settings" [innerWidth]="55" [hideSidebar]="true">
<sqx-layout layout="main" titleText="i18n:common.settings" titleIcon="settings" [innerWidth]="55">
<ng-container>
<sqx-list-view innerWidth="55rem">
<ng-container content>
@ -12,7 +12,7 @@
<div class="form-group">
<label for="email">{{ 'common.name' | sqxTranslate }}</label>
<input type="text" class="form-control" readonly [value]="app.name">
<input type="text" class="form-control" disabled readonly [value]="app.name">
</div>
<div class="form-group">
@ -127,4 +127,18 @@
</ng-container>
</sqx-list-view>
</ng-container>
</sqx-layout>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>

6
frontend/src/app/features/settings/pages/plans/plans-page.component.html

@ -40,10 +40,14 @@
</ng-container>
<ng-container sidebarMenu>
<div class="panel-nav">
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>

16
frontend/src/app/features/settings/pages/settings/settings-page.component.html

@ -146,4 +146,18 @@
</div>
</sqx-list-view>
</ng-container>
</sqx-layout>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>

10
frontend/src/app/features/settings/pages/templates/templates-page.component.html

@ -1,6 +1,6 @@
<sqx-title message="i18n:common.templates"></sqx-title>
<sqx-layout layout="main" titleText="i18n:common.templates" titleIcon="templates" [innerWidth]="50" [hideSidebar]="true">
<sqx-layout layout="main" titleText="i18n:common.templates" titleIcon="templates" [innerWidth]="50">
<ng-container menu>
<button type="button" class="btn btn-text-secondary me-2" (click)="reload()" title="i18n:templates.refreshTooltip" shortcut="CTRL + B">
<i class="icon-reset"></i> {{ 'common.refresh' | sqxTranslate }}
@ -20,6 +20,14 @@
</ng-container>
</sqx-list-view>
</ng-container>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>

4
frontend/src/app/features/settings/pages/workflows/workflows-page.component.html

@ -38,6 +38,10 @@
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>

25
frontend/src/app/features/teams/module.ts

@ -40,7 +40,7 @@ const routes: Routes = [
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/team-contributors',
helpPage: '05-integrated/contributors-team',
},
},
],
@ -56,11 +56,34 @@ const routes: Routes = [
channel: 'settings.plan',
},
},
{
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/plans-team',
},
},
],
},
{
path: 'more',
component: MorePageComponent,
children: [
{
path: 'history',
component: HistoryComponent,
data: {
channel: 'settings.general',
},
},
{
path: 'help',
component: HelpComponent,
data: {
helpPage: '05-integrated/more-team',
},
},
],
},
],
},

18
frontend/src/app/features/teams/pages/more/more-page.component.html

@ -1,4 +1,4 @@
<sqx-layout layout="main" titleText="i18n:common.settings" titleIcon="settings" [innerWidth]="55" [hideSidebar]="true">
<sqx-layout layout="main" titleText="i18n:common.settings" titleIcon="settings" [innerWidth]="55">
<ng-container>
<sqx-list-view innerWidth="55rem">
<ng-container content>
@ -28,4 +28,18 @@
</ng-container>
</sqx-list-view>
</ng-container>
</sqx-layout>
<ng-container sidebarMenu>
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>

7
frontend/src/app/features/teams/pages/plans/plans-page.component.html

@ -36,13 +36,16 @@
</ng-container>
<ng-container sidebarMenu>
<div class="panel-nav">
<div class="panel-nav">
<a class="panel-link" routerLink="history" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.history" titlePosition="left-center">
<i class="icon-time"></i>
</a>
<a class="panel-link" routerLink="help" routerLinkActive="active" queryParamsHandling="preserve" title="i18n:common.help" titlePosition="left-center">
<i class="icon-help2"></i>
</a>
</div>
</ng-container>
</sqx-layout>
<router-outlet></router-outlet>

14
frontend/src/app/shared/components/assets/asset-history.component.scss

@ -18,15 +18,21 @@
}
.event {
font-size: $font-small;
font-weight: normal;
margin-bottom: 1.5rem;
margin-bottom: 1rem;
&-created {
&-message {
font-size: $font-small;
}
&-created {
font-size: $font-smallest;
font-weight: normal;
margin: .25rem 0;
}
&-right {
overflow: hidden;
}
}
.user-picture {

12
frontend/src/app/shared/components/history/history-list.component.scss

@ -24,14 +24,18 @@
}
.event {
font-size: $font-small;
font-weight: normal;
margin-bottom: 1.5rem;
margin-bottom: 1rem;
&-created {
&-message {
font-size: $font-small;
}
&-created {
font-size: $font-smallest;
font-weight: normal;
margin: .25rem 0;
}
&-right {
overflow: hidden;
}

5
frontend/src/app/shared/components/history/history.component.ts

@ -9,7 +9,7 @@ import { ChangeDetectionStrategy, Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { merge, Observable, timer } from 'rxjs';
import { delay } from 'rxjs/operators';
import { allParams, AppsState, HistoryChannelUpdated, HistoryEventDto, HistoryService, MessageBus, switchSafe, TeamsState } from '@app/shared/internal';
import { allParams, AppsState, HistoryChannelUpdated, HistoryEventDto, HistoryService, MessageBus, SchemasState, switchSafe, TeamsState } from '@app/shared/internal';
@Component({
selector: 'sqx-history',
@ -32,6 +32,7 @@ export class HistoryComponent {
private readonly historyService: HistoryService,
private readonly messageBus: MessageBus,
private readonly route: ActivatedRoute,
private readonly schemasState: SchemasState,
private readonly teamsState: TeamsState,
) {
}
@ -50,6 +51,8 @@ export class HistoryComponent {
if (channel) {
const params = allParams(this.route);
channel = channel.replace('{schemaId}', this.schemasState.snapshot.selectedSchema?.id);
for (const [key, value] of Object.entries(params)) {
channel = channel.replace(`{${key}}`, value);
}

4
frontend/src/app/shell/pages/internal/apps-menu.component.html

@ -72,8 +72,8 @@
</div>
<div class="dropdown-header" *ngIf="(uiState.settings | async)?.canCreateTeams">
<button type="button" class="btn btn-block btn-outline-success" (click)="addTeamDialog.show()">
<i class="icon-plus"></i> {{ 'apps.appsButtonCreateTeam' | sqxTranslate }}
<button type="button" class="btn btn-block btn-sm btn-text-success" (click)="addTeamDialog.show()">
{{ 'apps.appsButtonCreateTeam' | sqxTranslate }}
</button>
</div>
</ng-container>

4
frontend/src/app/theme/_common.scss

@ -128,6 +128,10 @@ hr {
padding-right: 3rem;
}
a {
white-space: nowrap;
}
table {
width: 100%;

Loading…
Cancel
Save