Browse Source

Merge branch 'refactoring/sc' of github.com:Squidex/squidex into refactoring/sc

pull/345/head
Sebastian Stehle 7 years ago
parent
commit
c1408dfcc8
  1. 2
      extensions/Squidex.Extensions/Squidex.Extensions.csproj
  2. 57
      src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs
  3. 43
      src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs
  4. 2
      src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj
  5. 2
      src/Squidex.Infrastructure/Log/LockingLogStore.cs
  6. 2
      src/Squidex/Squidex.csproj
  7. 8
      src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.html
  8. 8
      src/Squidex/app/features/administration/pages/users/users-page.component.html
  9. 2
      src/Squidex/app/features/assets/pages/assets-page.component.html
  10. 1
      src/Squidex/app/features/content/declarations.ts
  11. 2
      src/Squidex/app/features/content/module.ts
  12. 5
      src/Squidex/app/features/content/pages/content/field-languages.component.ts
  13. 14
      src/Squidex/app/features/content/pages/contents/contents-page.component.html
  14. 2
      src/Squidex/app/features/content/shared/array-editor.component.html
  15. 16
      src/Squidex/app/features/content/shared/array-item.component.html
  16. 69
      src/Squidex/app/features/content/shared/content-item-editor.component.ts
  17. 97
      src/Squidex/app/features/content/shared/content-item.component.html
  18. 10
      src/Squidex/app/features/content/shared/content-item.component.ts
  19. 2
      src/Squidex/app/features/content/shared/contents-selector.component.html
  20. 6
      src/Squidex/app/features/rules/pages/events/rule-events-page.component.html
  21. 2
      src/Squidex/app/features/rules/pages/rules/actions/tweet-action.component.html
  22. 6
      src/Squidex/app/features/rules/pages/rules/rules-page.component.html
  23. 10
      src/Squidex/app/features/schemas/pages/schema/field-wizard.component.html
  24. 2
      src/Squidex/app/features/schemas/pages/schema/field.component.html
  25. 4
      src/Squidex/app/features/schemas/pages/schema/schema-page.component.html
  26. 2
      src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.html
  27. 2
      src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.html
  28. 6
      src/Squidex/app/features/settings/pages/backups/backups-page.component.html
  29. 4
      src/Squidex/app/features/settings/pages/clients/client.component.html
  30. 2
      src/Squidex/app/features/settings/pages/clients/clients-page.component.html
  31. 2
      src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html
  32. 2
      src/Squidex/app/features/settings/pages/languages/languages-page.component.html
  33. 2
      src/Squidex/app/features/settings/pages/more/more-page.component.html
  34. 2
      src/Squidex/app/features/settings/pages/patterns/patterns-page.component.html
  35. 2
      src/Squidex/app/features/settings/pages/plans/plans-page.component.html
  36. 2
      src/Squidex/app/features/settings/pages/roles/roles-page.component.html
  37. 2
      src/Squidex/app/framework/angular/forms/autocomplete.component.html
  38. 6
      src/Squidex/app/framework/angular/forms/date-time-editor.component.html
  39. 2
      src/Squidex/app/framework/angular/forms/stars.component.html
  40. 2
      src/Squidex/app/framework/angular/forms/tag-editor.component.html
  41. 4
      src/Squidex/app/framework/angular/pager.component.html
  42. 8
      src/Squidex/app/shared/components/asset.component.html
  43. 2
      src/Squidex/app/shared/components/assets-selector.component.html
  44. 4
      src/Squidex/app/shared/components/geolocation-editor.component.html
  45. 2
      src/Squidex/app/shared/components/language-selector.component.html
  46. 4
      src/Squidex/app/shared/components/schema-category.component.html
  47. 3
      src/Squidex/app/shared/services/contents.service.spec.ts
  48. 2
      src/Squidex/app/shared/services/contents.service.ts
  49. 2
      src/Squidex/app/shell/pages/home/home-page.component.html
  50. 2
      src/Squidex/app/shell/pages/internal/apps-menu.component.html
  51. 250
      src/Squidex/app/theme/icomoon/demo.html
  52. 217
      src/Squidex/package-lock.json
  53. 32
      src/Squidex/package.json
  54. 66
      src/Squidex/wwwroot/theme.html
  55. 2
      tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj
  56. 2
      tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj
  57. 2
      tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
  58. 2
      tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj
  59. 2
      tests/Squidex.Tests/Squidex.Tests.csproj
  60. 2
      tools/Migrate_00/Migrate_00.csproj

2
extensions/Squidex.Extensions/Squidex.Extensions.csproj

@ -13,7 +13,7 @@
<ItemGroup>
<PackageReference Include="Algolia.Search" Version="5.3.1" />
<PackageReference Include="CoreTweet" Version="1.0.0.483" />
<PackageReference Include="Elasticsearch.Net" Version="6.4.2" />
<PackageReference Include="Elasticsearch.Net" Version="6.5.0" />
<PackageReference Include="Microsoft.Extensions.Http" Version="2.2.0" />
<PackageReference Include="Microsoft.OData.Core" Version="7.5.3" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />

57
src/Squidex.Domain.Apps.Core.Operations/Scripting/DefaultConverter.cs

@ -0,0 +1,57 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Security.Claims;
using Jint;
using Jint.Native;
using Jint.Runtime.Interop;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Scripting.ContentWrapper;
using Squidex.Shared.Users;
namespace Squidex.Domain.Apps.Core.Scripting
{
public sealed class DefaultConverter : IObjectConverter
{
public static readonly DefaultConverter Instance = new DefaultConverter();
private DefaultConverter()
{
}
public bool TryConvert(Engine engine, object value, out JsValue result)
{
result = null;
if (value is Enum)
{
result = value.ToString();
return true;
}
switch (value)
{
case IUser user:
result = JintUser.Create(engine, user);
return true;
case ClaimsPrincipal principal:
result = JintUser.Create(engine, principal);
return true;
case Instant instant:
result = JsValue.FromObject(engine, instant.ToDateTimeUtc());
return true;
case NamedContentData content:
result = new ContentDataObject(engine, content);
return true;
}
return false;
}
}
}

43
src/Squidex.Domain.Apps.Core.Operations/Scripting/JintScriptEngine.cs

@ -8,18 +8,15 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Security.Claims;
using Jint;
using Jint.Native;
using Jint.Native.Date;
using Jint.Native.Object;
using Jint.Runtime;
using Jint.Runtime.Interop;
using NodaTime;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Scripting.ContentWrapper;
using Squidex.Infrastructure;
using Squidex.Shared.Users;
namespace Squidex.Domain.Apps.Core.Scripting
{
@ -27,40 +24,6 @@ namespace Squidex.Domain.Apps.Core.Scripting
{
public TimeSpan Timeout { get; set; } = TimeSpan.FromMilliseconds(200);
public sealed class Converter : IObjectConverter
{
public Engine Engine { get; set; }
public bool TryConvert(object value, out JsValue result)
{
result = null;
if (value is Enum)
{
result = value.ToString();
return true;
}
switch (value)
{
case IUser user:
result = JintUser.Create(Engine, user);
return true;
case ClaimsPrincipal principal:
result = JintUser.Create(Engine, principal);
return true;
case Instant instant:
result = JsValue.FromObject(Engine, instant.ToDateTimeUtc());
return true;
case NamedContentData content:
result = new ContentDataObject(Engine, content);
return true;
}
return false;
}
}
public void Execute(ScriptContext context, string script)
{
Guard.NotNull(context, nameof(context));
@ -198,8 +161,6 @@ namespace Squidex.Domain.Apps.Core.Scripting
private Engine CreateScriptEngine(IReferenceResolver resolver = null, Dictionary<string, Func<string>> customFormatters = null)
{
var converter = new Converter();
var engine = new Engine(options =>
{
if (resolver != null)
@ -207,7 +168,7 @@ namespace Squidex.Domain.Apps.Core.Scripting
options.SetReferencesResolver(resolver);
}
options.TimeoutInterval(Timeout).Strict().AddObjectConverter(converter);
options.TimeoutInterval(Timeout).Strict().AddObjectConverter(DefaultConverter.Instance);
});
if (customFormatters != null)
@ -218,8 +179,6 @@ namespace Squidex.Domain.Apps.Core.Scripting
}
}
converter.Engine = engine;
engine.SetValue("slugify", new ClrFunctionInstance(engine, "slugify", Slugify));
engine.SetValue("formatTime", new ClrFunctionInstance(engine, "formatTime", FormatDate));
engine.SetValue("formatDate", new ClrFunctionInstance(engine, "formatDate", FormatDate));

2
src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj

@ -15,7 +15,7 @@
<ProjectReference Include="..\Squidex.Shared\Squidex.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Jint" Version="3.0.0-beta-1427" />
<PackageReference Include="Jint" Version="3.0.0-beta-1469" />
<PackageReference Include="Microsoft.OData.Core" Version="7.5.3" />
<PackageReference Include="NJsonSchema" Version="9.13.17" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />

2
src/Squidex.Infrastructure/Log/LockingLogStore.cs

@ -68,7 +68,7 @@ namespace Squidex.Infrastructure.Log
}
else
{
await stream.WriteAsync(LockedText, 0, LockedText.Length, cts.Token);
await stream.WriteAsync(LockedText, 0, LockedText.Length);
}
}
}

2
src/Squidex/Squidex.csproj

@ -91,7 +91,7 @@
<PackageReference Include="NSwag.AspNetCore" Version="12.0.13" />
<PackageReference Include="OpenCover" Version="4.6.519" />
<PackageReference Include="Orleans.Providers.MongoDB" Version="2.0.1" />
<PackageReference Include="OrleansDashboard" Version="2.1.3" />
<PackageReference Include="OrleansDashboard" Version="2.2.0" />
<PackageReference Include="RefactoringEssentials" Version="5.6.0" PrivateAssets="all" />
<PackageReference Include="ReportGenerator" Version="4.0.9" />
<PackageReference Include="StackExchange.Redis.StrongName" Version="1.2.6" />

8
src/Squidex/app/features/administration/pages/event-consumers/event-consumers-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh event consumers (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh event consumers (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
@ -42,13 +42,13 @@
<span>{{eventConsumer.position}}</span>
</td>
<td class="cell-actions-lg">
<button class="btn btn-text" (click)="reset(eventConsumer)" *ngIf="!eventConsumer.isResetting" title="Reset Event Consumer">
<button type="button" class="btn btn-text" (click)="reset(eventConsumer)" *ngIf="!eventConsumer.isResetting" title="Reset Event Consumer">
<i class="icon icon-reset"></i>
</button>
<button class="btn btn-text" (click)="start(eventConsumer)" *ngIf="eventConsumer.isStopped" title="Start Event Consumer">
<button type="button" class="btn btn-text" (click)="start(eventConsumer)" *ngIf="eventConsumer.isStopped" title="Start Event Consumer">
<i class="icon icon-play"></i>
</button>
<button class="btn btn-text" (click)="stop(eventConsumer)" *ngIf="!eventConsumer.isStopped" title="Stop Event Consumer">
<button type="button" class="btn btn-text" (click)="stop(eventConsumer)" *ngIf="!eventConsumer.isStopped" title="Stop Event Consumer">
<i class="icon icon-pause"></i>
</button>
</td>

8
src/Squidex/app/features/administration/pages/users/users-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary mr-1" (click)="reload()" title="Refresh Users (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary mr-1" (click)="reload()" title="Refresh Users (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
@ -18,7 +18,7 @@
<input class="form-control" #inputFind [formControl]="usersFilter" placeholder="Search for user" />
</form>
<button class="btn btn-success" #buttonNew routerLink="new" title="New User (CTRL + N)">
<button type="button" class="btn btn-success" #buttonNew routerLink="new" title="New User (CTRL + N)">
<i class="icon-plus"></i> New
</button>
</ng-container>
@ -61,10 +61,10 @@
</td>
<td class="cell-actions">
<ng-container *ngIf="!userInfo.isCurrentUser">
<button class="btn btn-text" (click)="lock(userInfo.user); $event.stopPropagation();" *ngIf="!userInfo.user.isLocked" title="Lock User">
<button type="button" class="btn btn-text" (click)="lock(userInfo.user)" *ngIf="!userInfo.user.isLocked" title="Lock User">
<i class="icon icon-unlocked"></i>
</button>
<button class="btn btn-text" (click)="unlock(userInfo.user); $event.stopPropagation();" *ngIf="userInfo.user.isLocked" title="Unlock User">
<button type="button" class="btn btn-text" (click)="unlock(userInfo.user)" *ngIf="userInfo.user.isLocked" title="Unlock User">
<i class="icon icon-lock"></i>
</button>
</ng-container>

2
src/Squidex/app/features/assets/pages/assets-page.component.html

@ -10,7 +10,7 @@
<div class="col-auto offset-xl-4">
<sqx-shortcut keys="ctrl+shift+r" (trigger)="reload()"></sqx-shortcut>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh Contents (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh Contents (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
</div>

1
src/Squidex/app/features/content/declarations.ts

@ -18,6 +18,7 @@ export * from './shared/array-editor.component';
export * from './shared/assets-editor.component';
export * from './shared/array-item.component';
export * from './shared/content-item.component';
export * from './shared/content-item-editor.component';
export * from './shared/content-status.component';
export * from './shared/contents-selector.component';
export * from './shared/due-time-selector.component';

2
src/Squidex/app/features/content/module.ts

@ -29,6 +29,7 @@ import {
ContentFieldComponent,
ContentHistoryPageComponent,
ContentItemComponent,
ContentItemEditorComponent,
ContentPageComponent,
ContentsFiltersPageComponent,
ContentsPageComponent,
@ -113,6 +114,7 @@ const routes: Routes = [
ContentFieldComponent,
ContentHistoryPageComponent,
ContentItemComponent,
ContentItemEditorComponent,
ContentPageComponent,
ContentsFiltersPageComponent,
ContentStatusComponent,

5
src/Squidex/app/features/content/pages/content/field-languages.component.ts

@ -5,7 +5,7 @@
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { AppLanguageDto, RootFieldDto } from '@app/shared';
@ -28,7 +28,8 @@ import { AppLanguageDto, RootFieldDto } from '@app/shared';
Please remember to check all languages when you see validation errors.
</sqx-onboarding-tooltip>
</ng-container>
</ng-container>`
</ng-container>`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class FieldLanguagesComponent {
@Input()

14
src/Squidex/app/features/content/pages/contents/contents-page.component.html

@ -16,7 +16,7 @@
<div class="col-auto offset-xl-4">
<sqx-shortcut keys="ctrl+shift+r" (trigger)="reload()"></sqx-shortcut>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh Contents (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh Contents (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
</div>
@ -36,7 +36,7 @@
<sqx-language-selector class="languages-buttons" (selectedLanguageChange)="selectLanguage($event)" [languages]="languages.mutableValues"></sqx-language-selector>
</div>
<div class="col-auto pl-1">
<button class="btn btn-success" #newButton routerLink="new" title="New Content (CTRL + SHIFT + G)">
<button type="button" class="btn btn-success" #newButton routerLink="new" title="New Content (CTRL + SHIFT + G)">
<i class="icon-plus"></i> New
</button>
@ -73,23 +73,23 @@
<div class="selection" *ngIf="selectionCount > 0">
{{selectionCount}} items selected:&nbsp;&nbsp;
<button class="btn btn-secondary mr-1" (click)="publishSelected()" *ngIf="canPublish">
<button type="button" class="btn btn-secondary mr-1" (click)="publishSelected()" *ngIf="canPublish">
Publish
</button>
<button class="btn btn-secondary mr-1" (click)="unpublishSelected()" *ngIf="canUnpublish">
<button type="button" class="btn btn-secondary mr-1" (click)="unpublishSelected()" *ngIf="canUnpublish">
Unpublish
</button>
<button class="btn btn-secondary mr-1" (click)="archiveSelected()" *ngIf="(contentsState.isArchive | async) === false">
<button type="button" class="btn btn-secondary mr-1" (click)="archiveSelected()" *ngIf="(contentsState.isArchive | async) === false">
Archive
</button>
<button class="btn btn-secondary mr-1" (click)="restoreSelected()" *ngIf="contentsState.isArchive | async">
<button type="button" class="btn btn-secondary mr-1" (click)="restoreSelected()" *ngIf="contentsState.isArchive | async">
Restore
</button>
<button class="btn btn-danger"
<button type="button" class="btn btn-danger"
(sqxConfirmClick)="deleteSelected()"
confirmTitle="Delete content"
confirmText="Do you really want to delete the selected content items?">

2
src/Squidex/app/features/content/shared/array-editor.component.html

@ -20,7 +20,7 @@
</div>
</div>
<button class="btn btn-success" [disabled]="field.nested.length === 0" (click)="addItem(undefined); $event.preventDefault()">
<button type="button" class="btn btn-success" [disabled]="field.nested.length === 0" (click)="addItem(undefined)">
Add Item
</button>

16
src/Squidex/app/features/content/shared/array-item.component.html

@ -5,32 +5,32 @@
<span class="header-text text-decent">Item #{{index + 1}}</span>
<button class="btn btn-text-secondary" [disabled]="isFirst" (click)="moveTop(); $event.preventDefault()">
<button type="button" class="btn btn-text-secondary" [disabled]="isFirst" (click)="moveTop()">
<i class="icon-caret-top"></i>
</button>
<button class="btn btn-text-secondary" [disabled]="isFirst" (click)="moveUp(); $event.preventDefault()">
<button type="button" class="btn btn-text-secondary" [disabled]="isFirst" (click)="moveUp()">
<i class="icon-caret-up"></i>
</button>
<button class="btn btn-text-secondary" [disabled]="isLast" (click)="moveDown(); $event.preventDefault()">
<button type="button" class="btn btn-text-secondary" [disabled]="isLast" (click)="moveDown()">
<i class="icon-caret-down"></i>
</button>
<button class="btn btn-text-secondary" [disabled]="isLast" (click)="moveBottom(); $event.preventDefault()">
<button type="button" class="btn btn-text-secondary" [disabled]="isLast" (click)="moveBottom()">
<i class="icon-caret-bottom"></i>
</button>
<button class="btn btn-text-secondary" [class.hidden]="!isHidden" (click)="toggle.emit(false); $event.preventDefault()" title="Open all items">
<button type="button" class="btn btn-text-secondary" [class.hidden]="!isHidden" (click)="toggle.emit(false)" title="Open all items">
<i class="icon-plus-square"></i>
</button>
<button class="btn btn-text-secondary" [class.hidden]="isHidden" (click)="toggle.emit(true); $event.preventDefault()" title="Close all items">
<button type="button" class="btn btn-text-secondary" [class.hidden]="isHidden" (click)="toggle.emit(true)" title="Close all items">
<i class="icon-minus-square"></i>
</button>
</span>
<span class="float-right">
<button type="button" class="btn btn-text-secondary" (click)="cloning.emit(); $event.preventDefault()">
<button type="button" class="btn btn-text-secondary" (click)="cloning.emit()">
<i class="icon-clone"></i>
</button>
<button type="button" class="btn btn-text-danger" (click)="removing.emit(); $event.preventDefault()">
<button type="button" class="btn btn-text-danger" (click)="removing.emit()">
<i class="icon-bin2"></i>
</button>

69
src/Squidex/app/features/content/shared/content-item-editor.component.ts

@ -0,0 +1,69 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { FieldDto } from '@app/shared';
@Component({
selector: 'sqx-content-item-editor',
template: `
<div [formGroup]="form">
<div [ngSwitch]="field.properties.fieldType">
<div *ngSwitchCase="'Number'">
<div [ngSwitch]="field.properties['editor']">
<div *ngSwitchCase="'Input'">
<input class="form-control" type="number" [formControlName]="field.name" [placeholder]="field.displayPlaceholder" />
</div>
<div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="field.name">
<option [ngValue]="null"></option>
<option *ngFor="let value of field.properties['allowedValues']" [ngValue]="value">{{value}}</option>
</select>
</div>
</div>
</div>
<div *ngSwitchCase="'String'">
<div [ngSwitch]="field.properties['editor']">
<div *ngSwitchCase="'Input'">
<input class="form-control" type="text" [formControlName]="field.name" [placeholder]="field.displayPlaceholder" />
</div>
<div *ngSwitchCase="'Slug'">
<input class="form-control" type="text" [formControlName]="field.name" [placeholder]="field.displayPlaceholder" sqxTransformInput="Slugify" />
</div>
<div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="field.name">
<option [ngValue]="null"></option>
<option *ngFor="let value of field.properties['allowedValues']" [ngValue]="value">{{value}}</option>
</select>
</div>
</div>
</div>
<div *ngSwitchCase="'Boolean'">
<div [ngSwitch]="field.properties['editor']">
<div *ngSwitchCase="'Toggle'">
<sqx-toggle [formControlName]="field.name" [threeStates]="!field.properties.isRequired"></sqx-toggle>
</div>
<div *ngSwitchCase="'Checkbox'">
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" [formControlName]="field.name" sqxIndeterminateValue />
</div>
</div>
</div>
</div>
</div>
</div>`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ContentItemEditorComponent {
@Input()
public field: FieldDto;
@Input()
public form: FormGroup;
}

97
src/Squidex/app/features/content/shared/content-item.component.html

@ -1,64 +1,25 @@
<td class="cell-select" *ngIf="!isReference" (click)="shouldStop($event)">
<td class="cell-select" (click)="stop($event)">
<ng-container *ngIf="!isReference; else referenceTemplate">
<input type="checkbox" class="form-check"
[ngModel]="selected"
(ngModelChange)="selectedChange.emit($event);"
(click)="$event.stopPropagation()" />
</td>
(ngModelChange)="selectedChange.emit($event)" />
</ng-container>
<td class="cell-select" *ngIf="isReference" (click)="shouldStop($event)">
<ng-template #referenceTemplate>
<i class="icon-drag2 drag-handle"></i>
</ng-template>
</td>
<td class="cell-auto" *ngFor="let field of schema.listFields; let i = index" (click)="shouldStop($event)">
<div *ngIf="field.isInlineEditable && !isReadOnly" [formGroup]="patchForm.form" (click)="$event.stopPropagation()">
<div [ngSwitch]="field.properties.fieldType">
<div *ngSwitchCase="'Number'">
<div [ngSwitch]="field.properties['editor']">
<div *ngSwitchCase="'Input'">
<input class="form-control" type="number" [formControlName]="field.name" [placeholder]="field.displayPlaceholder" />
</div>
<div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="field.name">
<option [ngValue]="null"></option>
<option *ngFor="let value of field.properties['allowedValues']" [ngValue]="value">{{value}}</option>
</select>
</div>
</div>
</div>
<div *ngSwitchCase="'String'">
<div [ngSwitch]="field.properties['editor']">
<div *ngSwitchCase="'Input'">
<input class="form-control" type="text" [formControlName]="field.name" [placeholder]="field.displayPlaceholder" />
</div>
<div *ngSwitchCase="'Slug'">
<input class="form-control" type="text" [formControlName]="field.name" [placeholder]="field.displayPlaceholder" sqxTransformInput="Slugify" />
</div>
<div *ngSwitchCase="'Dropdown'">
<select class="form-control" [formControlName]="field.name">
<option [ngValue]="null"></option>
<option *ngFor="let value of field.properties['allowedValues']" [ngValue]="value">{{value}}</option>
</select>
</div>
</div>
</div>
<div *ngSwitchCase="'Boolean'">
<div [ngSwitch]="field.properties['editor']">
<div *ngSwitchCase="'Toggle'">
<sqx-toggle [formControlName]="field.name" [threeStates]="!field.properties.isRequired"></sqx-toggle>
</div>
<div *ngSwitchCase="'Checkbox'">
<div class="form-check form-check-inline">
<input class="form-check-input" type="checkbox" [formControlName]="field.name" sqxIndeterminateValue />
</div>
</div>
</div>
</div>
</div>
</div>
<div *ngIf="!field.isInlineEditable || isReadOnly" class="truncate">
<td class="cell-auto" *ngFor="let field of schema.listFields; let i = index" (click)="shouldStop($event, field)">
<ng-container *ngIf="field.isInlineEditable && !isReadOnly; else displayTemplate">
<sqx-content-item-editor [form]="patchForm.form" [field]="field"></sqx-content-item-editor>
</ng-container>
<ng-template #displayTemplate>
{{values[i]}}
</div>
</ng-template>
</td>
<td class="cell-time" *ngIf="!isCompact" (click)="shouldStop($event)">
<sqx-content-status
[status]="content.status"
@ -74,36 +35,38 @@
<img class="user-picture" [attr.title]="content.lastModifiedBy | sqxUserNameRef" [attr.src]="content.lastModifiedBy | sqxUserPictureRef" />
</td>
<td class="cell-user" *ngIf="patchForm.form.dirty" (click)="shouldStop($event)">
<button type="button" class="btn btn-success" (click)="save(); $event.stopPropagation()">
<ng-container *ngIf="patchForm.form.dirty">
<td class="cell-user" (click)="stop($event)">
<button type="button" class="btn btn-success" (click)="save()">
<i class="icon-checkmark"></i>
</button>
</td>
<td class="cell-actions" *ngIf="patchForm.form.dirty" (click)="shouldStop($event)">
<button type="button" class="btn btn-text-secondary btn-cancel" (click)="cancel(); $event.stopPropagation()">
</td>
<td class="cell-actions" (click)="stop($event)">
<button type="button" class="btn btn-text-secondary btn-cancel" (click)="cancel()">
<i class="icon-close"></i>
</button>
</td>
</td>
</ng-container>
<td class="cell-actions" *ngIf="!isReadOnly && patchForm.form.pristine" (click)="shouldStop($event)">
<td class="cell-actions" *ngIf="!isReadOnly && patchForm.form.pristine" (click)="stop($event)">
<div class="dropdown dropdown-options" *ngIf="content">
<button type="button" class="btn btn-text-secondary" (click)="dropdown.toggle(); $event.stopPropagation()" [class.active]="dropdown.isOpen | async" #optionsButton>
<button type="button" class="btn btn-text-secondary" (click)="dropdown.toggle()" [class.active]="dropdown.isOpen | async" #optionsButton>
<i class="icon-dots"></i>
</button>
<div class="dropdown-menu" *sqxModalView="dropdown;closeAlways:true" [sqxModalTarget]="optionsButton" @fade>
<a class="dropdown-item" (click)="publishing.emit(); $event.stopPropagation()" *ngIf="content.status === 'Draft'">
<a class="dropdown-item" (click)="publishing.emit()" *ngIf="content.status === 'Draft'">
Publish
</a>
<a class="dropdown-item" (click)="unpublishing.emit(); $event.stopPropagation()" *ngIf="content.status === 'Published'">
<a class="dropdown-item" (click)="unpublishing.emit()" *ngIf="content.status === 'Published'">
Unpublish
</a>
<a class="dropdown-item" (click)="archiving.emit(); $event.stopPropagation()" *ngIf="content.status !== 'Archived'">
<a class="dropdown-item" (click)="archiving.emit()" *ngIf="content.status !== 'Archived'">
Archive
</a>
<a class="dropdown-item" (click)="restoring.emit(); $event.stopPropagation()" *ngIf="content.status === 'Archived'">
<a class="dropdown-item" (click)="restoring.emit()" *ngIf="content.status === 'Archived'">
Restore
</a>
<a class="dropdown-item" (click)="cloning.emit(); dropdown.hide(); $event.stopPropagation()" *ngIf="content.status !== 'Archived'">
<a class="dropdown-item" (click)="cloning.emit(); dropdown.hide()" *ngIf="content.status !== 'Archived'">
Clone
</a>
@ -119,7 +82,7 @@
</div>
</td>
<td class="cell-actions" *ngIf="isReference" (click)="shouldStop($event)">
<button type="button" class="btn btn-text-secondary" (click)="deleting.emit(); $event.stopPropagation()">
<button type="button" class="btn btn-text-secondary" (click)="deleting.emit()">
<i class="icon-close"></i>
</button>
</td>

10
src/Squidex/app/features/content/shared/content-item.component.ts

@ -12,6 +12,7 @@ import {
ContentDto,
ContentsState,
fadeAnimation,
FieldDto,
FieldFormatter,
fieldInvariant,
ModalModel,
@ -96,13 +97,18 @@ export class ContentItemComponent implements OnChanges {
}
}
public shouldStop(event: Event) {
if (this.patchForm.form.dirty) {
public shouldStop(event: Event, field?: FieldDto) {
if (this.patchForm.form.dirty || (field && field.isInlineEditable)) {
event.stopPropagation();
event.stopImmediatePropagation();
}
}
public stop(event: Event) {
event.stopPropagation();
event.stopImmediatePropagation();
}
public save() {
const value = this.patchForm.submit();

2
src/Squidex/app/features/content/shared/contents-selector.component.html

@ -6,7 +6,7 @@
<ng-container tabs>
<div class="row no-gutters">
<div class="col-auto offset-lg-4">
<button class="btn btn-text-secondary" (click)="reload()">
<button type="button" class="btn btn-text-secondary" (click)="reload()">
<i class="icon-reset"></i> Refresh
</button>
</div>

6
src/Squidex/app/features/rules/pages/events/rule-events-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh Events (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh Events (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
@ -70,11 +70,11 @@
Next: <ng-container *ngIf="event.nextAttempt">{{event.nextAttempt | sqxFromNow}}</ng-container>
</div>
<div class="col-3 text-right">
<button class="btn btn-outline-danger btn-sm mr-1" (click)="cancel(event)" [class.hidden]="!event.nextAttempt">
<button type="button" class="btn btn-outline-danger btn-sm mr-1" (click)="cancel(event)" [class.hidden]="!event.nextAttempt">
Cancel
</button>
<button class="btn btn-success btn-sm" (click)="enqueue(event)">
<button type="button" class="btn btn-success btn-sm" (click)="enqueue(event)">
Enqueue
</button>
</div>

2
src/Squidex/app/features/rules/pages/rules/actions/tweet-action.component.html

@ -2,7 +2,7 @@
<div class="form-group row">
<div class="col-9 offset-3">
<ng-container *ngIf="!isRedirected">
<button class="btn btn-twitter" [disabled]="isAuthenticating" (click)="auth()">
<button type="button" class="btn btn-twitter" [disabled]="isAuthenticating" (click)="auth()">
Request access token with twitter
</button>
</ng-container>

6
src/Squidex/app/features/rules/pages/rules/rules-page.component.html

@ -6,14 +6,14 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary mr-1" (click)="reload()" title="Refresh Assets (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary mr-1" (click)="reload()" title="Refresh Assets (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
<sqx-shortcut keys="ctrl+shift+r" (trigger)="reload()"></sqx-shortcut>
<sqx-shortcut keys="ctrl+shift+g" (trigger)="buttonNew.click()"></sqx-shortcut>
<button class="btn btn-success" #buttonNew (click)="createNew()" title="New Rule (CTRL + M)">
<button type="button" class="btn btn-success" #buttonNew (click)="createNew()" title="New Rule (CTRL + M)">
<i class="icon-plus"></i> New
</button>
</ng-container>
@ -24,7 +24,7 @@
<div class="table-items-row table-items-row-empty" *ngIf="rules.length === 0">
No Rule created yet.
<button class="btn btn-success btn-sm ml-2" (click)="createNew()">
<button type="button" class="btn btn-success btn-sm ml-2" (click)="createNew()">
<i class="icon icon-plus"></i> Add Rule
</button>
</div>

10
src/Squidex/app/features/schemas/pages/schema/field-wizard.component.html

@ -94,14 +94,14 @@
<button type="reset" class="float-left btn btn-secondary" (click)="complete()">Cancel</button>
<div class="float-right" *ngIf="!isEditing">
<button class="btn btn-outline-success mr-1" (click)="addField(false, false)">Create and close</button>
<button class="btn btn-success mr-1" (click)="addField(true, false)">Create and add field</button>
<button class="btn btn-success" (click)="addField(false, true)">Create and edit field</button>
<button type="button" class="btn btn-outline-success mr-1" (click)="addField(false, false)">Create and close</button>
<button type="button" class="btn btn-success mr-1" (click)="addField(true, false)">Create and add field</button>
<button type="button" class="btn btn-success" (click)="addField(false, true)">Create and edit field</button>
</div>
<div class="float-right" *ngIf="isEditing">
<button class="btn btn-success mr-1" (click)="save(true)">Save and add field</button>
<button class="btn btn-primary" (click)="save()">Save and close</button>
<button type="button" class="btn btn-success mr-1" (click)="save(true)">Save and add field</button>
<button type="button" class="btn btn-primary" (click)="save()">Save and close</button>
</div>
</ng-container>
</sqx-modal-dialog>

2
src/Squidex/app/features/schemas/pages/schema/field.component.html

@ -118,7 +118,7 @@
<div class="nested-field nested-field-add">
<span class="nested-field-line-h"></span>
<button class="btn btn-success btn-sm" (click)="addFieldDialog.show()">
<button type="button" class="btn btn-success btn-sm" (click)="addFieldDialog.show()">
<i class="icon icon-plus"></i> Add Nested Field
</button>
</div>

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

@ -61,7 +61,7 @@
<div class="table-items-row table-items-row-empty" *ngIf="schema && schema.fields.length === 0">
No field created yet.
<button class="btn btn-success btn-sm ml-2" (click)="addFieldDialog.show()">
<button type="button" class="btn btn-success btn-sm ml-2" (click)="addFieldDialog.show()">
<i class="icon icon-plus"></i> Add Field
</button>
</div>
@ -75,7 +75,7 @@
</div>
</div>
<button class="btn btn-success field-button" (click)="addFieldDialog.show()">
<button type="button" class="btn btn-success field-button" (click)="addFieldDialog.show()">
<i class="icon icon-plus field-button-icon"></i> <div class="field-button-text">Add Field</div>
</button>
</ng-container>

2
src/Squidex/app/features/schemas/pages/schema/types/string-validation.component.html

@ -53,7 +53,7 @@
</div>
</div>
</div>
<small class="col-3" style="align-self: center;">
<small class="col-3" style="align-self: center">
{{patternName}}
</small>
</div>

2
src/Squidex/app/features/schemas/pages/schemas/schemas-page.component.html

@ -9,7 +9,7 @@
<sqx-shortcut keys="ctrl+shift+g" (trigger)="addSchemaDialog.show()"></sqx-shortcut>
<sqx-shortcut keys="ctrl+shift+f" (trigger)="inputFind.focus()"></sqx-shortcut>
<button class="btn btn-success subheader-button" (click)="createSchema()" title="New Schema (CTRL + SHIFT + G)">
<button type="button" class="btn btn-success subheader-button" (click)="createSchema()" title="New Schema (CTRL + SHIFT + G)">
<i class="icon-plus"></i>
</button>

6
src/Squidex/app/features/settings/pages/backups/backups-page.component.html

@ -6,13 +6,13 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary mr-1" (click)="reload()" title="Refresh backups (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary mr-1" (click)="reload()" title="Refresh backups (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
<sqx-shortcut keys="ctrl+shift+r" (trigger)="reload()"></sqx-shortcut>
<button class="btn btn-success" [disabled]="backupsState.maxBackupsReached | async" (click)="start()">
<button type="button" class="btn btn-success" [disabled]="backupsState.maxBackupsReached | async" (click)="start()">
Start Backup
</button>
</ng-container>
@ -27,7 +27,7 @@
<div class="table-items-row table-items-row-empty" *ngIf="backups.length === 0">
No backups created yet.
<button class="btn btn-success btn-sm ml-2" (click)="start()">
<button type="button" class="btn btn-success btn-sm ml-2" (click)="start()">
Start Backup
</button>
</div>

4
src/Squidex/app/features/settings/pages/clients/client.component.html

@ -11,7 +11,7 @@
<button type="submit" class="btn btn-primary" [disabled]="!renameForm.form.valid || !renameForm.form.dirty">Save</button>
<button class="btn btn-text-secondary btn-cancel" (click)="toggleRename()">
<button type="button" class="btn btn-text-secondary btn-cancel" (click)="toggleRename()">
<i class="icon-close"></i>
</button>
</form>
@ -25,7 +25,7 @@
</ng-container>
</div>
<div class="col-auto">
<button class="btn btn-primary" (click)="connect()">Connect</button>
<button type="button" class="btn btn-primary" (click)="connect()">Connect</button>
</div>
<div class="col-auto cell-actions">
<button type="button" class="btn btn-text-danger"

2
src/Squidex/app/features/settings/pages/clients/clients-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh clients (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh clients (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>

2
src/Squidex/app/features/settings/pages/contributors/contributors-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh contributors (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh contributors (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>

2
src/Squidex/app/features/settings/pages/languages/languages-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh languages (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh languages (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>

2
src/Squidex/app/features/settings/pages/more/more-page.component.html

@ -17,7 +17,7 @@
<div>Once you archive an app, there is no going back. Please be certain.</div>
</div>
<div class="col-auto">
<button class="btn btn-danger"
<button type="button" class="btn btn-danger"
(sqxConfirmClick)="archiveApp()"
confirmTitle="Archive App"
confirmText="Do you really want to archive this app?">

2
src/Squidex/app/features/settings/pages/patterns/patterns-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh patterns (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh patterns (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>

2
src/Squidex/app/features/settings/pages/plans/plans-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh Plans (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh Plans (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>

2
src/Squidex/app/features/settings/pages/roles/roles-page.component.html

@ -6,7 +6,7 @@
</ng-container>
<ng-container menu>
<button class="btn btn-text-secondary" (click)="reload()" title="Refresh roles (CTRL + SHIFT + R)">
<button type="button" class="btn btn-text-secondary" (click)="reload()" title="Refresh roles (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>

2
src/Squidex/app/framework/angular/forms/autocomplete.component.html

@ -6,7 +6,7 @@
autocapitalize="off">
<div *ngIf="snapshot.suggestedItems.length > 0" [sqxModalTarget]="input" class="control-dropdown" #container position="bottomLeft">
<div *ngFor="let item of snapshot.suggestedItems; let i = index;" class="control-dropdown-item control-dropdown-item-selectable"
<div *ngFor="let item of snapshot.suggestedItems; let i = index" class="control-dropdown-item control-dropdown-item-selectable"
[class.active]="i === snapshot.suggestedIndex"
[container]="container"
(mousedown)="selectItem(item)"

6
src/Squidex/app/framework/angular/forms/date-time-editor.component.html

@ -7,13 +7,13 @@
<input type="text" class="form-control" [formControl]="timeControl" (blur)="callTouched()" />
</div>
<div class="form-group" *ngIf="showTime">
<button class="btn btn-secondary" [disabled]="snapshot.isDisabled" (click)="writeNow()">Now</button>
<button type="button" class="btn btn-secondary" [disabled]="snapshot.isDisabled" (click)="writeNow()">Now</button>
</div>
<div class="form-group" *ngIf="!showTime">
<button class="btn btn-secondary" [disabled]="snapshot.isDisabled" (click)="writeNow()">Today</button>
<button type="button" class="btn btn-secondary" [disabled]="snapshot.isDisabled" (click)="writeNow()">Today</button>
</div>
<div class="form-group" [class.hidden]="!hasValue" *ngIf="!hideClear">
<button class="btn btn-text clear" [disabled]="snapshot.isDisabled" (click)="reset()">Clear</button>
<button type="button" class="btn btn-text clear" [disabled]="snapshot.isDisabled" (click)="reset()">Clear</button>
</div>
</div>
</div>

2
src/Squidex/app/framework/angular/forms/stars.component.html

@ -8,6 +8,6 @@
<span class="star" *ngFor="let star of snapshot.starsArray" (mouseenter)="setPreview(star)" (click)="setValue(star)" [class.selected]="star <= snapshot.stars"></span>
</span>
<button class="btn btn-text" [class.hidden]="!value" (click)="reset()">Clear</button>
<button type="button" class="btn btn-text" [class.hidden]="!value" (click)="reset()">Clear</button>
</ng-container>
</div>

2
src/Squidex/app/framework/angular/forms/tag-editor.component.html

@ -24,7 +24,7 @@
</div>
<div *ngIf="snapshot.suggestedItems.length > 0" [sqxModalTarget]="form" class="control-dropdown" #container position="bottomLeft">
<div *ngFor="let item of snapshot.suggestedItems; let i = index;" class="control-dropdown-item control-dropdown-item-selectable"
<div *ngFor="let item of snapshot.suggestedItems; let i = index" class="control-dropdown-item control-dropdown-item-selectable"
[class.active]="i === snapshot.suggestedIndex"
[container]="container"
(mousedown)="selectValue(item)"

4
src/Squidex/app/framework/angular/pager.component.html

@ -2,10 +2,10 @@
<div class="float-right pagination">
<span class="pagination-text">{{pager.itemFirst}}-{{pager.itemLast}} of {{pager.numberOfItems}}</span>
<button class="btn btn-text-secondary pagination-button" [disabled]="!pager.canGoPrev" (click)="prevPage.emit()">
<button type="button" class="btn btn-text-secondary pagination-button" [disabled]="!pager.canGoPrev" (click)="prevPage.emit()">
<i class="icon-angle-left"></i>
</button>
<button class="btn btn-text-secondary pagination-button" [disabled]="!pager.canGoNext" (click)="nextPage.emit()">
<button type="button" class="btn btn-text-secondary pagination-button" [disabled]="!pager.canGoNext" (click)="nextPage.emit()">
<i class="icon-angle-right"></i>
</button>
</div>

8
src/Squidex/app/shared/components/asset.component.html

@ -21,10 +21,10 @@
<i class="icon-download"></i>
</a>
<a class="file-delete ml-2" (click)="deleting.emit(asset); $event.stopPropagation()" *ngIf="!isDisabled && !removeMode">
<a class="file-delete ml-2" (click)="deleting.emit(asset)" *ngIf="!isDisabled && !removeMode">
<i class="icon-delete"></i>
</a>
<a class="file-delete ml-2" (click)="removing.emit(asset); $event.stopPropagation()" *ngIf="removeMode">
<a class="file-delete ml-2" (click)="removing.emit(asset)" *ngIf="removeMode">
<i class="icon-close"></i>
</a>
</div>
@ -121,10 +121,10 @@
</a>
</td>
<td class="col-actions text-right" *ngIf="!isDisabled || removeMode">
<button class="btn btn-text-danger" (click)="deleting.emit(asset); $event.stopPropagation()" *ngIf="!isDisabled && !removeMode">
<button type="button" class="btn btn-text-danger" (click)="deleting.emit(asset)" *ngIf="!isDisabled && !removeMode">
<i class="icon-bin2"></i>
</button>
<button class="btn btn-text-secondary" (click)="removing.emit(asset); $event.stopPropagation()" *ngIf="removeMode">
<button type="button" class="btn btn-text-secondary" (click)="removing.emit(asset)" *ngIf="removeMode">
<i class="icon-close"></i>
</button>
</td>

2
src/Squidex/app/shared/components/assets-selector.component.html

@ -6,7 +6,7 @@
<ng-container tabs>
<div class="row no-gutters">
<div class="col-auto offset-lg-2">
<button class="btn btn-text-secondary" (click)="reload()">
<button type="button" class="btn btn-text-secondary" (click)="reload()">
<i class="icon-reset"></i> Refresh
</button>
</div>

4
src/Squidex/app/shared/components/geolocation-editor.component.html

@ -9,7 +9,7 @@
<label for="latitude">Latitude: </label>
</div>
<div class="form-group">
<sqx-control-errors for="latitude" style="z-index: 10000;"></sqx-control-errors>
<sqx-control-errors for="latitude" style="z-index: 10000"></sqx-control-errors>
<input type="number" class="form-control" id="latitude" formControlName="latitude" step="any" />
</div>
@ -18,7 +18,7 @@
<label for="longitude">Longitude: </label>
</div>
<div class="form-group">
<sqx-control-errors for="longitude" style="z-index: 10000;"></sqx-control-errors>
<sqx-control-errors for="longitude" style="z-index: 10000"></sqx-control-errors>
<input type="number" class="form-control" id="longitude" formControlName="longitude" step="any" />
</div>

2
src/Squidex/app/shared/components/language-selector.component.html

@ -5,7 +5,7 @@
</div>
<div class="dropdown-options btn-group btn-group-{{size}}" *ngIf="isLargeMode">
<button type="button" class="btn btn-secondary dropdown-toggle" [attr.title]="selectedLanguage.englishName" (click)="dropdown.toggle(); $event.stopPropagation()" #button tabindex="-1">
<button type="button" class="btn btn-secondary dropdown-toggle" [attr.title]="selectedLanguage.englishName" (click)="dropdown.toggle()" #button tabindex="-1">
{{selectedLanguage.iso2Code}}
</button>
<div class="dropdown-menu" *sqxModalView="dropdown;closeAlways:true" [sqxModalTarget]="button" @fade>

4
src/Squidex/app/shared/components/schema-category.component.html

@ -2,13 +2,13 @@
<div class="drop-indicator"></div>
<div class="header clearfix">
<button class="btn btn-sm btn-text-secondary" (click)="toggle()">
<button type="button" class="btn btn-sm btn-text-secondary" (click)="toggle()">
<i [class.icon-caret-right]="!snapshot.isOpen" [class.icon-caret-down]="snapshot.isOpen"></i>
</button>
<h3>{{snapshot.displayName}} ({{snapshot.schemasFiltered.length}})</h3>
<button class="btn btn-sm btn-text-secondary float-right" *ngIf="snapshot.schemasForCategory.length === 0 && !isReadonly" (click)="removing.emit()">
<button type="button" class="btn btn-sm btn-text-secondary float-right" *ngIf="snapshot.schemasForCategory.length === 0 && !isReadonly" (click)="removing.emit()">
<i class="icon-bin2"></i>
</button>
</div>

3
src/Squidex/app/shared/services/contents.service.spec.ts

@ -217,6 +217,7 @@ describe('ContentsService', () => {
createdBy: 'Created1',
lastModified: '2017-12-12T10:10',
lastModifiedBy: 'LastModifiedBy1',
isPending: false,
data: {}
}, {
headers: {
@ -229,7 +230,7 @@ describe('ContentsService', () => {
DateTime.parseISO_UTC('2016-12-12T10:10'), 'Created1',
DateTime.parseISO_UTC('2017-12-12T10:10'), 'LastModifiedBy1',
null,
true,
false,
null,
{},
new Version('2')));

2
src/Squidex/app/shared/services/contents.service.ts

@ -185,7 +185,7 @@ export class ContentsService {
DateTime.parseISO_UTC(body.created), body.createdBy,
DateTime.parseISO_UTC(body.lastModified), body.lastModifiedBy,
null,
true,
body.isPending,
null,
body.data,
response.version);

2
src/Squidex/app/shell/pages/home/home-page.component.html

@ -4,7 +4,7 @@
<img alt="Logo" class="login-icon login-element" src="/images/logo-half.png" />
<div>
<button class="btn btn-success btn-lg login-button login-element" (click)="login()">
<button type="button" class="btn btn-success btn-lg login-button login-element" (click)="login()">
Login to Squidex
</button>
</div>

2
src/Squidex/app/shell/pages/internal/apps-menu.component.html

@ -28,7 +28,7 @@
</ng-container>
<div class="dropdown-button">
<button class="btn btn-block btn-success" (click)="createApp()">
<button type="button" class="btn btn-block btn-success" (click)="createApp()">
<i class="icon-plus"></i> Create New App
</button>
</div>

250
src/Squidex/app/theme/icomoon/demo.html

File diff suppressed because it is too large

217
src/Squidex/package-lock.json

@ -5,12 +5,12 @@
"requires": true,
"dependencies": {
"@angular-devkit/core": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.2.3.tgz",
"integrity": "sha512-NnN8O+97nJAxqD2zVTDlU8dSzrGCZmqYMDqDoRJJChYxAgmGwP4lhb+Jyi5D34tPxgKRTnjTOwC+G7D+WrXSDQ==",
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz",
"integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==",
"dev": true,
"requires": {
"ajv": "6.6.2",
"ajv": "6.7.0",
"chokidar": "2.0.4",
"fast-json-stable-stringify": "2.0.0",
"rxjs": "6.3.3",
@ -18,9 +18,9 @@
},
"dependencies": {
"ajv": {
"version": "6.6.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
"integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz",
"integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==",
"dev": true,
"requires": {
"fast-deep-equal": "^2.0.1",
@ -382,6 +382,15 @@
"to-regex": "^3.0.2"
}
},
"rxjs": {
"version": "6.3.3",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
"integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
}
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
@ -400,34 +409,34 @@
}
},
"@angular/animations": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.2.tgz",
"integrity": "sha512-St03YR3N4Rv0vLr0+3V0kmf/QNi9q0tOenAlHP+jG/YySPkkv8P3xRcGVU38ID4JQzRiShUD+k2r+oZGCQMNjw==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.3.tgz",
"integrity": "sha512-5WoiDnVS2OhGgJ1oepFNF2UcfR4sJj97KRnTmLWQ0S4N4WpXX83CoOQVXvXwfotyb8uNtl4zRi2NuvN/MIuFuA==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/common": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.2.tgz",
"integrity": "sha512-43EcR3mbM+dKH4VE1EYS1HxSuEToxxv5XPktKqdzY95g8PBOxe11ifcXoYHgImd7YOWzcKoy0k6yQbX3o0cZ8g==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.3.tgz",
"integrity": "sha512-VZOTZdvkitaKEhkxL6daHxPcKqAFwNJm0U4NFB4LRP9KspsFTE60QFVB63o129PTIH9iOQ2D3HRKSRl4o78ZKg==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/compiler": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.2.tgz",
"integrity": "sha512-vjPreOVPca6HSuDmj7N1w5u8hwXdm98gEPo2wqQMVuJd6qvGEyLYE9FsHc0XCchyQEKSybAYl1dwsjZq2nNSvQ==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.3.tgz",
"integrity": "sha512-UM6n4MyZkR5+VVjlwhLH8IfqdWBkdFcF5at4ckJXOJ/gkIUq97irbis9pGj1b0TO7MAl8uhF4b68xe5lk8b49g==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/compiler-cli": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.2.tgz",
"integrity": "sha512-ac62YlDescAaf0qPguyRkpzWCMNlwtsKObq80GKADP33Sxm0BxGt4+Wz6rolvUuWzCX8aZwJ0FA7ehKxdmdQoA==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.3.tgz",
"integrity": "sha512-31hcfTrU2GW66cvvaS629dNVPfiUrUWPncI28optvmKHBaH0mFqkdYNgabuslsXZV5AeidKMUJvR7GITjtvkQA==",
"dev": true,
"requires": {
"canonical-path": "1.0.0",
@ -468,7 +477,7 @@
"dependencies": {
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
@ -516,7 +525,7 @@
},
"load-json-file": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
"integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
"dev": true,
"requires": {
@ -699,49 +708,49 @@
}
},
"@angular/core": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.2.tgz",
"integrity": "sha512-kQ0HxUYAPvly8b3aibTGbiodFnBBgo3asXAQuPgFjYYEqcKR1zZII7PQdaEF9kb9sfm/IKLKj4nd9fZ0gcgqZg==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.3.tgz",
"integrity": "sha512-6Ql+sJJnrsxh8O0/IgIP1GgT4eLOHk+dlBs7zBbjstmLuhaQdY+awO9WKoQow+TiD1Go7FW1J3vZ2PTWXKxqjQ==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/forms": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.2.tgz",
"integrity": "sha512-IsvVuUnzIA2ryRmh7l42AANPZFSyNcwqZNtxbmRq2wm3Lfed64U0rsRWWNqipjz7QTxZ2SRdAlP+XDgzg8hvMQ==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.3.tgz",
"integrity": "sha512-mZpyonfSmRwSvM6efvwFwkLJkK6wHQrm7X4OhVVu3s9i7BI253eLDY7WIRXFvoxJ/5jWIIarVnd/9UA7GINZGw==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/http": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.2.tgz",
"integrity": "sha512-+9dZgiVQStGUO3iJGxEWBkjDCARuVLIPk7QPl4Qntbz8Sd/kR7IBqXMM+74W7T5rlG6bunDxq6LuisvsjWCppw==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.3.tgz",
"integrity": "sha512-wzvBKbO/TcSR3U8AQbsGftH8x1OdAgVGHlfXQPmZL1KjIDHrM1VpnkSvgqIt8coG+4OPfWcNklUCrTdEGwqMqw==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/platform-browser": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.2.tgz",
"integrity": "sha512-eiaqHq26PVASx1kTngBDkFkXhaJzEjoGtc5I+wQUef8CUjq6ZViWz8tUgiiDPOWdqUKUacRZG4q6VR/6uwQj0A==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.3.tgz",
"integrity": "sha512-DH0Y2lgEgcrP1I/DUQB/krL7Ob7yL685fu4sRapW17SndTQa2pqSFMBVf+mN3FupTXp7nJHSvlIktzedIk04+g==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/platform-browser-dynamic": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.2.tgz",
"integrity": "sha512-bw5PuzMzjKMecB4slG/btmvxgn4qFWhNmJVpf2pbtZW7NtZz3HlrqipYzMk9XrCUDGjtwy7O2Z71C3ujI748iw==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.3.tgz",
"integrity": "sha512-M8Kiz5FUhnFybJuk/mgOhBjVbRgKDC4bGWKWH9Z9SXBR2dS/FL3QOJsLIthQcWlHOzSoJdEoPBRhn0R4pyLBSw==",
"requires": {
"tslib": "^1.9.0"
}
},
"@angular/platform-server": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.2.2.tgz",
"integrity": "sha512-lV4CvU06sEaU9q+F11eT9tgC/gFfyK21LkUrLw2nP3mLPBEOx4zhW1R452grN5a/8OFlxZOoSlYWdTQI2QN5CA==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.2.3.tgz",
"integrity": "sha512-RXTFuuTlvy02YOtjWsrs8q+wnmXNW1JHueEseb8cWrgJz46ezhjuW3vwquDv1PwO5KZD2wlamZcrlbkwsdyzZw==",
"requires": {
"domino": "^2.1.0",
"tslib": "^1.9.0",
@ -749,9 +758,9 @@
}
},
"@angular/router": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.2.tgz",
"integrity": "sha512-+cBC+JxbPdjk+Nyqq27PKkjfIdnc+H+xjMGrkO6dlAKhVMGxyNaYt5NUNugb8XJPsQ1XNXyzwTfZK6jcAGLw6w==",
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.3.tgz",
"integrity": "sha512-SH7H2I9WTj1puei4m4g5n0/Cp28HS14q4r8lOgW0gLWuT6Ls7MqH/nDjOMiW924iRR6zjQQs7G+WbhL1jmZc2A==",
"requires": {
"tslib": "^1.9.0"
}
@ -909,16 +918,37 @@
}
},
"@ngtools/webpack": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.2.3.tgz",
"integrity": "sha512-TbaCeE1mkruWzFGfAP1kSnwk4v5k0MQUxzy2reUvCfq80H8jYrqUuMZJa0VLPoEky5cYIy98Fe2Wz9xlEdx7sA==",
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.3.0.tgz",
"integrity": "sha512-U/By0Jlwy7nYwrGNtFirTg1aAsEHBL/9DhfFxPI0iu27FWiMttROuN6hmKbbnOmpbiYAVl5qTy3WXPXUIJjG1A==",
"dev": true,
"requires": {
"@angular-devkit/core": "7.2.3",
"@angular-devkit/core": "7.3.0",
"enhanced-resolve": "4.1.0",
"rxjs": "6.3.3",
"tree-kill": "1.2.0",
"webpack-sources": "1.2.0"
"tree-kill": "1.2.1",
"webpack-sources": "1.3.0"
},
"dependencies": {
"rxjs": {
"version": "6.3.3",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
"integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
"dev": true,
"requires": {
"tslib": "^1.9.0"
}
},
"webpack-sources": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz",
"integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==",
"dev": true,
"requires": {
"source-list-map": "^2.0.0",
"source-map": "~0.6.1"
}
}
}
},
"@types/core-js": {
@ -928,9 +958,9 @@
"dev": true
},
"@types/jasmine": {
"version": "3.3.7",
"resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.7.tgz",
"integrity": "sha512-TuXyEBYWWrjBZAC4h3YY5NcrgC9HaLO5FogvkY5FOfAyjrk3wWABoH/3p7ooFfA8BHjc2BeQCDvvQBLb+9q1rA==",
"version": "3.3.8",
"resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.8.tgz",
"integrity": "sha512-BaOFpaddRVV8qykJoWHrHtamml880oh0+DIZWbtJgx0pu+KhDF1gER5hSfCIfzyMrbjMuYFnLUfyo1l0JUVU3Q==",
"dev": true
},
"@types/json5": {
@ -952,9 +982,9 @@
"dev": true
},
"@types/node": {
"version": "10.12.18",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz",
"integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==",
"version": "10.12.21",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.21.tgz",
"integrity": "sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ==",
"dev": true
},
"@types/prop-types": {
@ -970,9 +1000,9 @@
"dev": true
},
"@types/react": {
"version": "16.7.20",
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.7.20.tgz",
"integrity": "sha512-Qd5RWkwl6SL7R2XzLk/cicjVQm1Mhc6HqXY5Ei4pWd1Vi8Fkbd5O0sA398x8fRSTPAuHdDYD9nrWmJMYTJI0vQ==",
"version": "16.8.1",
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.8.1.tgz",
"integrity": "sha512-tD1ETKJcuhANOejRc/p7OgQ16DKnbGi0M3LccelKlPnUCDp2a5koVxZFoRN9HN+A+m84HB5VGN7I+r3nNhS3PA==",
"dev": true,
"requires": {
"@types/prop-types": "*",
@ -1258,6 +1288,7 @@
"resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
"integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
"dev": true,
"optional": true,
"requires": {
"kind-of": "^3.0.2",
"longest": "^1.0.1",
@ -2006,7 +2037,7 @@
"dependencies": {
"jsesc": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
"resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
"integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
"dev": true
},
@ -3707,9 +3738,9 @@
}
},
"csstype": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.1.tgz",
"integrity": "sha512-wv7IRqCGsL7WGKB8gPvrl+++HlFM9kxAM6jL1EXNPNTshEJYilMkbfS2SnuHha77uosp/YVK0wAp2jmlBzn1tg==",
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.2.tgz",
"integrity": "sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow==",
"dev": true
},
"currently-unhandled": {
@ -5466,7 +5497,8 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@ -5487,12 +5519,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -5507,17 +5541,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
@ -5634,7 +5671,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@ -5646,6 +5684,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@ -5660,6 +5699,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@ -5667,12 +5707,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@ -5691,6 +5733,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -5771,7 +5814,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
@ -5783,6 +5827,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@ -5868,7 +5913,8 @@
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -5904,6 +5950,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -5923,6 +5970,7 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -5966,12 +6014,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
}
}
},
@ -8359,9 +8409,9 @@
}
},
"karma-htmlfile-reporter": {
"version": "0.3.7",
"resolved": "https://registry.npmjs.org/karma-htmlfile-reporter/-/karma-htmlfile-reporter-0.3.7.tgz",
"integrity": "sha512-1Ryh11QJinRGf3BTUOYaPsjVtz8tK87grhOQCtdq8bt7z0sYd1lxTwC6QmH+aQS7T2pe/qfdoDdFF/Vo/96dRA==",
"version": "0.3.8",
"resolved": "https://registry.npmjs.org/karma-htmlfile-reporter/-/karma-htmlfile-reporter-0.3.8.tgz",
"integrity": "sha512-Hd4c/vqPXYjdNYXeDJRMMq2DMMxPxqOR+TPeiLz2qbqO0qCCQMeXwFGhNDFr+GsvYhcOyn7maTbWusUFchS/4A==",
"dev": true,
"requires": {
"xmlbuilder": "^10.0.0"
@ -8687,7 +8737,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
"integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
"dev": true
"dev": true,
"optional": true
},
"loose-envify": {
"version": "1.4.0",
@ -9198,7 +9249,7 @@
},
"node-fetch": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
"resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
"integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
},
"node-forge": {
@ -9709,7 +9760,7 @@
},
"p-is-promise": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
"resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
"integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=",
"dev": true
},
@ -13206,9 +13257,9 @@
}
},
"tree-kill": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz",
"integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
"integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
"dev": true
},
"trim-newlines": {
@ -13247,7 +13298,7 @@
"dependencies": {
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
@ -15357,7 +15408,7 @@
},
"whatwg-fetch": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
"resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
"integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
},
"which": {

32
src/Squidex/package.json

@ -15,15 +15,15 @@
"build:clean": "rimraf wwwroot/build"
},
"dependencies": {
"@angular/animations": "7.2.2",
"@angular/common": "7.2.2",
"@angular/core": "7.2.2",
"@angular/forms": "7.2.2",
"@angular/http": "7.2.2",
"@angular/platform-browser": "7.2.2",
"@angular/platform-browser-dynamic": "7.2.2",
"@angular/platform-server": "7.2.2",
"@angular/router": "7.2.2",
"@angular/animations": "7.2.3",
"@angular/common": "7.2.3",
"@angular/core": "7.2.3",
"@angular/forms": "7.2.3",
"@angular/http": "7.2.3",
"@angular/platform-browser": "7.2.3",
"@angular/platform-browser-dynamic": "7.2.3",
"@angular/platform-server": "7.2.3",
"@angular/router": "7.2.3",
"angular2-chartjs": "0.5.1",
"babel-polyfill": "6.26.0",
"bootstrap": "4.2.1",
@ -47,15 +47,15 @@
"zone.js": "0.8.29"
},
"devDependencies": {
"@angular/compiler": "7.2.2",
"@angular/compiler-cli": "7.2.2",
"@ngtools/webpack": "7.2.3",
"@angular/compiler": "7.2.3",
"@angular/compiler-cli": "7.2.3",
"@ngtools/webpack": "7.3.0",
"@types/core-js": "2.5.0",
"@types/jasmine": "3.3.7",
"@types/jasmine": "3.3.8",
"@types/marked": "0.6.0",
"@types/mousetrap": "1.6",
"@types/node": "10.12.18",
"@types/react": "16.7.20",
"@types/node": "10.12.21",
"@types/react": "16.8.1",
"@types/react-dom": "16.0.11",
"@types/sortablejs": "1.7.2",
"angular-router-loader": "0.8.5",
@ -75,7 +75,7 @@
"karma-chrome-launcher": "2.2.0",
"karma-cli": "2.0.0",
"karma-coverage-istanbul-reporter": "2.0.4",
"karma-htmlfile-reporter": "0.3.7",
"karma-htmlfile-reporter": "0.3.8",
"karma-jasmine": "2.0.1",
"karma-jasmine-html-reporter": "1.4.0",
"karma-mocha-reporter": "2.2.5",

66
src/Squidex/wwwroot/theme.html

@ -51,7 +51,7 @@
<div class="bs-component">
<nav class="navbar navbar-toggleable-md navbar-dark bg-primary">
<button class="navbar-toggler navbar-toggler-right" type="button">
<button type="button" classnavbar-toggler navbar-toggler-right" type="button">
<span class="navbar-toggler-icon"></span>
</button>
@ -75,7 +75,7 @@
<form class="form-inline">
<input class="form-control mr-sm-2" type="text" placeholder="Search">
<button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
<button type="button" class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
@ -83,7 +83,7 @@
<div class="bs-component">
<nav class="navbar navbar-toggleable-md navbar-dark bg-inverse">
<button class="navbar-toggler navbar-toggler-right" type="button">
<button type="button" classnavbar-toggler navbar-toggler-right" type="button">
<span class="navbar-toggler-icon"></span>
</button>
@ -107,7 +107,7 @@
<form class="form-inline">
<input class="form-control mr-sm-2" type="text" placeholder="Search">
<button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
<button type="button" class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
@ -222,62 +222,62 @@
<button type="button" class="btn btn-primary btn-lg btn-block">Block level button</button>
</p>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<button class="btn btn-toggle btn-primary">
<button type="button" class="btn btn-toggle btn-primary">
Active
</button>
<button class="btn btn-toggle">
<button type="button" class="btn btn-toggle">
Inactive
</button>
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<button class="btn btn-toggle btn-warning">
<button type="button" class="btn btn-toggle btn-warning">
Active
</button>
<button class="btn btn-toggle">
<button type="button" class="btn btn-toggle">
Inactive
</button>
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<button class="btn btn-toggle btn-danger">
<button type="button" class="btn btn-toggle btn-danger">
Active
</button>
<button class="btn btn-toggle">
<button type="button" class="btn btn-toggle">
Inactive
</button>
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<button class="btn btn-toggle btn-success">
<button type="button" class="btn btn-toggle btn-success">
Active
</button>
<button class="btn btn-toggle">
<button type="button" class="btn btn-toggle">
Inactive
</button>
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<button class="btn btn-toggle btn-info">
<button type="button" class="btn btn-toggle btn-info">
Active
</button>
<button class="btn btn-toggle">
<button type="button" class="btn btn-toggle">
Inactive
</button>
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="checkbox" checked> Checkbox 1
@ -291,7 +291,7 @@
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" data-toggle="buttons">
<label class="btn btn-primary active">
<input type="radio" name="options" checked> Radio 1
@ -316,7 +316,7 @@
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-group" role="group" aria-label="Basic example">
<button type="button" class="btn btn-secondary">Left</button>
<button type="button" class="btn btn-secondary">Middle</button>
@ -324,7 +324,7 @@
</div>
</div>
<div class="bs-component" style="margin-bottom: 15px;">
<div class="bs-component" style="margin-bottom: 15px">
<div class="btn-toolbar" role="toolbar" aria-label="Toolbar with button groups">
<div class="btn-group" role="group" aria-label="First group">
<button type="button" class="btn btn-secondary">1</button>
@ -653,7 +653,7 @@
</div>
</div>
<div class="row" style="margin-bottom: 2rem;">
<div class="row" style="margin-bottom: 2rem">
<div class="col-lg-6">
<h2>Tabs</h2>
<div class="bs-component">
@ -884,7 +884,7 @@
</div>
<div>
<h2>Badges</h2>
<div class="bs-component" style="margin-bottom: 40px;">
<div class="bs-component" style="margin-bottom: 40px">
<span class="badge badge-primary">Primary</span>
<span class="badge badge-secondary">Secondary</span>
<span class="badge badge-success">Success</span>
@ -917,7 +917,7 @@
<h3>Basic</h3>
<div class="bs-component">
<div class="progress">
<div class="progress-bar" role="progressbar" style="width: 25%; height: 20px;" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
<div class="progress-bar" role="progressbar" style="width: 25%; height: 20px" aria-valuenow="25" aria-valuemin="0" aria-valuemax="100"></div>
</div>
</div>
@ -1162,7 +1162,7 @@
<h6 class="card-subtitle text-muted">Support card subtitle</h6>
</div>
<img style="height: 200px; width: 100%; display: block;" src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22318%22%20height%3D%22180%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20318%20180%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_158bd1d28ef%20text%20%7B%20fill%3Argba(255%2C255%2C255%2C.75)%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A16pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_158bd1d28ef%22%3E%3Crect%20width%3D%22318%22%20height%3D%22180%22%20fill%3D%22%23777%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22129.359375%22%20y%3D%2297.35%22%3EImage%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E" alt="Card image">
<img style="height: 200px; width: 100%; display: block" src="data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%22318%22%20height%3D%22180%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20318%20180%22%20preserveAspectRatio%3D%22none%22%3E%3Cdefs%3E%3Cstyle%20type%3D%22text%2Fcss%22%3E%23holder_158bd1d28ef%20text%20%7B%20fill%3Argba(255%2C255%2C255%2C.75)%3Bfont-weight%3Anormal%3Bfont-family%3AHelvetica%2C%20monospace%3Bfont-size%3A16pt%20%7D%20%3C%2Fstyle%3E%3C%2Fdefs%3E%3Cg%20id%3D%22holder_158bd1d28ef%22%3E%3Crect%20width%3D%22318%22%20height%3D%22180%22%20fill%3D%22%23777%22%3E%3C%2Frect%3E%3Cg%3E%3Ctext%20x%3D%22129.359375%22%20y%3D%2297.35%22%3EImage%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fsvg%3E" alt="Card image">
<div class="card-body">
<p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's content.</p>
@ -1191,10 +1191,10 @@
<div class="col-lg-6">
<h2>Modals</h2>
<div class="bs-component">
<div class="modal" style="position: relative; width: 100%; height: 500px;">
<div class="modal-backdrop" style="position: absolute;"></div>
<div class="modal" style="position: relative; width: 100%; height: 500px">
<div class="modal-backdrop" style="position: absolute"></div>
<div class="modal-dialog modal-lg" style="position: absolute; top: 50px; left: 50px; right: 50px; bottom: 50px;">
<div class="modal-dialog modal-lg" style="position: absolute; top: 50px; left: 50px; right: 50px; bottom: 50px">
<div class="modal-content">
<div class="modal-header" *ngIf="showHeader">
<h4 class="modal-title">
@ -1257,7 +1257,7 @@
<div class="panel-header">
<div class="panel-title-row">
<div class="float-right">
<button class="btn btn-success">New</button>
<button type="button" class="btn btn-success">New</button>
</div>
<h3 class="panel-title">
@ -1302,7 +1302,7 @@
<div class="panel-header">
<div class="panel-title-row">
<div class="float-right">
<button class="btn btn-success">New</button>
<button type="button" class="btn btn-success">New</button>
</div>
<h3 class="panel-title">
@ -1351,7 +1351,7 @@
<div class="panel-header large">
<div class="panel-title-row">
<div class="float-right">
<button class="btn btn-success">New</button>
<button type="button" class="btn btn-success">New</button>
</div>
<h3 class="panel-title">

2
tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
<RuntimeFrameworkVersion>2.2.0</RuntimeFrameworkVersion>
<RootNamespace>Squidex.Domain.Apps.Core</RootNamespace>
<LangVersion>7.3</LangVersion>
</PropertyGroup>

2
tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
<RuntimeFrameworkVersion>2.2.0</RuntimeFrameworkVersion>
<RootNamespace>Squidex.Domain.Apps.Entities</RootNamespace>
<LangVersion>7.3</LangVersion>
</PropertyGroup>

2
tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
<RuntimeFrameworkVersion>2.2.0</RuntimeFrameworkVersion>
<RootNamespace>Squidex.Domain.Users</RootNamespace>
</PropertyGroup>
<ItemGroup>

2
tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
<RuntimeFrameworkVersion>2.2.0</RuntimeFrameworkVersion>
<RootNamespace>Squidex.Infrastructure</RootNamespace>
<LangVersion>7.3</LangVersion>
</PropertyGroup>

2
tests/Squidex.Tests/Squidex.Tests.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
<RuntimeFrameworkVersion>2.2.0</RuntimeFrameworkVersion>
<RootNamespace>Squidex</RootNamespace>
<NoWarn>$(NoWarn);NU1605</NoWarn>
<LangVersion>7.3</LangVersion>

2
tools/Migrate_00/Migrate_00.csproj

@ -2,7 +2,7 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<RuntimeFrameworkVersion>2.1.1</RuntimeFrameworkVersion>
<RuntimeFrameworkVersion>2.2.0</RuntimeFrameworkVersion>
<LangVersion>7.3</LangVersion>
</PropertyGroup>
<ItemGroup>

Loading…
Cancel
Save