Browse Source

Base path got working.

pull/352/head
Sebastian 7 years ago
parent
commit
fbe4c55973
  1. 4
      src/Squidex.Web/ApiController.cs
  2. 61
      src/Squidex/Areas/Api/Controllers/ApiController.cs
  3. 1
      src/Squidex/Areas/Api/Controllers/Docs/DocsController.cs
  4. 8
      src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs
  5. 19
      src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs
  6. 28
      src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
  7. 5
      src/Squidex/Areas/IdentityServer/Controllers/IdentityServerController.cs
  8. 16
      src/Squidex/app-config/webpack.config.js
  9. 2
      src/Squidex/app-config/webpack.run.base.js
  10. 2
      src/Squidex/app/app.component.html
  11. 17
      src/Squidex/app/app.module.ts
  12. 8
      src/Squidex/app/features/apps/pages/apps-page.component.html
  13. 12
      src/Squidex/app/features/apps/pages/onboarding-dialog.component.html
  14. 2
      src/Squidex/app/features/apps/pages/onboarding-dialog.component.scss
  15. 8
      src/Squidex/app/features/dashboard/pages/dashboard-page.component.html
  16. 4
      src/Squidex/app/shared/components/pipes.ts
  17. 2
      src/Squidex/app/shell/pages/home/home-page.component.html
  18. 2
      src/Squidex/app/shell/pages/internal/internal-area.component.html
  19. 259
      src/Squidex/wwwroot/_theme.html
  20. 11
      src/Squidex/wwwroot/client-callback-popup.html
  21. 11
      src/Squidex/wwwroot/client-callback-silent.html

4
src/Squidex.Web/ApiController.cs

@ -51,7 +51,9 @@ namespace Squidex.Web
public override void OnActionExecuting(ActionExecutingContext context) public override void OnActionExecuting(ActionExecutingContext context)
{ {
if (!context.HttpContext.Request.PathBase.StartsWithSegments("/api")) var request = context.HttpContext.Request;
if (!request.PathBase.HasValue || !request.PathBase.Value.EndsWith("/api", StringComparison.OrdinalIgnoreCase))
{ {
context.Result = new RedirectResult("/"); context.Result = new RedirectResult("/");
} }

61
src/Squidex/Areas/Api/Controllers/ApiController.cs

@ -1,61 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschränkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Squidex.Domain.Apps.Entities.Apps;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Commands;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers
{
[Area("Api")]
[ApiController]
[ApiExceptionFilter]
[ApiModelValidation(false)]
public abstract class ApiController : Controller
{
protected ICommandBus CommandBus { get; }
protected IAppEntity App
{
get
{
var appFeature = HttpContext.Features.Get<IAppFeature>();
if (appFeature == null)
{
throw new InvalidOperationException("Not in a app context.");
}
return appFeature.App;
}
}
protected Guid AppId
{
get { return App.Id; }
}
protected ApiController(ICommandBus commandBus)
{
Guard.NotNull(commandBus, nameof(commandBus));
CommandBus = commandBus;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.HttpContext.Request.PathBase.StartsWithSegments("/api"))
{
context.Result = new RedirectResult("/");
}
}
}
}

1
src/Squidex/Areas/Api/Controllers/Docs/DocsController.cs

@ -7,6 +7,7 @@
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Commands;
using Squidex.Web;
namespace Squidex.Areas.Api.Controllers.Docs namespace Squidex.Areas.Api.Controllers.Docs
{ {

8
src/Squidex/Areas/Frontend/Middlewares/IndexExtensions.cs

@ -12,14 +12,14 @@ namespace Squidex.Areas.Frontend.Middlewares
{ {
public static class IndexExtensions public static class IndexExtensions
{ {
public static bool IsIndexHtml(this HttpContext context) public static bool IsIndex(this HttpContext context)
{ {
return context.IsIndex() && context.IsHtml(); return context.Request.Path.Value.EndsWith("/index.html", StringComparison.OrdinalIgnoreCase);
} }
public static bool IsIndex(this HttpContext context) public static bool IsHtmlPath(this HttpContext context)
{ {
return context.Request.Path.Value.EndsWith("/index.html", StringComparison.OrdinalIgnoreCase); return context.Request.Path.Value.EndsWith(".html", StringComparison.OrdinalIgnoreCase);
} }
public static bool IsHtml(this HttpContext context) public static bool IsHtml(this HttpContext context)

19
src/Squidex/Areas/Frontend/Middlewares/IndexMiddleware.cs

@ -25,7 +25,7 @@ namespace Squidex.Areas.Frontend.Middlewares
{ {
var basePath = context.Request.PathBase; var basePath = context.Request.PathBase;
if (context.IsIndex() && basePath.HasValue) if (context.IsHtmlPath() && basePath.HasValue)
{ {
var responseBuffer = new MemoryStream(); var responseBuffer = new MemoryStream();
var responseBody = context.Response.Body; var responseBody = context.Response.Body;
@ -36,21 +36,14 @@ namespace Squidex.Areas.Frontend.Middlewares
context.Response.Body = responseBody; context.Response.Body = responseBody;
if (context.Response.StatusCode == 200 && context.IsIndexHtml()) var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
{
var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
response = AdjustBase(response, basePath); response = AdjustBase(response, basePath);
context.Response.ContentLength = Encoding.UTF8.GetByteCount(response); context.Response.ContentLength = Encoding.UTF8.GetByteCount(response);
context.Response.Body = responseBody; context.Response.Body = responseBody;
await context.Response.WriteAsync(response); await context.Response.WriteAsync(response);
}
else if (context.Response.StatusCode != 304)
{
await responseBuffer.CopyToAsync(responseBody);
}
} }
else else
{ {

28
src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs

@ -28,7 +28,7 @@ namespace Squidex.Areas.Frontend.Middlewares
public async Task Invoke(HttpContext context) public async Task Invoke(HttpContext context)
{ {
if (context.IsIndex()) if (context.IsHtmlPath())
{ {
var responseBuffer = new MemoryStream(); var responseBuffer = new MemoryStream();
var responseBody = context.Response.Body; var responseBody = context.Response.Body;
@ -39,22 +39,25 @@ namespace Squidex.Areas.Frontend.Middlewares
context.Response.Body = responseBody; context.Response.Body = responseBody;
if (context.Response.StatusCode == 200 && context.IsIndexHtml()) var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
{
var response = Encoding.UTF8.GetString(responseBuffer.ToArray());
if (context.IsIndex())
{
response = InjectStyles(response); response = InjectStyles(response);
response = InjectScripts(response); response = InjectScripts(response);
}
context.Response.ContentLength = Encoding.UTF8.GetByteCount(response); var basePath = context.Request.PathBase;
context.Response.Body = responseBody;
await context.Response.WriteAsync(response); if (basePath.HasValue)
}
else if (context.Response.StatusCode != 304)
{ {
await responseBuffer.CopyToAsync(responseBody); response = AdjustBase(response, basePath.Value);
} }
context.Response.ContentLength = Encoding.UTF8.GetByteCount(response);
context.Response.Body = responseBody;
await context.Response.WriteAsync(response);
} }
else else
{ {
@ -99,5 +102,10 @@ namespace Squidex.Areas.Frontend.Middlewares
return response; return response;
} }
private static string AdjustBase(string response, string baseUrl)
{
return response.Replace("<base href=\"/\">", $"<base href=\"{baseUrl}/\">");
}
} }
} }

5
src/Squidex/Areas/IdentityServer/Controllers/IdentityServerController.cs

@ -5,6 +5,7 @@
// All rights reserved. Licensed under the MIT license. // All rights reserved. Licensed under the MIT license.
// ========================================================================== // ==========================================================================
using System;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
@ -15,7 +16,9 @@ namespace Squidex.Areas.IdentityServer.Controllers
{ {
public override void OnActionExecuting(ActionExecutingContext context) public override void OnActionExecuting(ActionExecutingContext context)
{ {
if (!context.HttpContext.Request.PathBase.StartsWithSegments("/identity-server")) var request = context.HttpContext.Request;
if (!request.PathBase.HasValue || !request.PathBase.Value.EndsWith("/identity-server", StringComparison.OrdinalIgnoreCase))
{ {
context.Result = new NotFoundResult(); context.Result = new NotFoundResult();
} }

16
src/Squidex/app-config/webpack.config.js

@ -9,6 +9,8 @@ const plugins = {
TsconfigPathsPlugin: require('tsconfig-paths-webpack-plugin') TsconfigPathsPlugin: require('tsconfig-paths-webpack-plugin')
}; };
const isDevServer = path.basename(require.main.filename) === 'webpack-dev-server.js';
module.exports = { module.exports = {
/** /**
* Options affecting the resolving of modules. * Options affecting the resolving of modules.
@ -83,16 +85,22 @@ module.exports = {
}, { }, {
test: /\.(woff|woff2|ttf|eot)(\?.*$|$)/, test: /\.(woff|woff2|ttf|eot)(\?.*$|$)/,
use: [{ use: [{
loader: 'file-loader?name=assets/[name].[hash].[ext]', loader: 'file-loader?name=[name].[hash].[ext]',
options: { options: {
publicPath: 'assets/', outputPath: 'assets',
outputPath: 'assets' /*
* Use custom public path as ./ is not supported by fonts.
*/
publicPath: isDevServer ? undefined : 'assets'
} }
}] }]
}, { }, {
test: /\.(png|jpe?g|gif|svg|ico)(\?.*$|$)/, test: /\.(png|jpe?g|gif|svg|ico)(\?.*$|$)/,
use: [{ use: [{
loader: 'file-loader?name=assets/[name].[hash].[ext]' loader: 'file-loader?name=[name].[hash].[ext]',
options: {
outputPath: 'assets'
}
}] }]
}, { }, {
test: /\.css$/, test: /\.css$/,

2
src/Squidex/app-config/webpack.run.base.js

@ -28,7 +28,7 @@ module.exports = webpackMerge(commonConfig, {
}), }),
new plugins.HtmlWebpackPlugin({ new plugins.HtmlWebpackPlugin({
template: 'wwwroot/theme.html', hash: true, chunksSortMode: 'none', filename: 'theme.html' template: 'wwwroot/_theme.html', hash: true, chunksSortMode: 'none', filename: 'theme.html'
}) })
] ]
}); });

2
src/Squidex/app/app.component.html

@ -3,7 +3,7 @@
<sqx-dialog-renderer> <sqx-dialog-renderer>
<router-outlet (activate)="isLoaded = true"> <router-outlet (activate)="isLoaded = true">
<div class="loading" *ngIf="!isLoaded"> <div class="loading" *ngIf="!isLoaded">
<img alt="Loading" src="/images/loader.gif" /> <img alt="Loading" src="./images/loader.gif" />
<div>Loading Squidex</div> <div>Loading Squidex</div>
</div> </div>

17
src/Squidex/app/app.module.ts

@ -32,7 +32,22 @@ import { SqxShellModule } from './shell';
import { routing } from './app.routes'; import { routing } from './app.routes';
export function configApiUrl() { export function configApiUrl() {
return new ApiUrlConfig(window.location.protocol + '//' + window.location.host + '/'); let bases = document.getElementsByTagName('base');
let baseHref = null;
if (bases.length > 0) {
baseHref = bases[0].href;
}
if (!baseHref) {
baseHref = '/';
}
if (baseHref.indexOf(window.location.protocol) === 0) {
return new ApiUrlConfig(baseHref);
} else {
return new ApiUrlConfig(window.location.protocol + '//' + window.location.host + baseHref);
}
} }
export function configTitles() { export function configTitles() {

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

@ -30,7 +30,7 @@
<div class="card card-template card-href" (click)="createNewApp('')"> <div class="card card-template card-href" (click)="createNewApp('')">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/add-app.png" /> <img src="./images/add-app.png" />
</div> </div>
<h4 class="card-title">New App</h4> <h4 class="card-title">New App</h4>
@ -44,7 +44,7 @@
<div class="card card-template card-href" (click)="createNewApp('Blog')"> <div class="card card-template card-href" (click)="createNewApp('Blog')">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/add-blog.png" /> <img src="./images/add-blog.png" />
</div> </div>
<h4 class="card-title">New Blog Sample</h4> <h4 class="card-title">New Blog Sample</h4>
@ -61,7 +61,7 @@
<div class="card card-template card-href" (click)="createNewApp('Profile')"> <div class="card card-template card-href" (click)="createNewApp('Profile')">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/add-profile.png" /> <img src="./images/add-profile.png" />
</div> </div>
<h4 class="card-title">New Profile Sample</h4> <h4 class="card-title">New Profile Sample</h4>
@ -78,7 +78,7 @@
<div class="card card-template card-href" (click)="createNewApp('Identity')"> <div class="card card-template card-href" (click)="createNewApp('Identity')">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/add-identity.png" /> <img src="./images/add-identity.png" />
</div> </div>
<h4 class="card-title">New Identity App</h4> <h4 class="card-title">New Identity App</h4>

12
src/Squidex/app/features/apps/pages/onboarding-dialog.component.html

@ -3,7 +3,7 @@
<a class="header-right modal-close" (click)="emitClose()">Skip Tour</a> <a class="header-right modal-close" (click)="emitClose()">Skip Tour</a>
<div class="onboarding-step" *ngIf="step === 0"> <div class="onboarding-step" *ngIf="step === 0">
<img @fade class="header-left" src="/images/logo-white-small.png" /> <img @fade class="header-left" src="./images/logo-white-small.png" />
<div @slide class="onboarding-enter-leave"> <div @slide class="onboarding-enter-leave">
<h1>Welcome to <span class="header-focus">Squidex CMS</span></h1> <h1>Welcome to <span class="header-focus">Squidex CMS</span></h1>
@ -34,7 +34,7 @@
</div> </div>
</div> </div>
<div class="col col-image"> <div class="col col-image">
<img src="/images/onboarding-step1.png" /> <img src="./images/onboarding-step1.png" />
</div> </div>
</div> </div>
@ -59,7 +59,7 @@
</div> </div>
</div> </div>
<div class="col col-image"> <div class="col col-image">
<img src="/images/onboarding-step2.png" /> <img src="./images/onboarding-step2.png" />
</div> </div>
</div> </div>
@ -84,7 +84,7 @@
</div> </div>
</div> </div>
<div class="col col-image"> <div class="col col-image">
<img src="/images/onboarding-step3.png" /> <img src="./images/onboarding-step3.png" />
</div> </div>
</div> </div>
@ -109,7 +109,7 @@
</div> </div>
</div> </div>
<div class="col col-image"> <div class="col col-image">
<img src="/images/onboarding-step4.png" /> <img src="./images/onboarding-step4.png" />
</div> </div>
</div> </div>
@ -119,7 +119,7 @@
</div> </div>
</div> </div>
<div class="onboarding-step" *ngIf="step === 5"> <div class="onboarding-step" *ngIf="step === 5">
<img @fade class="header-left" src="/images/logo-white-small.png" /> <img @fade class="header-left" src="./images/logo-white-small.png" />
<div @slide class="onboarding-enter-leave"> <div @slide class="onboarding-enter-leave">
<h1>Awesome, now you know the basics!</h1> <h1>Awesome, now you know the basics!</h1>

2
src/Squidex/app/features/apps/pages/onboarding-dialog.component.scss

@ -31,7 +31,7 @@ p {
&-content { &-content {
color: $color-dark-foreground; color: $color-dark-foreground;
background-color: $color-dark-onboarding; background-color: $color-dark-onboarding;
background-image: url('/images/onboarding-background.png'); background-image: url('./images/onboarding-background.png');
position: relative; position: relative;
} }

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

@ -15,7 +15,7 @@
<a class="card card-href" [routerLink]="['schemas', { showDialog: true }]" *sqxPermission="'squidex.apps.{app}.schemas.*.read'"> <a class="card card-href" [routerLink]="['schemas', { showDialog: true }]" *sqxPermission="'squidex.apps.{app}.schemas.*.read'">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/dashboard-schema.png" /> <img src="./images/dashboard-schema.png" />
</div> </div>
<h4 class="card-title">New Schema</h4> <h4 class="card-title">New Schema</h4>
@ -29,7 +29,7 @@
<a class="card card-href" href="/api/docs" sqxExternalLink="noicon"> <a class="card card-href" href="/api/docs" sqxExternalLink="noicon">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/dashboard-api.png" /> <img src="./images/dashboard-api.png" />
</div> </div>
<h4 class="card-title">API Documentation <i class="icon-external-link"></i></h4> <h4 class="card-title">API Documentation <i class="icon-external-link"></i></h4>
@ -43,7 +43,7 @@
<a class="card card-href" href="https://support.squidex.io" sqxExternalLink="noicon"> <a class="card card-href" href="https://support.squidex.io" sqxExternalLink="noicon">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/dashboard-feedback.png" /> <img src="./images/dashboard-feedback.png" />
</div> </div>
<h4 class="card-title">Feedback & Support <i class="icon-external-link"></i></h4> <h4 class="card-title">Feedback & Support <i class="icon-external-link"></i></h4>
@ -57,7 +57,7 @@
<a class="card card-href" href="https://github.com/squidex/squidex" sqxExternalLink="noicon"> <a class="card card-href" href="https://github.com/squidex/squidex" sqxExternalLink="noicon">
<div class="card-body"> <div class="card-body">
<div class="card-image"> <div class="card-image">
<img src="/images/dashboard-github.png" /> <img src="./images/dashboard-github.png" />
</div> </div>
<h4 class="card-title">Github <i class="icon-external-link"></i></h4> <h4 class="card-title">Github <i class="icon-external-link"></i></h4>

4
src/Squidex/app/shared/components/pipes.ts

@ -202,7 +202,7 @@ export class UserPictureRefPipe extends UserAsyncPipe implements PipeTransform {
if (parts[0] === 'subject') { if (parts[0] === 'subject') {
return users.getUser(parts[1]).pipe(map(u => this.apiUrl.buildUrl(`api/users/${u.id}/picture`))); return users.getUser(parts[1]).pipe(map(u => this.apiUrl.buildUrl(`api/users/${u.id}/picture`)));
} else { } else {
return of('/images/client.png'); return of('./images/client.png');
} }
}); });
} }
@ -259,6 +259,6 @@ export class FileIconPipe implements PipeTransform {
mimeIcon = knownTypes.indexOf(asset.fileType) >= 0 ? asset.fileType : 'generic'; mimeIcon = knownTypes.indexOf(asset.fileType) >= 0 ? asset.fileType : 'generic';
} }
return `/images/asset_${mimeIcon}.png`; return `./images/asset_${mimeIcon}.png`;
} }
} }

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

@ -1,7 +1,7 @@
<div class="login-area"> <div class="login-area">
<div class="card"> <div class="card">
<div class="card-body text-center"> <div class="card-body text-center">
<img alt="Logo" class="login-icon login-element" src="/images/logo-half.png" /> <img alt="Logo" class="login-icon login-element" src="./images/logo-half.png" />
<div> <div>
<button type="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()">

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

@ -1,7 +1,7 @@
<nav class="navbar fixed-top navbar-dark bg-primary bg-faded"> <nav class="navbar fixed-top navbar-dark bg-primary bg-faded">
<span class="navbar-brand" routerLink="/app"> <span class="navbar-brand" routerLink="/app">
<ng-container *ngIf="loadingService.loading | async; else noLoading"> <ng-container *ngIf="loadingService.loading | async; else noLoading">
<img class="loader" src="/images/loader-white.gif" @fade /> <img class="loader" src="./images/loader-white.gif" @fade />
</ng-container> </ng-container>
<ng-template #noLoading> <ng-template #noLoading>

259
src/Squidex/wwwroot/theme.html → src/Squidex/wwwroot/_theme.html

@ -1,4 +1,4 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
@ -51,7 +51,7 @@
<div class="bs-component"> <div class="bs-component">
<nav class="navbar navbar-toggleable-md navbar-dark bg-primary"> <nav class="navbar navbar-toggleable-md navbar-dark bg-primary">
<button type="button" classnavbar-toggler navbar-toggler-right" type="button"> <button type="button" classnavbar-toggler navbar-toggler-right">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
@ -75,7 +75,7 @@
<form class="form-inline"> <form class="form-inline">
<input class="form-control mr-sm-2" type="text" placeholder="Search"> <input class="form-control mr-sm-2" type="text" placeholder="Search">
<button type="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">Search</button>
</form> </form>
</div> </div>
</nav> </nav>
@ -83,7 +83,7 @@
<div class="bs-component"> <div class="bs-component">
<nav class="navbar navbar-toggleable-md navbar-dark bg-inverse"> <nav class="navbar navbar-toggleable-md navbar-dark bg-inverse">
<button type="button" classnavbar-toggler navbar-toggler-right" type="button"> <button type="button" classnavbar-toggler navbar-toggler-right">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
@ -107,7 +107,7 @@
<form class="form-inline"> <form class="form-inline">
<input class="form-control mr-sm-2" type="text" placeholder="Search"> <input class="form-control mr-sm-2" type="text" placeholder="Search">
<button type="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">Search</button>
</form> </form>
</div> </div>
</nav> </nav>
@ -1242,159 +1242,158 @@
</div> </div>
<div class="bs-docs-section"> <div class="bs-docs-section">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="page-header"> <div class="page-header">
<h1>Modals</h1> <h1>Modals</h1>
</div>
</div> </div>
</div> </div>
<div class="row"> </div>
<div class="col-lg-12"> <div class="row">
<h2>Default</h2> <div class="col-lg-12">
<div class="bs-component"> <h2>Default</h2>
<div class="panel panel-light"> <div class="bs-component">
<div class="panel-header"> <div class="panel panel-light">
<div class="panel-title-row"> <div class="panel-header">
<div class="float-right"> <div class="panel-title-row">
<button type="button" class="btn btn-success">New</button> <div class="float-right">
</div> <button type="button" class="btn btn-success">New</button>
<h3 class="panel-title">
Title
</h3>
</div> </div>
<a class="panel-close"> <h3 class="panel-title">
<i class="icon-close"></i> Title
</a> </h3>
</div> </div>
<div class="panel-main"> <a class="panel-close">
<div class="panel-content"> <i class="icon-close"></i>
<div class="panel-alert panel-alert-danger"> </a>
Alert </div>
</div>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</div>
<div class="panel-sidebar"> <div class="panel-main">
<a href="#" class="panel-link"> <div class="panel-content">
<i class="icon-help"></i> <div class="panel-alert panel-alert-danger">
</a> Alert
</div> </div>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</div>
<div class="panel-sidebar">
<a href="#" class="panel-link">
<i class="icon-help"></i>
</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-lg-6"> <div class="col-lg-6">
<h2>Light</h2> <h2>Light</h2>
<div class="bs-component"> <div class="bs-component">
<div class="panel panel-light"> <div class="panel panel-light">
<div class="panel-header"> <div class="panel-header">
<div class="panel-title-row"> <div class="panel-title-row">
<div class="float-right"> <div class="float-right">
<button type="button" class="btn btn-success">New</button> <button type="button" class="btn btn-success">New</button>
</div>
<h3 class="panel-title">
Title
</h3>
</div> </div>
<a class="panel-close"> <h3 class="panel-title">
<i class="icon-close"></i> Title
</a> </h3>
</div> </div>
<div class="panel-main"> <a class="panel-close">
<div class="panel-content panel-content-blank"> <i class="icon-close"></i>
<ul class="nav nav-panel nav-dark-bordered flex-column"> </a>
<li class="nav-item"> </div>
<a class="nav-link">Link 1
<i class="icon-angle-right"></i> <div class="panel-main">
</a> <div class="panel-content panel-content-blank">
</li> <ul class="nav nav-panel nav-dark-bordered flex-column">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link">Link 2 <a class="nav-link">Link 1
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link active">Link 3 <a class="nav-link">Link 2
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link">Link 4 <a class="nav-link active">Link 3
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
</ul> <li class="nav-item">
</div> <a class="nav-link">Link 4
<i class="icon-angle-right"></i>
</a>
</li>
</ul>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-6"> </div>
<h2>Dark</h2> <div class="col-lg-6">
<div class="bs-component"> <h2>Dark</h2>
<div class="panel panel-dark"> <div class="bs-component">
<div class="panel-header large"> <div class="panel panel-dark">
<div class="panel-title-row"> <div class="panel-header large">
<div class="float-right"> <div class="panel-title-row">
<button type="button" class="btn btn-success">New</button> <div class="float-right">
</div> <button type="button" class="btn btn-success">New</button>
<h3 class="panel-title">
Title
</h3>
</div> </div>
<a class="panel-close"> <h3 class="panel-title">
<i class="icon-close"></i> Title
</a> </h3>
</div>
<a class="panel-close">
<i class="icon-close"></i>
</a>
<div class="panel-header-row"> <div class="panel-header-row">
<div class="search-form"> <div class="search-form">
<input class="form-control form-control-dark" placeholder="Search here..." /> <input class="form-control form-control-dark" placeholder="Search here..." />
</div>
</div> </div>
</div> </div>
</div>
<div class="panel-main"> <div class="panel-main">
<div class="panel-content"> <div class="panel-content">
<ul class="nav nav-panel nav-dark nav-dark-bordered flex-column"> <ul class="nav nav-panel nav-dark nav-dark-bordered flex-column">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link">Link 1 <a class="nav-link">Link 1
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link">Link 2 <a class="nav-link">Link 2
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link active">Link 3 <a class="nav-link active">Link 3
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link">Link 4 <a class="nav-link">Link 4
<i class="icon-angle-right"></i> <i class="icon-angle-right"></i>
</a> </a>
</li> </li>
</ul> </ul>
</div>
</div> </div>
</div> </div>
</div> </div>

11
src/Squidex/wwwroot/client-callback-popup.html

@ -1,12 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<base href="/">
</head>
<body> <body>
<script src="/scripts/oidc-client.min.js"></script> <script src="./scripts/oidc-client.min.js"></script>
<script> <script>
Oidc.Log.logger = console; Oidc.Log.logger = console;
Oidc.Log.logLevel = Oidc.Log.INFO; Oidc.Log.logLevel = Oidc.Log.INFO;
new Oidc.UserManager().signinPopupCallback(); new Oidc.UserManager().signinPopupCallback();
</script> </script>
</body> </body>
</html> </html>

11
src/Squidex/wwwroot/client-callback-silent.html

@ -1,12 +1,15 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head>
<base href="/">
</head>
<body> <body>
<script src="/scripts/oidc-client.min.js"></script> <script src="./scripts/oidc-client.min.js"></script>
<script> <script>
Oidc.Log.logger = console; Oidc.Log.logger = console;
Oidc.Log.logLevel = Oidc.Log.INFO; Oidc.Log.logLevel = Oidc.Log.INFO;
new Oidc.UserManager().signinSilentCallback(); new Oidc.UserManager().signinSilentCallback();
</script> </script>
</body> </body>
</html> </html>

Loading…
Cancel
Save