Browse Source

UI for Webhooks.

pull/65/head
Sebastian Stehle 9 years ago
parent
commit
6be0f6f6f3
  1. 2
      src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventStore.cs
  2. 10
      src/Squidex.Read.MongoDb/Schemas/MongoSchemaRepository_EventHandling.cs
  3. 8
      src/Squidex.Read/Schemas/Services/Implementations/CachingSchemaProvider.cs
  4. 2
      src/Squidex.Read/Schemas/WebhookInvoker.cs
  5. 4
      src/Squidex/app/app.routes.ts
  6. 2
      src/Squidex/app/features/administration/pages/users/user-page.component.ts
  7. 6
      src/Squidex/app/features/assets/pages/assets-page.component.ts
  8. 10
      src/Squidex/app/features/content/pages/content/content-page.component.ts
  9. 2
      src/Squidex/app/features/schemas/pages/schema/schema-page.component.ts
  10. 4
      src/Squidex/app/features/settings/pages/clients/client.component.html
  11. 2
      src/Squidex/app/features/settings/pages/clients/clients-page.component.ts
  12. 3
      src/Squidex/app/features/settings/pages/plans/plans-page.component.scss
  13. 8
      src/Squidex/app/features/webhooks/declarations.ts
  14. 9
      src/Squidex/app/features/webhooks/index.ts
  15. 33
      src/Squidex/app/features/webhooks/module.ts
  16. 98
      src/Squidex/app/features/webhooks/pages/webhooks-page.component.html
  17. 6
      src/Squidex/app/features/webhooks/pages/webhooks-page.component.scss
  18. 126
      src/Squidex/app/features/webhooks/pages/webhooks-page.component.ts
  19. 2
      src/Squidex/app/framework/angular/control-errors.component.ts
  20. 4
      src/Squidex/app/framework/angular/geolocation-editor.component.ts
  21. 4
      src/Squidex/app/shared/components/asset.component.ts
  22. 1
      src/Squidex/app/shared/declarations-base.ts
  23. 6
      src/Squidex/app/shared/module.ts
  24. 1
      src/Squidex/app/shared/services/plans.service.ts
  25. 108
      src/Squidex/app/shared/services/webhooks.service.spec.ts
  26. 81
      src/Squidex/app/shared/services/webhooks.service.ts
  27. 5
      src/Squidex/app/shell/pages/app/left-menu.component.html
  28. 232
      src/Squidex/app/theme/icomoon/demo.html
  29. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.eot
  30. 2
      src/Squidex/app/theme/icomoon/fonts/icomoon.svg
  31. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.ttf
  32. BIN
      src/Squidex/app/theme/icomoon/fonts/icomoon.woff
  33. 318
      src/Squidex/app/theme/icomoon/selection.json
  34. 57
      src/Squidex/app/theme/icomoon/style.css

2
src/Squidex.Infrastructure.MongoDb/EventStore/MongoEventStore.cs

@ -93,7 +93,7 @@ namespace Squidex.Infrastructure.MongoDb.EventStore
if (!string.IsNullOrWhiteSpace(streamFilter) && !string.Equals(streamFilter, "*", StringComparison.OrdinalIgnoreCase))
{
if (streamFilter.StartsWith("^"))
if (streamFilter.Contains("^"))
{
filters.Add(Filter.Regex(x => x.EventStream, streamFilter));
}

10
src/Squidex.Read.MongoDb/Schemas/MongoSchemaRepository_EventHandling.cs

@ -98,6 +98,16 @@ namespace Squidex.Read.MongoDb.Schemas
return UpdateSchema(@event, headers, s => SchemaEventDispatcher.Dispatch(@event, s, registry));
}
protected Task On(WebhookAdded @event, EnvelopeHeaders headers)
{
return UpdateSchema(@event, headers, s => s);
}
protected Task On(WebhookDeleted @event, EnvelopeHeaders headers)
{
return UpdateSchema(@event, headers, s => s);
}
protected Task On(SchemaDeleted @event, EnvelopeHeaders headers)
{
return Collection.UpdateAsync(@event, headers, e => e.IsDeleted = true);

8
src/Squidex.Read/Schemas/Services/Implementations/CachingSchemaProvider.cs

@ -125,6 +125,14 @@ namespace Squidex.Read.Schemas.Services.Implementations
{
Remove(schemaUpdatedEvent.AppId, schemaUpdatedEvent.SchemaId);
}
else if (@event.Payload is WebhookAdded webhookAddedEvent)
{
Remove(webhookAddedEvent.AppId, webhookAddedEvent.SchemaId);
}
else if (@event.Payload is WebhookDeleted webhookDeletedEvent)
{
Remove(webhookDeletedEvent.AppId, webhookDeletedEvent.SchemaId);
}
return TaskHelper.Done;
}

2
src/Squidex.Read/Schemas/WebhookInvoker.cs

@ -82,7 +82,7 @@ namespace Squidex.Read.Schemas
return new JObject(
new JProperty("type", @event.Payload.GetType().Name),
new JProperty("meta", JObject.FromObject(@event.Headers, webhookSerializer)),
new JProperty("data", JObject.FromObject(@event.Headers, webhookSerializer)));
new JProperty("data", JObject.FromObject(@event.Payload, webhookSerializer)));
}
private async Task DispatchEventAsync(JObject payload, ISchemaWebhookEntity webhook)

4
src/Squidex/app/app.routes.ts

@ -63,6 +63,10 @@ export const routes: Routes = [
path: 'assets',
loadChildren: './features/assets/module#SqxFeatureAssetsModule'
},
{
path: 'webhooks',
loadChildren: './features/webhooks/module#SqxFeatureWebhooksModule'
},
{
path: 'settings',
loadChildren: './features/settings/module#SqxFeatureSettingsModule'

2
src/Squidex/app/features/administration/pages/users/user-page.component.ts

@ -65,7 +65,7 @@ export class UserPageComponent extends ComponentBase implements OnInit {
const enable = (message?: string) => {
this.userForm.enable();
this.userForm.controls['password'].reset();
this.userForm.get('password').reset();
this.userFormSubmitted = false;
this.userFormError = message;
};

6
src/Squidex/app/features/assets/pages/assets-page.component.ts

@ -17,7 +17,6 @@ import {
AssetDto,
AssetsService,
AssetUpdated,
fadeAnimation,
ImmutableArray,
MessageBus,
NotificationService,
@ -27,10 +26,7 @@ import {
@Component({
selector: 'sqx-assets-page',
styleUrls: ['./assets-page.component.scss'],
templateUrl: './assets-page.component.html',
animations: [
fadeAnimation
]
templateUrl: './assets-page.component.html'
})
export class AssetsPageComponent extends AppComponentBase implements OnDestroy, OnInit {
private assetUpdatedSubscription: Subscription;

10
src/Squidex/app/features/content/pages/content/content-page.component.ts

@ -179,7 +179,7 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone
this.contentForm.markAsPristine();
for (const field of this.schema.fields.filter(f => !f.isDisabled)) {
const fieldForm = this.contentForm.controls[field.name];
const fieldForm = this.contentForm.get(field.name);
fieldForm.enable();
}
@ -187,7 +187,7 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone
private disable() {
for (const field of this.schema.fields.filter(f => !f.isDisabled)) {
const fieldForm = this.contentForm.controls[field.name];
const fieldForm = this.contentForm.get(field.name);
fieldForm.disable();
}
@ -252,14 +252,14 @@ export class ContentPageComponent extends AppComponentBase implements CanCompone
for (const field of this.schema.fields) {
const fieldValue = content.data[field.name] || {};
const fieldForm = <FormGroup>this.contentForm.controls[field.name];
const fieldForm = <FormGroup>this.contentForm.get(field.name);
if (field.partitioning === 'language') {
for (let language of this.languages) {
fieldForm.controls[language.iso2Code].setValue(fieldValue[language.iso2Code]);
fieldForm.get(language.iso2Code).setValue(fieldValue[language.iso2Code]);
}
} else {
fieldForm.controls['iv'].setValue(fieldValue['iv']);
fieldForm.get('iv').setValue(fieldValue['iv']);
}
}
}

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

@ -82,7 +82,7 @@ export class SchemaPageComponent extends AppComponentBase implements OnInit {
});
public get hasName() {
return this.addFieldForm.controls['name'].value && this.addFieldForm.controls['name'].value.length > 0;
return this.addFieldForm.get('name').value && this.addFieldForm.get('name').value.length > 0;
}
constructor(apps: AppsStoreService, notifications: NotificationService,

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

@ -47,7 +47,7 @@
<tr>
<td>Client Id:</td>
<td>
<input readonly class="form-control" #inputId [attr.value]="clientId" #inputName />
<input readonly class="form-control" [attr.value]="clientId" #inputName />
</td>
<td>
<button type="button" class="btn btn-primary btn-link" [sqxCopy]="inputName">
@ -58,7 +58,7 @@
<tr>
<td>Client Secret:</td>
<td>
<input readonly class="form-control" name="inputSecret" [attr.value]="clientSecret" #inputSecret />
<input readonly class="form-control" [attr.value]="clientSecret" #inputSecret />
</td>
<td>
<button type="button" class="btn btn-primary btn-link" [sqxCopy]="inputSecret">

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

@ -44,7 +44,7 @@ export class ClientsPageComponent extends AppComponentBase implements OnInit {
});
public get hasName() {
return this.addClientForm.controls['name'].value && this.addClientForm.controls['name'].value.length > 0;
return this.addClientForm.get('name').value && this.addClientForm.get('name').value.length > 0;
}
constructor(apps: AppsStoreService, notifications: NotificationService,

3
src/Squidex/app/features/settings/pages/plans/plans-page.component.scss

@ -2,8 +2,7 @@
@import '_mixins';
.panel-content {
padding-left: 1rem;
padding-right: 1rem;
padding: 1rem;
}
.plan {

8
src/Squidex/app/features/webhooks/declarations.ts

@ -0,0 +1,8 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
export * from './pages/webhooks-page.component';

9
src/Squidex/app/features/webhooks/index.ts

@ -0,0 +1,9 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
export * from './declarations';
export * from './module';

33
src/Squidex/app/features/webhooks/module.ts

@ -0,0 +1,33 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { SqxFrameworkModule } from 'shared';
import {
WebhooksPageComponent
} from './declarations';
const routes: Routes = [
{
path: '',
component: WebhooksPageComponent
}
];
@NgModule({
imports: [
SqxFrameworkModule,
RouterModule.forChild(routes)
],
declarations: [
WebhooksPageComponent
]
})
export class SqxFeatureWebhooksModule { }

98
src/Squidex/app/features/webhooks/pages/webhooks-page.component.html

@ -0,0 +1,98 @@
<sqx-title message="{app} | Webhooks" parameter1="app" value1="{{appName() | async}}"></sqx-title>
<sqx-panel panelWidth="46rem">
<div class="panel-header">
<div class="panel-title-row">
<div class="float-right">
<button class="btn btn-link btn-decent" (click)="load(true)" title="Refresh Assets (CTRL + SHIFT + R)">
<i class="icon-reset"></i> Refresh
</button>
<sqx-shortcut keys="ctrl+shift+r" (trigger)="load(true)"></sqx-shortcut>
</div>
<h3 class="panel-title">Webhooks</h3>
</div>
<a class="panel-close" sqxParentLink isLazyLoaded="true">
<i class="icon-close"></i>
</a>
</div>
<div class="panel-main">
<div class="panel-content panel-content-scroll">
<div class="table-items-row table-items-row-empty" *ngIf="webhooks && webhooks.length === 0">
No Webhook created yet.
</div>
<div *ngIf="webhooks">
<div *ngFor="let webhook of webhooks">
<div class="table-items-row">
<table class="table table-middle table-sm table-borderless table-fixed">
<colgroup>
<col style="width: 160px; text-align: right;" />
<col style="width: 100%" />
<col style="width: 40px" />
</colgroup>
<tr>
<td colspan="2">
<h3 class="client-name">
Schema: {{webhook.schema.name}}
</h3>
</td>
<td class="client-delete">
<button type="button" class="btn btn-link btn-danger" (click)="deleteWebhook(webhook)">
<i class="icon-bin2"></i>
</button>
</td>
</tr>
<tr>
<td>Url:</td>
<td>
<input readonly class="form-control" [attr.value]="webhook.webhook.url" #inputUrl />
</td>
<td>
<button type="button" class="btn btn-primary btn-link" [sqxCopy]="inputUrl">
<i class="icon-copy"></i>
</button>
</td>
</tr>
<tr>
<td>Token:</td>
<td>
<input readonly class="form-control" [attr.value]="webhook.webhook.securityToken" #inputToken />
</td>
<td>
<button type="button" class="btn btn-primary btn-link" [sqxCopy]="inputToken">
<i class="icon-copy"></i>
</button>
</td>
</tr>
</table>
</div>
</div>
<div class="table-items-footer">
<form class="form-inline" [formGroup]="addWebhookForm" (ngSubmit)="addWebhook()">
<div class="form-group mr-1">
<select class="form-control schemas-control" formControlName="schemaId">
<option *ngFor="let schema of schemas" [ngValue]="schema.id">{{schema.name}}</option>
</select>
</div>
<div class="form-group mr-1">
<sqx-control-errors for="url" [submitted]="addWebhookFormSubmitted"></sqx-control-errors>
<input type="text" class="form-control" formControlName="url" placeholder="Enter webhook url" autocomplete="off" />
</div>
<button type="submit" class="btn btn-success" [disabled]="!hasUrl">Add Webhook</button>
<button type="reset" class="btn btn-link" (click)="resetWebhookForm()" [disabled]="addWebhookFormSubmitted">Cancel</button>
</form>
</div>
</div>
</div>
</div>
</sqx-panel>

6
src/Squidex/app/features/webhooks/pages/webhooks-page.component.scss

@ -0,0 +1,6 @@
@import '_vars';
@import '_mixins';
.schemas-control {
width: 10rem;
}

126
src/Squidex/app/features/webhooks/pages/webhooks-page.component.ts

@ -0,0 +1,126 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import {
AppComponentBase,
AppsStoreService,
CreateWebhookDto,
ImmutableArray,
NotificationService,
SchemaDto,
SchemasService,
Version,
WebhookDto,
WebhooksService
} from 'shared';
interface WebhookWithSchema { webhook: WebhookDto; schema: SchemaDto; };
@Component({
selector: 'sqx-webhooks-page',
styleUrls: ['./webhooks-page.component.scss'],
templateUrl: './webhooks-page.component.html'
})
export class WebhooksPageComponent extends AppComponentBase implements OnInit {
private readonly version = new Version();
public webhooks: ImmutableArray<WebhookWithSchema>;
public schemas: SchemaDto[];
public addWebhookFormSubmitted = false;
public addWebhookForm: FormGroup =
this.formBuilder.group({
schemaId: ['',
[
Validators.required
]],
url: ['',
[
Validators.required
]]
});
public get hasUrl() {
return this.addWebhookForm.get('url').value && this.addWebhookForm.get('url').value.length > 0;
}
constructor(apps: AppsStoreService, notifications: NotificationService,
private readonly schemasService: SchemasService,
private readonly webhooksService: WebhooksService,
private readonly formBuilder: FormBuilder
) {
super(notifications, apps);
}
public ngOnInit() {
this.load();
}
public load(showInfo = false) {
this.appNameOnce()
.switchMap(app =>
this.schemasService.getSchemas(app)
.withLatestFrom(this.webhooksService.getWebhooks(app),
(s, w) => { return { webhooks: w, schemas: s }; }))
.subscribe(dtos => {
this.schemas = dtos.schemas;
this.webhooks =
ImmutableArray.of(
dtos.webhooks.map(w => {
return { webhook: w, schema: dtos.schemas.find(s => s.id === w.schemaId) };
}).filter(w => !!w.schema));
if (showInfo) {
this.notifyInfo('Webhooks reloaded.');
}
}, error => {
this.notifyError(error);
});
}
public resetWebhookForm() {
this.addWebhookFormSubmitted = false;
this.addWebhookForm.enable();
this.addWebhookForm.reset();
}
public addWebhook() {
if (this.addWebhookForm.valid) {
this.addWebhookFormSubmitted = true;
this.addWebhookForm.disable();
const requestDto = new CreateWebhookDto(this.addWebhookForm.get('url')!.value);
const schemaId = this.addWebhookForm.get('schemaId')!.value;
const schema = this.schemas.find(s => s.id === schemaId);
this.appNameOnce()
.switchMap(app => this.webhooksService.postWebhook(app, schema.name, requestDto, this.version))
.subscribe(dto => {
this.webhooks = this.webhooks.push({ schema, webhook: dto });
this.resetWebhookForm();
}, error => {
this.notifyError(error);
this.resetWebhookForm();
});
}
}
public deleteWebhook(webhook: WebhookWithSchema) {
this.appNameOnce()
.switchMap(app => this.webhooksService.deleteWebhook(app, webhook.schema.name, webhook.webhook.id, this.version))
.subscribe(dto => {
this.webhooks = this.webhooks.remove(webhook);
}, error => {
this.notifyError(error);
});
}
}

2
src/Squidex/app/framework/angular/control-errors.component.ts

@ -101,6 +101,6 @@ export class ControlErrorsComponent implements OnChanges {
this.displayFieldName = this.for.substr(0, 1).toUpperCase() + this.for.substr(1);
}
this.control = this.formGroupDirective.form.controls[this.for];
this.control = this.formGroupDirective.form.get(this.for);
}
}

4
src/Squidex/app/framework/angular/geolocation-editor.component.ts

@ -108,8 +108,8 @@ export class GeolocationEditorComponent implements ControlValueAccessor, AfterVi
}
public updateValueByInput() {
if (this.geolocationForm.controls['latitude'].value !== null &&
this.geolocationForm.controls['longitude'].value !== null &&
if (this.geolocationForm.get('latitude').value !== null &&
this.geolocationForm.get('longitude').value !== null &&
this.geolocationForm.valid) {
this.value = this.geolocationForm.value;
} else {

4
src/Squidex/app/shared/components/asset.component.ts

@ -164,7 +164,7 @@ export class AssetComponent extends AppComponentBase implements OnInit {
if (this.renameForm.valid) {
this.renameForm.disable();
const requestDto = new UpdateAssetDto(this.renameForm.controls['name'].value);
const requestDto = new UpdateAssetDto(this.renameForm.get('name').value);
this.appNameOnce()
.switchMap(app => this.assetsService.putAsset(app, this.asset.id, requestDto, this.version))
@ -194,7 +194,7 @@ export class AssetComponent extends AppComponentBase implements OnInit {
private resetRename() {
this.renameForm.enable();
this.renameForm.controls['name'].setValue(this.asset.fileName);
this.renameForm.get('name').setValue(this.asset.fileName);
this.renameFormSubmitted = false;
this.renameDialog.hide();
}

1
src/Squidex/app/shared/declarations-base.ts

@ -31,6 +31,7 @@ export * from './services/schemas.service';
export * from './services/usages.service';
export * from './services/users-provider.service';
export * from './services/users.service';
export * from './services/webhooks.service';
export * from './utils/file-helper';
export * from './utils/messages';

6
src/Squidex/app/shared/module.ts

@ -49,7 +49,8 @@ import {
UserPictureRefPipe,
UserManagementService,
UsersProviderService,
UsersService
UsersService,
WebhooksService
} from './declarations';
@NgModule({
@ -117,7 +118,8 @@ export class SqxSharedModule {
UsagesService,
UserManagementService,
UsersProviderService,
UsersService
UsersService,
WebhooksService
]
};
}

1
src/Squidex/app/shared/services/plans.service.ts

@ -36,7 +36,6 @@ export class PlanDto {
}
}
export class ChangePlanDto {
constructor(
public readonly planId: string

108
src/Squidex/app/shared/services/webhooks.service.spec.ts

@ -0,0 +1,108 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { Response, ResponseOptions } from '@angular/http';
import { Observable } from 'rxjs';
import { IMock, Mock, Times } from 'typemoq';
import {
ApiUrlConfig,
AuthService,
CreateWebhookDto,
Version,
WebhookDto,
WebhooksService
} from './../';
describe('WebhooksService', () => {
let authService: IMock<AuthService>;
let webhooksService: WebhooksService;
let version = new Version('1');
beforeEach(() => {
authService = Mock.ofType(AuthService);
webhooksService = new WebhooksService(authService.object, new ApiUrlConfig('http://service/p/'));
});
it('should make get request to get app webhooks', () => {
authService.setup(x => x.authGet('http://service/p/api/apps/my-app/webhooks', version))
.returns(() => Observable.of(
new Response(
new ResponseOptions({
body: [{
id: 'id1',
schemaId: 'schemaId1',
securityToken: 'token1',
url: 'http://squidex.io/1'
}, {
id: 'id2',
schemaId: 'schemaId2',
securityToken: 'token2',
url: 'http://squidex.io/2'
}]
})
)
))
.verifiable(Times.once());
let webhooks: WebhookDto[] | null = null;
webhooksService.getWebhooks('my-app', version).subscribe(result => {
webhooks = result;
}).unsubscribe();
expect(webhooks).toEqual([
new WebhookDto('id1', 'schemaId1', 'token1', 'http://squidex.io/1'),
new WebhookDto('id2', 'schemaId2', 'token2', 'http://squidex.io/2')
]);
authService.verifyAll();
});
it('should make post request to create webhook', () => {
const dto = new CreateWebhookDto('http://squidex.io/hook');
authService.setup(x => x.authPost('http://service/p/api/apps/my-app/schemas/my-schema/webhooks', dto, version))
.returns(() => Observable.of(
new Response(
new ResponseOptions({
body: {
id: 'id1',
schemaId: 'schemaId1',
securityToken: 'token1',
url: 'http://squidex.io/1'
}
})
)
))
.verifiable(Times.once());
let webhook: WebhookDto | null = null;
webhooksService.postWebhook('my-app', 'my-schema', dto, version).subscribe(result => {
webhook = result;
}).unsubscribe();
expect(webhook).toEqual(new WebhookDto('id1', 'schemaId1', 'token1', 'http://squidex.io/1'));
authService.verifyAll();
});
it('should make delete request to delete webhook', () => {
authService.setup(x => x.authDelete('http://service/p/api/apps/my-app/schemas/my-schema/webhooks/123', version))
.returns(() => Observable.of(
new Response(
new ResponseOptions()
)
))
.verifiable(Times.once());
webhooksService.deleteWebhook('my-app', 'my-schema', '123', version);
authService.verifyAll();
});
});

81
src/Squidex/app/shared/services/webhooks.service.ts

@ -0,0 +1,81 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import 'framework/angular/http-extensions';
import { ApiUrlConfig, Version } from 'framework';
import { AuthService } from './auth.service';
export class WebhookDto {
constructor(
public readonly id: string,
public readonly schemaId: string,
public readonly securityToken: string,
public readonly url: string
) {
}
}
export class CreateWebhookDto {
constructor(
public readonly url: string
) {
}
}
@Injectable()
export class WebhooksService {
constructor(
private readonly authService: AuthService,
private readonly apiUrl: ApiUrlConfig
) {
}
public getWebhooks(appName: string, version?: Version): Observable<WebhookDto[]> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/webhooks`);
return this.authService.authGet(url, version)
.map(response => response.json())
.map(response => {
const items: any[] = response;
return items.map(item => {
return new WebhookDto(
item.id,
item.schemaId,
item.securityToken,
item.url);
});
})
.catchError('Failed to load webhooks. Please reload.');
}
public postWebhook(appName: string, schemaName: string, dto: CreateWebhookDto, version?: Version): Observable<WebhookDto> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/webhooks`);
return this.authService.authPost(url, dto, version)
.map(response => response.json())
.map(response => {
return new WebhookDto(
response.id,
response.schemaId,
response.securityToken,
response.url);
})
.catchError('Failed to create webhook. Please reload.');
}
public deleteWebhook(appName: string, schemaName: string, id: string, version?: Version): Observable<any> {
const url = this.apiUrl.buildUrl(`api/apps/${appName}/schemas/${schemaName}/webhooks/${id}`);
return this.authService.authDelete(url, version)
.catchError('Failed to delete webhook. Please reload.');
}
}

5
src/Squidex/app/shell/pages/app/left-menu.component.html

@ -15,6 +15,11 @@
<i class="nav-icon icon-media"></i> <div class="nav-text">Assets</div>
</a>
</li>
<li class="nav-item" *ngIf="permission !== 'Editor'">
<a class="nav-link" routerLink="webhooks" routerLinkActive="active">
<i class="nav-icon icon-webhook"></i> <div class="nav-text">Webhooks</div>
</a>
</li>
<li class="nav-item" *ngIf="permission === 'Owner'">
<a class="nav-link" routerLink="settings" routerLinkActive="active">
<i class="nav-icon icon-settings"></i> <div class="nav-text">Settings</div>

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

@ -15,14 +15,14 @@
<h1 class="mvm mtn fgc1">Grid Size: Unknown</h1>
<div class="glyph fs1">
<div class="clearfix bshadow0 pbs">
<span class="icon-brand2">
<span class="icon-webhook">
</span>
<span class="mls"> icon-brand2</span>
<span class="mls"> icon-webhook</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e93f" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe93f;" class="unitRight size1of2 talign-right" />
<input type="text" readonly value="e942" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe942;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
@ -963,118 +963,6 @@
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-control-Date">
</span>
<span class="mls"> icon-control-Date</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e936" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe936;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-control-DateTime">
</span>
<span class="mls"> icon-control-DateTime</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e937" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe937;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-angle-right">
</span>
<span class="mls"> icon-angle-right</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e931" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe931;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-user-o">
</span>
<span class="mls"> icon-user-o</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e932" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe932;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-caret-right">
</span>
<span class="mls"> icon-caret-right</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e929" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe929;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-caret-left">
</span>
<span class="mls"> icon-caret-left</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e92a" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe92a;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs3">
<div class="clearfix bshadow0 pbs">
<span class="icon-caret-up">
</span>
<span class="mls"> icon-caret-up</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e92b" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe92b;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
</div>
<div class="clearfix mhl ptl">
<h1 class="mvm mtn fgc1">Grid Size: 14</h1>
@ -1305,118 +1193,6 @@
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-unlocked">
</span>
<span class="mls"> icon-unlocked</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e933" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe933;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-lock">
</span>
<span class="mls"> icon-lock</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e934" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe934;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-reset">
</span>
<span class="mls"> icon-reset</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e92e" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe92e;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-pause">
</span>
<span class="mls"> icon-pause</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e92f" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe92f;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-play">
</span>
<span class="mls"> icon-play</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e930" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe930;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-settings2">
</span>
<span class="mls"> icon-settings2</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e92d" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe92d;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
<div class="glyph fs5">
<div class="clearfix bshadow0 pbs">
<span class="icon-bin2">
</span>
<span class="mls"> icon-bin2</span>
</div>
<fieldset class="fs0 size1of1 clearfix hidden-false">
<input type="text" readonly value="e902" class="unit size1of2" />
<input type="text" maxlength="1" readonly value="&#xe902;" class="unitRight size1of2 talign-right" />
</fieldset>
<div class="fs0 bshadow0 clearfix hidden-true">
<span class="unit pvs fgc1">liga: </span>
<input type="text" readonly value="" class="liga unitRight" />
</div>
</div>
</div>
<div class="clearfix mhl ptl">
<h1 class="mvm mtn fgc1">Grid Size: 32</h1>

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.eot

Binary file not shown.

2
src/Squidex/app/theme/icomoon/fonts/icomoon.svg

@ -70,7 +70,7 @@
<glyph unicode="&#xe93c;" glyph-name="info" d="M636.518 972.8c68.608 0 102.912-46.694 102.912-100.198 0-66.816-59.597-128.614-137.165-128.614-64.973 0-102.861 38.4-101.069 101.888 0 53.402 45.107 126.925 135.322 126.925zM425.421-51.2c-54.17 0-93.85 33.382-55.962 180.429l62.157 260.71c10.803 41.677 12.595 58.419 0 58.419-16.23 0-86.477-28.774-128.102-57.19l-27.034 45.056c131.686 111.923 283.187 177.51 348.211 177.51 54.118 0 63.13-65.178 36.096-165.376l-71.219-274.022c-12.595-48.384-7.219-65.075 5.427-65.075 16.23 0 69.478 20.070 121.805 61.798l30.72-41.677c-128.102-130.406-268.032-180.582-322.099-180.582z" />
<glyph unicode="&#xe93d;" glyph-name="bug" horiz-adv-x="951" d="M932.571 402.286c0-20-16.571-36.571-36.571-36.571h-128c0-71.429-15.429-125.143-38.286-165.714l118.857-119.429c14.286-14.286 14.286-37.143 0-51.429-6.857-7.429-16.571-10.857-25.714-10.857s-18.857 3.429-25.714 10.857l-113.143 112.571s-74.857-68.571-172-68.571v512h-73.143v-512c-103.429 0-178.857 75.429-178.857 75.429l-104.571-118.286c-7.429-8-17.143-12-27.429-12-8.571 0-17.143 2.857-24.571 9.143-14.857 13.714-16 36.571-2.857 52l115.429 129.714c-20 39.429-33.143 90.286-33.143 156.571h-128c-20 0-36.571 16.571-36.571 36.571s16.571 36.571 36.571 36.571h128v168l-98.857 98.857c-14.286 14.286-14.286 37.143 0 51.429s37.143 14.286 51.429 0l98.857-98.857h482.286l98.857 98.857c14.286 14.286 37.143 14.286 51.429 0s14.286-37.143 0-51.429l-98.857-98.857v-168h128c20 0 36.571-16.571 36.571-36.571zM658.286 731.428h-365.714c0 101.143 81.714 182.857 182.857 182.857s182.857-81.714 182.857-182.857z" />
<glyph unicode="&#xe93e;" glyph-name="download" d="M640 853.334q78 0 149.167-30.5t122.5-81.833 81.833-122.5 30.5-149.167q0-85-35-160.667t-96.667-129.167-140-77.5l21 20.667q18 18.333 28 42.667 9.333 22.667 9.333 49.333 0 6.667-0.333 9.333 59.333 41.333 93.833 105.833t34.5 139.5q0 60.667-23.667 116t-63.667 95.333-95.333 63.667-116 23.667q-55.333 0-106.5-19.833t-90-53.833-65-81.333-33.833-101h-88.667q-70.667 0-120.667-50t-50-120.667q0-38.667 15.167-71.667t39.833-54.167 54.833-33 60.833-11.833h50q11.667-29.333 30-48l37.667-37.333h-117.667q-69.667 0-128.5 34.333t-93.167 93.167-34.333 128.5 34.333 128.5 93.167 93.167 128.5 34.333h22q26.333 74.333 79.333 132.167t126.833 90.833 155.833 33zM554.667 512q17.667 0 30.167-12.5t12.5-30.167v-281l55 55.333q12.333 12.333 30.333 12.333 18.333 0 30.5-12.167t12.167-30.5q0-18-12.333-30.333l-128-128q-12.333-12.333-30.333-12.333t-30.333 12.333l-128 128q-12.333 13-12.333 30.333 0 17.667 12.5 30.167t30.167 12.5q18 0 30.333-12.333l55-55.333v281q0 17.667 12.5 30.167t30.167 12.5z" />
<glyph unicode="&#xe93f;" glyph-name="brand2" d="M522.24 521.152v-175.552h290.368c-11.712-75.328-87.68-220.8-290.368-220.8-174.72 0-317.44 144.64-317.44 323.2s142.72 323.2 317.44 323.2c99.456 0 166.016-42.24 204.16-78.912l138.88 133.888c-89.216 83.264-204.8 133.824-343.040 133.824-283.072 0-512-228.928-512-512s228.928-512 512-512c295.488 0 491.52 207.744 491.52 500.288 0 33.664-3.648 59.264-8.064 84.864h-483.456z" />
<glyph unicode="&#xe940;" glyph-name="microsoft" d="M0.35 448l-0.35 312.074 384 52.144v-364.218zM448 821.518l511.872 74.482v-448h-511.872zM959.998 384l-0.126-448-511.872 72.016v375.984zM384 16.164l-383.688 52.594-0.020 315.242h383.708z" />
<glyph unicode="&#xe941;" glyph-name="github" d="M512 960c-282.88 0-512-229.248-512-512 0-226.24 146.688-418.112 350.080-485.76 25.6-4.8 35.008 11.008 35.008 24.64 0 12.16-0.448 44.352-0.64 87.040-142.464-30.912-172.48 68.672-172.48 68.672-23.296 59.136-56.96 74.88-56.96 74.88-46.4 31.744 3.584 31.104 3.584 31.104 51.392-3.584 78.4-52.736 78.4-52.736 45.696-78.272 119.872-55.68 149.12-42.56 4.608 33.088 17.792 55.68 32.448 68.48-113.728 12.8-233.216 56.832-233.216 252.992 0 55.872 19.84 101.568 52.672 137.408-5.76 12.928-23.040 64.96 4.48 135.488 0 0 42.88 13.76 140.8-52.48 40.96 11.392 84.48 17.024 128 17.28 43.52-0.256 87.040-5.888 128-17.28 97.28 66.24 140.16 52.48 140.16 52.48 27.52-70.528 10.24-122.56 5.12-135.488 32.64-35.84 52.48-81.536 52.48-137.408 0-196.672-119.68-240-233.6-252.608 17.92-15.36 34.56-46.72 34.56-94.72 0-68.48-0.64-123.52-0.64-140.16 0-13.44 8.96-29.44 35.2-24.32 204.864 67.136 351.424 259.136 351.424 485.056 0 282.752-229.248 512-512 512z" />
<glyph unicode="&#xe942;" glyph-name="webhook" d="M533.333 853.333c-117.245 0-213.333-96.088-213.333-213.333 0-61.134 26.685-115.834 68.25-154.833l-94.167-154.625c-39.217-2.486-70.083-34.901-70.083-74.526 0-0.006 0-0.011 0-0.017 0-41.236 33.429-74.666 74.667-74.666s74.667 33.429 74.667 74.667c-0.036 10.883-2.395 21.206-6.607 30.511l135.732 222.197-36.083 22.25c-36.583 22.574-61.042 62.78-61.042 109.042 0 70.958 57.042 128 128 128s128-57.042 128-128c0-11.262-1.445-22.111-4.167-32.5l82.542-21.625c4.532 17.302 6.958 35.478 6.958 54.125 0 117.245-96.088 213.333-213.333 213.333zM533.333 714.667c-41.237 0-74.667-33.429-74.667-74.667 0.001-38.61 29.307-70.375 66.888-74.265l122.028-218.319 37.25 20.625c18.35 10.175 39.289 15.958 61.833 15.958 70.958 0 128-57.042 128-128s-57.042-128-128-128c-40.531 0-76.322 18.729-99.875 48.042l-66.5-53.458c39.082-48.64 99.386-79.917 166.375-79.917 117.245 0 213.333 96.088 213.333 213.333s-96.088 213.333-213.333 213.333c-22.149 0-43.176-4.328-63.375-10.667l-82.917 148.667c4.779 9.533 7.591 20.768 7.625 32.656 0 41.248-33.429 74.678-74.667 74.678zM245.292 462.583c-92.061-23.803-159.958-107.702-159.958-206.583 0-117.245 96.088-213.333 213.333-213.333 102.14 0 184.181 74.359 204.667 170.667h182.167c13.648-19.418 35.938-31.962 61.161-32 41.243 0 74.673 33.429 74.673 74.667s-33.429 74.667-74.667 74.667c-25.26-0.009-47.586-12.559-61.092-31.763l-258.908-0.237v-42.667c0-70.958-57.042-128-128-128s-128 57.042-128 128c0 59.839 41.032 109.746 96 123.958l-21.375 82.625z" />
</font></defs></svg>

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 57 KiB

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.ttf

Binary file not shown.

BIN
src/Squidex/app/theme/icomoon/fonts/icomoon.woff

Binary file not shown.

318
src/Squidex/app/theme/icomoon/selection.json

@ -4,36 +4,53 @@
{
"icon": {
"paths": [
"M522.24 438.848v175.552h290.368c-11.712 75.328-87.68 220.8-290.368 220.8-174.72 0-317.44-144.64-317.44-323.2s142.72-323.2 317.44-323.2c99.456 0 166.016 42.24 204.16 78.912l138.88-133.888c-89.216-83.264-204.8-133.824-343.040-133.824-283.072 0-512 228.928-512 512s228.928 512 512 512c295.488 0 491.52-207.744 491.52-500.288 0-33.664-3.648-59.264-8.064-84.864h-483.456z"
"M533.333 106.667c-117.245 0-213.333 96.088-213.333 213.333 0 61.134 26.685 115.834 68.25 154.833l-94.167 154.625c-39.217 2.486-70.083 34.901-70.083 74.526 0 0.006 0 0.011 0 0.017-0 41.236 33.429 74.666 74.667 74.666s74.667-33.429 74.667-74.667c-0.036-10.883-2.395-21.206-6.607-30.511l135.732-222.197-36.083-22.25c-36.583-22.574-61.042-62.78-61.042-109.042 0-70.958 57.042-128 128-128s128 57.042 128 128c0 11.262-1.445 22.111-4.167 32.5l82.542 21.625c4.532-17.302 6.958-35.478 6.958-54.125 0-117.245-96.088-213.333-213.333-213.333zM533.333 245.333c-41.237 0-74.667 33.429-74.667 74.667 0.001 38.61 29.307 70.375 66.888 74.265l122.028 218.319 37.25-20.625c18.35-10.175 39.289-15.958 61.833-15.958 70.958 0 128 57.042 128 128s-57.042 128-128 128c-40.531 0-76.322-18.729-99.875-48.042l-66.5 53.458c39.082 48.64 99.386 79.917 166.375 79.917 117.245 0 213.333-96.088 213.333-213.333s-96.088-213.333-213.333-213.333c-22.149 0-43.176 4.328-63.375 10.667l-82.917-148.667c4.779-9.533 7.591-20.768 7.625-32.656 0-41.248-33.429-74.678-74.667-74.678zM245.292 497.417c-92.061 23.803-159.958 107.702-159.958 206.583 0 117.245 96.088 213.333 213.333 213.333 102.14 0 184.181-74.359 204.667-170.667h182.167c13.648 19.418 35.938 31.962 61.161 32 41.243 0 74.673-33.429 74.673-74.667s-33.429-74.667-74.667-74.667c-25.26 0.009-47.586 12.559-61.092 31.763l-258.908 0.237v42.667c0 70.958-57.042 128-128 128s-128-57.042-128-128c0-59.839 41.032-109.746 96-123.958l-21.375-82.625z"
],
"attrs": [
{
"fill": "rgb(66, 133, 244)"
}
{}
],
"isMulticolor": false,
"isMulticolor2": false,
"isMulticolor2": true,
"grid": 0,
"tags": [
"brand",
"google"
],
"grid": 0
"icons8-Webhook"
],
"colorPermutations": {
"233309915571791": [
{
"f": 0
},
{
"s": 0
},
{
"s": 0
},
{
"f": 1
},
{
"f": 0
},
{
"s": 1
}
]
}
},
"attrs": [
{
"fill": "rgb(66, 133, 244)"
}
{}
],
"properties": {
"id": 91,
"order": 78,
"order": 80,
"id": 0,
"name": "webhook",
"prevSize": 32,
"code": 59711,
"name": "brand2"
"code": 59714
},
"setIdx": 0,
"setId": 4,
"iconIdx": 90
"setId": 2,
"iconIdx": 0
},
{
"icon": {
@ -62,8 +79,8 @@
"code": 59713
},
"setIdx": 1,
"setId": 3,
"iconIdx": 0
"setId": 1,
"iconIdx": 1
},
{
"icon": {
@ -90,9 +107,9 @@
"prevSize": 32,
"code": 59652
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 26
"iconIdx": 2
},
{
"icon": {
@ -119,9 +136,9 @@
"prevSize": 32,
"code": 59653
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 27
"iconIdx": 3
},
{
"icon": {
@ -148,9 +165,9 @@
"prevSize": 32,
"code": 59654
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 28
"iconIdx": 4
},
{
"icon": {
@ -177,9 +194,9 @@
"prevSize": 32,
"code": 59655
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 29
"iconIdx": 5
},
{
"icon": {
@ -206,9 +223,9 @@
"prevSize": 32,
"code": 59656
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 30
"iconIdx": 6
},
{
"icon": {
@ -235,9 +252,9 @@
"prevSize": 32,
"code": 59657
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 31
"iconIdx": 7
},
{
"icon": {
@ -264,9 +281,9 @@
"prevSize": 32,
"code": 59658
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 32
"iconIdx": 8
},
{
"icon": {
@ -293,9 +310,9 @@
"prevSize": 32,
"code": 59659
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 33
"iconIdx": 9
},
{
"icon": {
@ -322,9 +339,9 @@
"prevSize": 32,
"code": 59660
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 34
"iconIdx": 10
},
{
"icon": {
@ -351,9 +368,9 @@
"prevSize": 32,
"code": 59661
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 35
"iconIdx": 11
},
{
"icon": {
@ -380,9 +397,9 @@
"prevSize": 32,
"code": 59662
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 36
"iconIdx": 12
},
{
"icon": {
@ -409,9 +426,9 @@
"prevSize": 32,
"code": 59663
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 37
"iconIdx": 13
},
{
"icon": {
@ -438,9 +455,9 @@
"prevSize": 32,
"code": 59664
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 38
"iconIdx": 14
},
{
"icon": {
@ -467,9 +484,9 @@
"prevSize": 32,
"code": 59665
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 39
"iconIdx": 15
},
{
"icon": {
@ -496,9 +513,9 @@
"prevSize": 32,
"code": 59666
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 40
"iconIdx": 16
},
{
"icon": {
@ -525,9 +542,9 @@
"prevSize": 32,
"code": 59667
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 41
"iconIdx": 17
},
{
"icon": {
@ -554,9 +571,9 @@
"prevSize": 32,
"code": 59668
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 42
"iconIdx": 18
},
{
"icon": {
@ -583,9 +600,9 @@
"prevSize": 32,
"code": 59669
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 43
"iconIdx": 19
},
{
"icon": {
@ -612,9 +629,9 @@
"prevSize": 32,
"code": 59670
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 44
"iconIdx": 20
},
{
"icon": {
@ -641,9 +658,9 @@
"prevSize": 32,
"code": 59671
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 45
"iconIdx": 21
},
{
"icon": {
@ -670,9 +687,9 @@
"prevSize": 32,
"code": 59672
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 46
"iconIdx": 22
},
{
"icon": {
@ -699,9 +716,9 @@
"prevSize": 32,
"code": 59673
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 47
"iconIdx": 23
},
{
"icon": {
@ -728,9 +745,9 @@
"prevSize": 32,
"code": 59674
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 48
"iconIdx": 24
},
{
"icon": {
@ -757,9 +774,9 @@
"prevSize": 32,
"code": 59675
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 49
"iconIdx": 25
},
{
"icon": {
@ -786,9 +803,9 @@
"prevSize": 32,
"code": 59676
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 50
"iconIdx": 26
},
{
"icon": {
@ -815,9 +832,9 @@
"prevSize": 32,
"code": 59677
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 51
"iconIdx": 27
},
{
"icon": {
@ -844,9 +861,9 @@
"prevSize": 32,
"code": 59678
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 52
"iconIdx": 28
},
{
"icon": {
@ -873,9 +890,9 @@
"prevSize": 32,
"code": 59679
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 53
"iconIdx": 29
},
{
"icon": {
@ -902,9 +919,9 @@
"prevSize": 32,
"code": 59680
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 54
"iconIdx": 30
},
{
"icon": {
@ -931,9 +948,9 @@
"prevSize": 32,
"code": 59681
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 55
"iconIdx": 31
},
{
"icon": {
@ -960,9 +977,9 @@
"prevSize": 32,
"code": 59682
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 56
"iconIdx": 32
},
{
"icon": {
@ -989,9 +1006,9 @@
"prevSize": 32,
"code": 59683
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 57
"iconIdx": 33
},
{
"icon": {
@ -1018,9 +1035,9 @@
"prevSize": 32,
"code": 59684
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 58
"iconIdx": 34
},
{
"icon": {
@ -1047,9 +1064,9 @@
"prevSize": 32,
"code": 59685
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 59
"iconIdx": 35
},
{
"icon": {
@ -1076,9 +1093,9 @@
"prevSize": 32,
"code": 59686
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 60
"iconIdx": 36
},
{
"icon": {
@ -1105,9 +1122,9 @@
"prevSize": 32,
"code": 59687
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 61
"iconIdx": 37
},
{
"icon": {
@ -1134,9 +1151,9 @@
"prevSize": 32,
"code": 59688
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 62
"iconIdx": 38
},
{
"icon": {
@ -1165,9 +1182,9 @@
"code": 59712,
"name": "microsoft"
},
"setIdx": 2,
"setId": 2,
"iconIdx": 0
"setIdx": 1,
"setId": 1,
"iconIdx": 39
},
{
"icon": {
@ -1195,9 +1212,9 @@
"code": 59707,
"name": "google"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 16
"iconIdx": 40
},
{
"icon": {
@ -1225,9 +1242,9 @@
"code": 59699,
"name": "unlocked"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 17
"iconIdx": 41
},
{
"icon": {
@ -1257,9 +1274,9 @@
"code": 59700,
"name": "lock"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 18
"iconIdx": 42
},
{
"icon": {
@ -1296,9 +1313,9 @@
"code": 59694,
"name": "reset"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 19
"iconIdx": 43
},
{
"icon": {
@ -1326,9 +1343,9 @@
"code": 59695,
"name": "pause"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 20
"iconIdx": 44
},
{
"icon": {
@ -1356,9 +1373,9 @@
"code": 59696,
"name": "play"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 21
"iconIdx": 45
},
{
"icon": {
@ -1391,9 +1408,9 @@
"code": 59693,
"name": "settings2"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 22
"iconIdx": 46
},
{
"icon": {
@ -1428,9 +1445,9 @@
"prevSize": 32,
"code": 59650
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 23
"iconIdx": 47
},
{
"icon": {
@ -1457,9 +1474,9 @@
"code": 59710,
"name": "download"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 0
"iconIdx": 48
},
{
"icon": {
@ -1486,9 +1503,9 @@
"code": 59705,
"name": "control-RichText"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 1
"iconIdx": 49
},
{
"icon": {
@ -1516,9 +1533,9 @@
"code": 59709,
"name": "bug"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 2
"iconIdx": 50
},
{
"icon": {
@ -1545,9 +1562,9 @@
"prevSize": 28,
"code": 59704
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 3
"iconIdx": 51
},
{
"icon": {
@ -1574,9 +1591,9 @@
"prevSize": 28,
"code": 59702
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 4
"iconIdx": 52
},
{
"icon": {
@ -1603,9 +1620,9 @@
"prevSize": 28,
"code": 59703
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 5
"iconIdx": 53
},
{
"icon": {
@ -1633,9 +1650,9 @@
"code": 59697,
"name": "angle-right"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 6
"iconIdx": 54
},
{
"icon": {
@ -1662,9 +1679,9 @@
"prevSize": 28,
"code": 59698
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 7
"iconIdx": 55
},
{
"icon": {
@ -1692,9 +1709,9 @@
"code": 59689,
"name": "caret-right"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 8
"iconIdx": 56
},
{
"icon": {
@ -1722,9 +1739,9 @@
"code": 59690,
"name": "caret-left"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 9
"iconIdx": 57
},
{
"icon": {
@ -1752,9 +1769,9 @@
"code": 59691,
"name": "caret-up"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 10
"iconIdx": 58
},
{
"icon": {
@ -1782,9 +1799,9 @@
"code": 59692,
"name": "caret-down"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 11
"iconIdx": 59
},
{
"icon": {
@ -1812,9 +1829,9 @@
"code": 59651,
"name": "angle-up"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 12
"iconIdx": 60
},
{
"icon": {
@ -1842,9 +1859,9 @@
"code": 59648,
"name": "angle-down"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 13
"iconIdx": 61
},
{
"icon": {
@ -1872,9 +1889,9 @@
"code": 59649,
"name": "angle-left"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 14
"iconIdx": 62
},
{
"icon": {
@ -1901,9 +1918,9 @@
"code": 59708,
"name": "info"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 15
"iconIdx": 63
},
{
"icon": {
@ -1931,9 +1948,9 @@
"code": 59706,
"name": "control-Stars"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 24
"iconIdx": 64
},
{
"icon": {
@ -1964,9 +1981,9 @@
"code": 59701,
"name": "browser"
},
"setIdx": 3,
"setIdx": 1,
"setId": 1,
"iconIdx": 25
"iconIdx": 65
}
],
"height": 1024,
@ -1996,7 +2013,8 @@
"png": true,
"useClassSelector": true,
"color": 0,
"bgColor": 16777215
"bgColor": 16777215,
"classSelector": ".icon"
},
"historySize": 100
}

57
src/Squidex/app/theme/icomoon/style.css

@ -1,10 +1,10 @@
@font-face {
font-family: 'icomoon';
src: url('fonts/icomoon.eot?h28uzm');
src: url('fonts/icomoon.eot?h28uzm#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?h28uzm') format('truetype'),
url('fonts/icomoon.woff?h28uzm') format('woff'),
url('fonts/icomoon.svg?h28uzm#icomoon') format('svg');
src: url('fonts/icomoon.eot?xczofg');
src: url('fonts/icomoon.eot?xczofg#iefix') format('embedded-opentype'),
url('fonts/icomoon.ttf?xczofg') format('truetype'),
url('fonts/icomoon.woff?xczofg') format('woff'),
url('fonts/icomoon.svg?xczofg#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
@ -24,9 +24,8 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-brand2:before {
content: "\e93f";
color: #4285f4;
.icon-webhook:before {
content: "\e942";
}
.icon-github:before {
content: "\e941";
@ -202,27 +201,6 @@
.icon-control-RichText:before {
content: "\e939";
}
.icon-control-Date:before {
content: "\e936";
}
.icon-control-DateTime:before {
content: "\e937";
}
.icon-angle-right:before {
content: "\e931";
}
.icon-user-o:before {
content: "\e932";
}
.icon-caret-right:before {
content: "\e929";
}
.icon-caret-left:before {
content: "\e92a";
}
.icon-caret-up:before {
content: "\e92b";
}
.icon-bug:before {
content: "\e93d";
}
@ -265,27 +243,6 @@
.icon-info:before {
content: "\e93c";
}
.icon-unlocked:before {
content: "\e933";
}
.icon-lock:before {
content: "\e934";
}
.icon-reset:before {
content: "\e92e";
}
.icon-pause:before {
content: "\e92f";
}
.icon-play:before {
content: "\e930";
}
.icon-settings2:before {
content: "\e92d";
}
.icon-bin2:before {
content: "\e902";
}
.icon-control-Stars:before {
content: "\e93a";
}

Loading…
Cancel
Save