- Some minor on request debugger
This commit is contained in:
parent
c3e3d6a73a
commit
ba74c5a38e
@ -13,7 +13,7 @@ class %DELETE_FORM_CONTEXT_CLASSNAME% extends \Lean\Api\Lib\FormContext
|
|||||||
|
|
||||||
public function valid(? %ENTITY_NS%\%CLASSNAME% $entity = null) : bool
|
public function valid(? %ENTITY_NS%\%CLASSNAME% $entity = null) : bool
|
||||||
{
|
{
|
||||||
if ( ! $this->getEntity()->isLoaded() ) {
|
if ( $entity === null ) {
|
||||||
$this->pushErrorMessage('lean.api.form.delete.error.entity');
|
$this->pushErrorMessage('lean.api.form.delete.error.entity');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -17,8 +17,8 @@ class ContextField
|
|||||||
public ?int $maxLength = null,
|
public ?int $maxLength = null,
|
||||||
public ?string $regexFormat = null,
|
public ?string $regexFormat = null,
|
||||||
public ?string $example = null,
|
public ?string $example = null,
|
||||||
public bool $hidden = false,
|
|
||||||
public mixed $default = null,
|
public mixed $default = null,
|
||||||
|
public bool $hidden = false,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
public function assertValueSpecs(mixed $value, bool $isNew) : void
|
public function assertValueSpecs(mixed $value, bool $isNew) : void
|
||||||
@ -39,10 +39,7 @@ class ContextField
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($this->regexFormat) {
|
if ($this->regexFormat) {
|
||||||
if (! is_string($value)) {
|
if (! preg_match($this->regexFormat, $value)) {
|
||||||
throw new RegexFormatException("Property type must be a string if a regexFormat is provided.");
|
|
||||||
}
|
|
||||||
elseif (! preg_match($this->regexFormat, $value)) {
|
|
||||||
throw new RegexFormatException("Regex format {$this->regexFormat} is not valid for value {$value}.");
|
throw new RegexFormatException("Regex format {$this->regexFormat} is not valid for value {$value}.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,79 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Lean\Api\Entity;
|
|
||||||
|
|
||||||
use Lean\Api\Attribute\EntityField;
|
|
||||||
use Ulmus\EntityTrait,
|
|
||||||
Ulmus\SearchRequest\SearchableInterface,
|
|
||||||
Ulmus\SearchRequest\SearchRequestInterface,
|
|
||||||
Ulmus\Entity\Field\Datetime;
|
|
||||||
|
|
||||||
use Ulmus\{Attribute\Obj\Table,
|
|
||||||
Entity\EntityInterface};
|
|
||||||
|
|
||||||
use Ulmus\{Api\Common\MethodEnum,
|
|
||||||
SearchRequest,
|
|
||||||
SearchRequest\Attribute\PropertyValueModifier\Split,
|
|
||||||
SearchRequest\Attribute\PropertyValueSource,
|
|
||||||
SearchRequest\Attribute\SearchOrderBy,
|
|
||||||
SearchRequest\Attribute\SearchWhere,
|
|
||||||
SearchRequest\SearchMethodEnum};
|
|
||||||
|
|
||||||
use Ulmus\Attribute\Property\{Field, Filter, FilterJoin, Relation, Join, Virtual, Where};
|
|
||||||
|
|
||||||
#[Table(name: "debug_errors", adapter: "lean.api")]
|
|
||||||
class Error implements EntityInterface, \JsonSerializable {
|
|
||||||
use EntityTrait;
|
|
||||||
|
|
||||||
#[Field\Id]
|
|
||||||
public int $id;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "URL from which the error occurred")]
|
|
||||||
public string $url;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "HTTP method", field: "httpMethod")]
|
|
||||||
public MethodEnum $method;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "Error message")]
|
|
||||||
public string $message;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "Error code")]
|
|
||||||
public int $code;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "File from which the error occurred")]
|
|
||||||
public string $file;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "Line in the file from which the error occurred")]
|
|
||||||
public int $line;
|
|
||||||
|
|
||||||
#[Field]
|
|
||||||
#[EntityField(description: "Stack trace of the exception")]
|
|
||||||
public array $trace;
|
|
||||||
|
|
||||||
#[Field\CreatedAt(name: "created_at")]
|
|
||||||
public Datetime $createdAt;
|
|
||||||
|
|
||||||
public function __toString() {
|
|
||||||
return mb_strlen($this->message) > 255 ? mb_substr($this->message, 0, 255) . "[...]" : $this->message;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function searchRequest(...$arguments) : SearchRequestInterface
|
|
||||||
{
|
|
||||||
return new #[SearchRequest\Attribute\SearchRequestParameter(Error::class)] class(...$arguments) extends SearchRequest\SearchRequest {
|
|
||||||
#[SearchRequest\Attribute\SearchWhere(source: SearchRequest\Attribute\PropertyValueSource::RequestAttribute)]
|
|
||||||
public int $id;
|
|
||||||
|
|
||||||
#[SearchWhere(method: SearchMethodEnum::Like)]
|
|
||||||
public string $message;
|
|
||||||
|
|
||||||
#[SearchOrderBy(parameter: "created_at",)]
|
|
||||||
public string $createdAt = SearchOrderBy::DESCENDING;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
8
src/Entity/Field/Date.php
Normal file
8
src/Entity/Field/Date.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lean\Api\Entity\Field;
|
||||||
|
|
||||||
|
class Date extends Datetime {
|
||||||
|
|
||||||
|
public string $format = "Y-m-d";
|
||||||
|
}
|
||||||
11
src/Entity/Field/Datetime.php
Normal file
11
src/Entity/Field/Datetime.php
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lean\Api\Entity\Field;
|
||||||
|
|
||||||
|
class Datetime extends \Ulmus\Entity\Field\Datetime
|
||||||
|
{
|
||||||
|
public function jsonSerialize(): mixed
|
||||||
|
{
|
||||||
|
return (string) $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
8
src/Entity/Field/Time.php
Normal file
8
src/Entity/Field/Time.php
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lean\Api\Entity\Field;
|
||||||
|
|
||||||
|
class Time extends Datetime {
|
||||||
|
|
||||||
|
public string $format = "H:i:s";
|
||||||
|
}
|
||||||
@ -36,6 +36,13 @@ class EntityDescriptor
|
|||||||
if ($field) {
|
if ($field) {
|
||||||
$types = $property->getTypes();
|
$types = $property->getTypes();
|
||||||
|
|
||||||
|
if ($property->value ?? false) {
|
||||||
|
$default = $property->value instanceof \BackedEnum ? $property->value->value : $property->value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$default = $field->object->attributes['default'] ?? null;
|
||||||
|
}
|
||||||
|
|
||||||
$fields[] = [
|
$fields[] = [
|
||||||
'name' => $property->name,
|
'name' => $property->name,
|
||||||
'description' => $entityField->object->description ?? "",
|
'description' => $entityField->object->description ?? "",
|
||||||
@ -45,6 +52,7 @@ class EntityDescriptor
|
|||||||
'allowNulls' => $property->allowsNull(),
|
'allowNulls' => $property->allowsNull(),
|
||||||
'length' => $field->object->length ?? null,
|
'length' => $field->object->length ?? null,
|
||||||
'readonly' => $field->object->readonly,
|
'readonly' => $field->object->readonly,
|
||||||
|
'default' => $default,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,8 +65,15 @@ class EntityDescriptor
|
|||||||
$field = $property->getAttribute(SearchParameter::class);
|
$field = $property->getAttribute(SearchParameter::class);
|
||||||
|
|
||||||
if ($field) {
|
if ($field) {
|
||||||
|
$possibleValues = null;
|
||||||
$types = $property->getTypes();
|
$types = $property->getTypes();
|
||||||
|
|
||||||
|
foreach($types as $type) {
|
||||||
|
if (! $type->builtIn && enum_exists($type->type)) {
|
||||||
|
$possibleValues = implode(', ', array_map(fn($e) => $e->value, $type->type::cases()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$searchFields[] = [
|
$searchFields[] = [
|
||||||
'name' => $property->name,
|
'name' => $property->name,
|
||||||
'description' => $field->object->description,
|
'description' => $field->object->description,
|
||||||
@ -66,6 +81,7 @@ class EntityDescriptor
|
|||||||
'tag' => $field->tag,
|
'tag' => $field->tag,
|
||||||
'type' => implode(' | ', array_map(fn($e) => $e->type, $types)),
|
'type' => implode(' | ', array_map(fn($e) => $e->type, $types)),
|
||||||
'allowNulls' => $property->allowsNull(),
|
'allowNulls' => $property->allowsNull(),
|
||||||
|
'possibleValues' => $possibleValues,
|
||||||
'default' => $this->displayValue($property->value ?? "")
|
'default' => $this->displayValue($property->value ?? "")
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -8,13 +8,26 @@ use Ulmus\Entity\EntityInterface;
|
|||||||
|
|
||||||
abstract class Delete extends Form implements \Picea\Ui\Method\FormInterface {
|
abstract class Delete extends Form implements \Picea\Ui\Method\FormInterface {
|
||||||
|
|
||||||
public function execute(FormContextInterface $context) : void
|
public function validate(FormContextInterface $context) : bool
|
||||||
|
{
|
||||||
|
if ( ! $this->getEntity()->isLoaded() ) {
|
||||||
|
$context->pushMessage($this->message::generateError(
|
||||||
|
$this->lang('lean.api.form.delete.error.entity')
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $context->valid($this->getEntity()->isLoaded() ? $this->getEntity() : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute(FormContextInterface $context) : mixed
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
if ( $this->getEntity()::repository()->destroy($this->getEntity()) ) {
|
if ( $this->getEntity()::repository()->destroy($this->getEntity()) ) {
|
||||||
$context->pushMessage($this->message::generateSuccess(
|
$context->pushMessage($this->message::generateSuccess(
|
||||||
$this->lang('lean.api.form.delete.success.save')
|
$this->lang('lean.api.form.delete.success.save')
|
||||||
));
|
));
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new \InvalidArgumentException($this->lang('lean.api.form.delete.error.save'));
|
throw new \InvalidArgumentException($this->lang('lean.api.form.delete.error.save'));
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
namespace Lean\Api\Form;
|
namespace Lean\Api\Form;
|
||||||
|
|
||||||
use CSLSJ\Lean\Form\Session\EmailContext;
|
use CSLSJ\Lean\Form\Session\EmailContext;
|
||||||
use Picea\Ui\Method\{ FormContextInterface, };
|
use Picea\Ui\Method\{FormContext, FormContextInterface};
|
||||||
|
|
||||||
use Lean\Api\Attribute\ContextField;
|
use Lean\Api\Attribute\ContextField;
|
||||||
use Lean\Api\Exception\MandatoryFieldException;
|
use Lean\Api\Exception\MandatoryFieldException;
|
||||||
@ -19,6 +19,8 @@ abstract class Save extends Form implements \Picea\Ui\Method\FormInterface {
|
|||||||
|
|
||||||
protected array $reflectedProperties;
|
protected array $reflectedProperties;
|
||||||
|
|
||||||
|
protected string $contextClass = FormContext::class;
|
||||||
|
|
||||||
public function initialize(FormContextInterface $context) : void
|
public function initialize(FormContextInterface $context) : void
|
||||||
{
|
{
|
||||||
if ( ! $this->getEntity()->isLoaded() ) {
|
if ( ! $this->getEntity()->isLoaded() ) {
|
||||||
@ -46,12 +48,14 @@ abstract class Save extends Form implements \Picea\Ui\Method\FormInterface {
|
|||||||
|
|
||||||
if ($entity->isLoaded()) {
|
if ($entity->isLoaded()) {
|
||||||
if (property_exists($entity, 'updatedAt') && $entity->repository()->generateDatasetDiff($entity) ) {
|
if (property_exists($entity, 'updatedAt') && $entity->repository()->generateDatasetDiff($entity) ) {
|
||||||
$entity->updatedAt = new Datetime();
|
$cls = $entity::resolveEntity()->field('updatedAt')->type->type;
|
||||||
|
$entity->updatedAt = new $cls();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (property_exists($entity, 'createdAt') && empty($entity->createdAt)) {
|
if (property_exists($entity, 'createdAt') && empty($entity->createdAt)) {
|
||||||
$entity->createdAt = new Datetime();
|
$cls = $entity::resolveEntity()->field('createdAt')->type->type;
|
||||||
|
$entity->createdAt = new $cls();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +86,7 @@ abstract class Save extends Form implements \Picea\Ui\Method\FormInterface {
|
|||||||
|
|
||||||
if ($attribute) {
|
if ($attribute) {
|
||||||
try {
|
try {
|
||||||
$attribute->object->assertValueSpecs($context->$name ?? null, $this->getEntity()->isLoaded());
|
$attribute->object->assertValueSpecs($context->$name ?? null, ! $this->getEntity()->isLoaded());
|
||||||
} catch (MandatoryFieldException $e) {
|
} catch (MandatoryFieldException $e) {
|
||||||
throw new MandatoryFieldException("An error occured with field '$name': " . $e->getMessage());
|
throw new MandatoryFieldException("An error occured with field '$name': " . $e->getMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,7 @@ class FormDescriptor
|
|||||||
|
|
||||||
$fields[] = [
|
$fields[] = [
|
||||||
'name' => $property->name,
|
'name' => $property->name,
|
||||||
|
'mandatory' => $field->object->mandatory,
|
||||||
'description' => $field->object->description,
|
'description' => $field->object->description,
|
||||||
'type' => $field->object->type ?? $types,
|
'type' => $field->object->type ?? $types,
|
||||||
'allowNulls' => $property->allowsNull(),
|
'allowNulls' => $property->allowsNull(),
|
||||||
@ -35,6 +36,7 @@ class FormDescriptor
|
|||||||
'minLength' => $field->object->minLength ?? null,
|
'minLength' => $field->object->minLength ?? null,
|
||||||
'maxLength' => $field->object->maxLength ?? null,
|
'maxLength' => $field->object->maxLength ?? null,
|
||||||
'example' => $field->object->example ?? null,
|
'example' => $field->object->example ?? null,
|
||||||
|
'default' => isset($field->object->default) ? json_encode($field->object->default) : null,
|
||||||
'values' => $this->generateExampleValues($types),
|
'values' => $this->generateExampleValues($types),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,12 +80,14 @@ trait LeanApiTrait
|
|||||||
$entity = $entityType::repository()->filterServerRequest($search)->loadOne() ?? false;
|
$entity = $entityType::repository()->filterServerRequest($search)->loadOne() ?? false;
|
||||||
|
|
||||||
if (! $entity ) {
|
if (! $entity ) {
|
||||||
throw new \InvalidArgumentException(sprintf("L'entré pour l'entité demandé (%s) est introuvable avec le ou les arguments fournis '%s'", $entityType, json_encode($request->getAttributes())));
|
throw new \InvalidArgumentException(sprintf("L'entré pour l'entité demandé (%s) est introuvable avec le ou les arguments fournis '%s'", $entityType, json_encode($request->getAttributes(), \JSON_PARTIAL_OUTPUT_ON_ERROR)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $request->withAttribute("lean.searchRequest",
|
if ($request->getAttribute("lean.searchRequest") === null) {
|
||||||
[
|
$request = $request->withAttribute("lean.searchRequest", $this->searchEntityResult());
|
||||||
$resultKey ?: $entityType => new class($search, $entity) implements ApiSearchRequestInterface {
|
}
|
||||||
|
|
||||||
|
$request->getAttribute("lean.searchRequest")[$resultKey ?: $entityType] = new class($search, $entity) implements ApiSearchRequestInterface {
|
||||||
public function __construct(
|
public function __construct(
|
||||||
public readonly SearchRequestInterface $search,
|
public readonly SearchRequestInterface $search,
|
||||||
public readonly EntityInterface $entity,
|
public readonly EntityInterface $entity,
|
||||||
@ -100,9 +102,9 @@ trait LeanApiTrait
|
|||||||
{
|
{
|
||||||
return $this->entity;
|
return $this->entity;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
] + $request->getAttribute("lean.searchRequest", [])
|
|
||||||
);
|
return $request;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Ignore]
|
#[Ignore]
|
||||||
@ -115,9 +117,11 @@ trait LeanApiTrait
|
|||||||
throw new \InvalidArgumentException(sprintf("L'entré pour l'entité demandé (%s) est introuvable avec le ou les arguments fournis '%s'", $entityType, json_encode($request->getAttributes())));
|
throw new \InvalidArgumentException(sprintf("L'entré pour l'entité demandé (%s) est introuvable avec le ou les arguments fournis '%s'", $entityType, json_encode($request->getAttributes())));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $request->withAttribute("lean.searchRequest",
|
if ($request->getAttribute("lean.searchRequest") === null) {
|
||||||
[
|
$request = $request->withAttribute("lean.searchRequest", $this->searchEntityResult());
|
||||||
$resultKey ?: $entityType => new class($search, $entity) implements ApiSearchRequestInterface {
|
}
|
||||||
|
|
||||||
|
$request->getAttribute("lean.searchRequest")[$resultKey ?: $entityType] = new class($search, $entity) implements ApiSearchRequestInterface {
|
||||||
public function __construct(
|
public function __construct(
|
||||||
public readonly SearchRequestInterface $search,
|
public readonly SearchRequestInterface $search,
|
||||||
public readonly EntityCollection $collection,
|
public readonly EntityCollection $collection,
|
||||||
@ -132,8 +136,31 @@ trait LeanApiTrait
|
|||||||
{
|
{
|
||||||
return $this->collection;
|
return $this->collection;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return $request;
|
||||||
}
|
}
|
||||||
] + $request->getAttribute("lean.searchRequest", [])
|
|
||||||
);
|
#[Ignore]
|
||||||
|
protected function searchEntityResult() :\ArrayObject {
|
||||||
|
return new class()extends \ArrayObject implements ApiSearchRequestInterface {
|
||||||
|
|
||||||
|
public function getSearch(): SearchRequestInterface
|
||||||
|
{
|
||||||
|
if ($this->count() !== 1) {
|
||||||
|
throw new \LogicException("Search results contains more than one results. Impossible to continue without precising which one you needs.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this[array_key_last($this->getArrayCopy())]->getSearch();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getResult() : EntityInterface|EntityCollection {
|
||||||
|
if ($this->count() !== 1) {
|
||||||
|
throw new \LogicException("Search results contains more than one results. Impossible to continue without precising which one you needs.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this[array_key_last($this->getArrayCopy())]->getResult();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -24,7 +24,7 @@ class ApiRenderer implements MiddlewareInterface {
|
|||||||
$response = $handler->handle($request);
|
$response = $handler->handle($request);
|
||||||
}
|
}
|
||||||
catch(\Throwable $ex) {
|
catch(\Throwable $ex) {
|
||||||
# $errorId = $this->saveError($request, $ex)->id;
|
|
||||||
|
|
||||||
if (static::awaitingJson($request)) {
|
if (static::awaitingJson($request)) {
|
||||||
return HttpFactory::createJsonResponse([
|
return HttpFactory::createJsonResponse([
|
||||||
|
|||||||
@ -10,31 +10,40 @@
|
|||||||
|
|
||||||
<div class="entities">
|
<div class="entities">
|
||||||
{% foreach $entities as $name => $entity %}
|
{% foreach $entities as $name => $entity %}
|
||||||
<div class="entity-wrapper" style="padding-left: 15px;border-left: 3px solid #eaa1af;">
|
<div id="{{ $entity['className'] }}" class="entity-wrapper" style="padding-left: 15px;border-left: 3px solid #eaa1af;">
|
||||||
<h4 class='entity-name' title="{{ $name }}">{{ $entity['className'] }}</h4>
|
<h4 class='entity-name' title="{{ $name }}">{{ $entity['className'] }}</h4>
|
||||||
<div class='description'>{{ $entity['description'] }}</div>
|
<div class='description'>{{ $entity['description'] }}</div>
|
||||||
|
|
||||||
<hr style="margin-top:15px">
|
<hr style="margin-top:15px">
|
||||||
|
|
||||||
|
<div class="fields-wrapper">
|
||||||
|
<div class="header-fields">Champs</div>
|
||||||
<ol class='fields'>
|
<ol class='fields'>
|
||||||
{% foreach $entity['fields'] as $field %}
|
{% foreach $entity['fields'] as $field %}
|
||||||
<li class="odd-even">
|
<li class="odd-even">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<div><strong style="font-family:monospace">${{ $field['name'] }}</strong> <span style='margin-left:15px'>{{ $field['description'] }}</span></div>
|
<div>
|
||||||
|
<strong style="font-family:monospace">${{ $field['name'] }} {% if ! $field['allowNulls'] %}<span style="color:red">*</span>{% endif %}</strong>
|
||||||
|
<span style='margin-left:15px'>{{ $field['description'] }}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field-desc" style="margin-top:10px;;background:#fff;padding:5px;font-size:0.9em">
|
<div class="field-desc" style="margin-top:10px;;background:#fff;padding:5px;font-size:0.9em">
|
||||||
<div style="padding:5px"><u>Champ SQL</u> : {{ $field['fieldName'] }}</div>
|
<div class="fieldname"><u>Champ SQL</u> : {{ $field['fieldName'] }}</div>
|
||||||
<div style="padding:5px"><u>Attribut</u> : {{ $field['tag'] }}</div>
|
<div class="tag"><u>Attribut</u> : {{ $field['tag'] }}</div>
|
||||||
<div style="padding:5px"><u>Type(s)</u> : {{ $field['type'] }}</div>
|
<div class="type"><u>Type(s)</u> : {{ $field['type'] }}</div>
|
||||||
<div style="padding:5px"><u>Nullable</u> {{ yesOrNo($field['allowNulls']) }}</div>
|
<div class="nullable"><u>Nullable</u> {{ yesOrNo($field['allowNulls']) }}</div>
|
||||||
<div style="padding:5px"><u>Taille</u> : {{ length($field['length']) }}</div>
|
{% if $field['default'] %}
|
||||||
<div style="padding:5px"><u>Lecture seule</u> : {{ yesOrNo($field['readonly']) }}</div>
|
<div class="default"><u>Valeur par défaut</u> : {{ $field['default'] }}</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="length"><u>Taille</u> : {{ length($field['length']) }}</div>
|
||||||
|
<div class="readonly"><u>Lecture seule</u> : {{ yesOrNo($field['readonly']) }}</div>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{% endforeach %}
|
{% endforeach %}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if $entity['searchRequestFields'] %}
|
{% if $entity['searchRequestFields'] %}
|
||||||
<div class="search-request-wrapper">
|
<div class="search-request-wrapper">
|
||||||
@ -44,26 +53,36 @@
|
|||||||
<div class='description' style="margin-bottom:10px">{{ $entity['searchRequestDescription'] }}</div>
|
<div class='description' style="margin-bottom:10px">{{ $entity['searchRequestDescription'] }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
|
||||||
|
<div class="fields-wrapper">
|
||||||
|
<div class="header-fields">Champs</div>
|
||||||
|
|
||||||
<ol class='requests'>
|
<ol class='requests'>
|
||||||
{% foreach $entity['searchRequestFields'] as $field %}
|
{% foreach $entity['searchRequestFields'] as $field %}
|
||||||
<li class="odd-even">
|
<li class="odd-even">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<div><strong style="font-family:monospace">{{ $field['name'] }}</strong> <span style='margin-left:15px'>{{ $field['description'] }}</span></div>
|
<div>
|
||||||
|
<strong style="font-family:monospace">{{ $field['name'] }}</strong>
|
||||||
|
<span style='margin-left:15px'>{{ $field['description'] }}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="field-desc" style="margin-top:10px;;background:#fff;padding:5px;font-size:0.9em">
|
<div class="field-desc" style="margin-top:10px;;background:#fff;padding:5px;font-size:0.9em">
|
||||||
<div><u>Paramètre de requête (GET)</u> : {{ $field['parameter'] }}</div>
|
<div class="parameter"><u>Paramètre de requête (GET)</u> : {{ $field['parameter'] }}</div>
|
||||||
<div><u>Attribut</u> : {{ $field['tag'] }}</div>
|
<div class="tag"><u>Attribut</u> : {{ $field['tag'] }}</div>
|
||||||
<div><u>Type(s)</u> : {{ $field['type'] }}</div>
|
<div class="type"><u>Type(s)</u> : {{ $field['type'] }}</div>
|
||||||
<div><u>Nullable</u> : {{ yesOrNo($field['allowNulls']) }}</div>
|
{% if $field['possibleValues'] ?? false %}
|
||||||
|
<div class="possible-values"><u>Valeurs possibles</u> : {{ $field['possibleValues'] }}</div>
|
||||||
|
{% endif %}
|
||||||
{% if $field['default'] !== "" %}
|
{% if $field['default'] !== "" %}
|
||||||
<div><u>Valeur par défault</u> : {{ $this->displayValue($field['default']) }}</div>
|
<div class="default"><u>Valeur par défault</u> : {{ $this->displayValue($field['default']) }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
{% endforeach %}
|
{% endforeach %}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% or %}
|
{% or %}
|
||||||
<i style="color:#585858; padding:0 12px">{% _ "none" %}</i>
|
<i style="color:#585858; padding:0 12px">{% _ "none" %}</i>
|
||||||
|
|||||||
@ -13,14 +13,16 @@
|
|||||||
<div class='description'>{{ $form['description'] }}</div>
|
<div class='description'>{{ $form['description'] }}</div>
|
||||||
<hr style="margin-top:15px">
|
<hr style="margin-top:15px">
|
||||||
|
|
||||||
<h5>Champs</h5>
|
|
||||||
|
<div class="fields-wrapper">
|
||||||
|
<div class="header-fields">Champs</div>
|
||||||
|
|
||||||
<ol class='fields'>
|
<ol class='fields'>
|
||||||
{% foreach $form['fields'] as $field %}
|
{% foreach $form['fields'] as $field %}
|
||||||
<li class="odd-even">
|
<li class="odd-even">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<div>
|
<div>
|
||||||
<strong style="font-family:monospace">{{ $field['name'] }}</strong>
|
<strong style="font-family:monospace">{{ $field['name'] }} {% if $field['mandatory'] %}<span style="color:red">*</span>{% endif %}</strong>
|
||||||
<span style='margin-left:15px'>{{ $field['description'] }}</span>
|
<span style='margin-left:15px'>{{ $field['description'] }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -41,7 +43,9 @@
|
|||||||
{% if $field['example'] !== null || $field['values'] %}
|
{% if $field['example'] !== null || $field['values'] %}
|
||||||
<div><u>Exemple</u> : {{ $field['example'] }}</div>
|
<div><u>Exemple</u> : {{ $field['example'] }}</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if $field['default'] !== null %}
|
||||||
|
<div><u>Default</u> : {{ $field['default'] }}</div>
|
||||||
|
{% endif %}
|
||||||
{% if $field['values'] %}
|
{% if $field['values'] %}
|
||||||
<div><u>Valeurs possibles</u> : [ <u>{{= implode('</u>, <u>', $field['values']) }}</u> ]</div>
|
<div><u>Valeurs possibles</u> : [ <u>{{= implode('</u>, <u>', $field['values']) }}</u> ]</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -50,6 +54,7 @@
|
|||||||
{% endforeach %}
|
{% endforeach %}
|
||||||
</ol>
|
</ol>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% or %}
|
{% or %}
|
||||||
<i style="color:#585858; padding:0 12px">{% _ "none" %}</i>
|
<i style="color:#585858; padding:0 12px">{% _ "none" %}</i>
|
||||||
{% endforeach %}
|
{% endforeach %}
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
<div class="url" style="flex-grow: 1;">
|
<div class="url" style="flex-grow: 1;">
|
||||||
{% ui:text "url" %}
|
{% ui:text "url" %}
|
||||||
{% ui:text "token", $this->session->jwt %}
|
{% ui:text "token", $this->session->jwt, [ 'placeholder' => "JWT Token" ] %}
|
||||||
<button class="request-btn">Envoyer</button>
|
<button class="request-btn">Envoyer</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -85,6 +85,7 @@
|
|||||||
method = requestHead.querySelector(".method"),
|
method = requestHead.querySelector(".method"),
|
||||||
input = requestHead.querySelector("[name='url']"),
|
input = requestHead.querySelector("[name='url']"),
|
||||||
token = requestHead.querySelector("[name='token']"),
|
token = requestHead.querySelector("[name='token']"),
|
||||||
|
tokenValue = sessionStorage.getItem("token"),
|
||||||
button = requestHead.querySelector(".request-btn");
|
button = requestHead.querySelector(".request-btn");
|
||||||
|
|
||||||
// Editor
|
// Editor
|
||||||
@ -98,6 +99,11 @@
|
|||||||
responseEditorElement = responseResponse.querySelector('#response');
|
responseEditorElement = responseResponse.querySelector('#response');
|
||||||
|
|
||||||
input.addEventListener('keydown', evt => evt.keyCode === 13 ? button.click() : null);
|
input.addEventListener('keydown', evt => evt.keyCode === 13 ? button.click() : null);
|
||||||
|
token.addEventListener('change', evt => sessionStorage.setItem("token", evt.target.value));
|
||||||
|
|
||||||
|
if (tokenValue) {
|
||||||
|
token.value = tokenValue;
|
||||||
|
}
|
||||||
|
|
||||||
document.addEventListener("DOMContentLoaded", (evt) => {
|
document.addEventListener("DOMContentLoaded", (evt) => {
|
||||||
document.querySelectorAll(".form-name").forEach(elem => {
|
document.querySelectorAll(".form-name").forEach(elem => {
|
||||||
@ -111,7 +117,9 @@
|
|||||||
let json = {};
|
let json = {};
|
||||||
|
|
||||||
formData.fields.forEach((field) => {
|
formData.fields.forEach((field) => {
|
||||||
json[field.name] = field.allowNulls ? null : "";
|
const value = field.default ? field.default : ( field.allowNulls ? null : "" );
|
||||||
|
|
||||||
|
json[field.name] = value === "[]" ? [] : value;
|
||||||
});
|
});
|
||||||
|
|
||||||
editor.setValue(JSON.stringify(json, null, 2), -1);
|
editor.setValue(JSON.stringify(json, null, 2), -1);
|
||||||
@ -148,6 +156,7 @@
|
|||||||
|
|
||||||
launchRequest(requestMethod, input.value, editor.getValue())
|
launchRequest(requestMethod, input.value, editor.getValue())
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
|
console.log(response);
|
||||||
responseHead.querySelector('.response-code').innerText = response.status;
|
responseHead.querySelector('.response-code').innerText = response.status;
|
||||||
responseHead.querySelector('.response-message').innerText = response.statusText;
|
responseHead.querySelector('.response-message').innerText = response.statusText;
|
||||||
|
|
||||||
@ -156,6 +165,7 @@
|
|||||||
return response.text();
|
return response.text();
|
||||||
})
|
})
|
||||||
.then(body => {
|
.then(body => {
|
||||||
|
console.log(aceMode);
|
||||||
if (aceMode === "json") {
|
if (aceMode === "json") {
|
||||||
body = JSON.stringify(JSON.parse(body), null, 2);
|
body = JSON.stringify(JSON.parse(body), null, 2);
|
||||||
responseEditorElement.innerHTML = body;
|
responseEditorElement.innerHTML = body;
|
||||||
|
|||||||
@ -20,9 +20,10 @@
|
|||||||
<span>{{ $route['name'] }}</span>
|
<span>{{ $route['name'] }}</span>
|
||||||
<br>
|
<br>
|
||||||
<span class="permissions">
|
<span class="permissions">
|
||||||
{% foreach ['admin', 'school' ] as $privilege %}
|
à venir
|
||||||
|
{# foreach ['admin', 'school' ] as $privilege %}
|
||||||
<u class="privilege">{{ $privilege }}</u>
|
<u class="privilege">{{ $privilege }}</u>
|
||||||
{% endforeach %}
|
{% endforeach #}
|
||||||
</span>
|
</span>
|
||||||
</small>
|
</small>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<style>
|
<style>
|
||||||
*, *:before, *:after {box-sizing: border-box;}
|
*, *:before, *:after {box-sizing: border-box;}
|
||||||
a{color:#e44a00}h3{background:#e1e1e1;padding:6px 12px}ul{background:#e9e9fd;padding-top:20px;padding-bottom:20px;border:1px solid #e3e3ec}ul li + li{margin-top:8px}li > em{font-size:0.75rem;color:gray}body{font-family:Helvetica, 'Helvetica Neuve', Arial, Tahoma, sans-serif;font-size:17px;color:#333}h1,h2,h3,h4,h5,h6{color:#222;margin:0 0 20px}dl,ol,p,pre,table,ul{margin:0 0 20px}h1,h2,h3{line-height:1.1}h1{font-size:20px;text-align:right;color:#387eea;font-weight:bold}h2{color:#393939}h3,h4,h5,h6{color:#494949}h3{display:flex}h3 > code{margin-right:5px;color:#b52dac}h3 > strong{margin-left:auto}a{color:#39c;font-weight:400;text-decoration:none}a small{font-size:11px;color:#777;margin-top:-0.6em;display:block}.wrapper{width:860px;margin:0 auto}blockquote{border-left:1px solid #e5e5e5;margin:0;padding:0 0 0 20px;font-style:italic}code,pre{font-size:12px}pre{padding:8px 15px;background:#f8f8f8;border-radius:5px;border:1px solid #e5e5e5;overflow-x:auto}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:5px 10px;border-bottom:1px solid #e5e5e5}dt{color:#444;font-weight:700}th{color:#444}img{max-width:100%}header{width:270px;float:left;position:fixed}header ul{list-style:none;height:40px;padding:0;background:#eee;background:-moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd));background:-webkit-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);background:-o-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);background:-ms-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);background:linear-gradient(top, #f8f8f8 0%,#dddddd 100%);border-radius:5px;border:1px solid #d2d2d2;box-shadow:inset #fff 0 1px 0, inset rgba(0,0,0,0.03) 0 -1px 0;width:270px}header li{width:89px;float:left;border-right:1px solid #d2d2d2;height:40px}header ul a{line-height:1;font-size:11px;color:#999;display:block;text-align:center;padding-top:6px;height:40px}strong{color:#222;font-weight:700}header ul li + li{width:88px;border-left:1px solid #fff}header ul li + li + li{border-right:none;width:89px}header ul a strong{font-size:14px;display:block;color:#222}section{width:500px;float:right;padding-bottom:50px}small{font-size:11px}hr{border:0;background:#e5e5e5;height:1px;margin:0 0 20px}footer{width:270px;float:left;position:fixed;bottom:50px}@media print, screen and (max-width: 960px){div.wrapper{width:auto;margin:0}footer,header,section{float:none;position:static;width:auto}header{padding-right:320px}section{border:1px solid #e5e5e5;border-width:1px 0;padding:20px 0;margin:0 0 20px}header a small{display:inline}header ul{position:absolute;right:50px;top:52px}}@media print, screen and (max-width: 720px){body{word-wrap:break-word}header{padding:0}header p.view,header ul{position:static}code,pre{word-wrap:normal}}@media print, screen and (max-width: 480px){body{padding:15px}header ul{display:none}}@media print{body{padding:0.4in;font-size:12pt;color:#444}}#wrapper{margin-left:auto;margin-right:auto;background-color:white}.ca-menu{list-style:none;padding:0;margin:20px auto}#navi{padding-top:15px;padding-right:15px;float:right;width:420px}#title{padding-left:15px;width:460px;float:left}div.clear{clear:both}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.2em}h5{font-size:1em;font-weight:bold}h6{font-size:1em;font-weight:bold}h1,h2,h3,h4,h5,h6{font-weight:normal;line-height:2.5rem;margin:1rem 0}.post p{max-width:580px}ol.list,ul.list{padding-left:3.333em;max-width:580px}.post h2{border-bottom:1px solid #EDEDED}h1:nth-child(1),h2:nth-child(1),h3:nth-child(1),h4:nth-child(1),h5:nth-child(1),h6:nth-child(1){margin-top:0}body{padding:1em}#wrapper{padding:1em}@media (min-width: 43.75em){body{padding:2em}#wrapper{padding:2em}}@media (min-width: 62em){body{padding:3em}#wrapper{max-width:740px;padding:3em}}
|
a{color:#e44a00}h3{background:#e1e1e1;padding:6px 12px}ul{background:#e9e9fd;padding-top:20px;padding-bottom:20px;border:1px solid #e3e3ec}ul li + li{margin-top:8px}li > em{font-size:0.75rem;color:gray}body{font-family:Helvetica, 'Helvetica Neuve', Arial, Tahoma, sans-serif;font-size:17px;color:#333}h1,h2,h3,h4,h5,h6{color:#222;margin:0 0 20px}dl,ol,p,pre,table,ul{margin:0 0 20px}h1,h2,h3{line-height:1.1}h1{font-size:20px;text-align:right;color:#387eea;font-weight:bold}h2{color:#393939}h3,h4,h5,h6{color:#494949}h3{display:flex}h3 > code{margin-right:5px;color:#b52dac}h3 > strong{margin-left:auto}a{color:#39c;font-weight:400;text-decoration:none}a small{font-size:11px;color:#777;margin-top:-0.6em;display:block}.wrapper{width:860px;margin:0 auto}blockquote{border-left:1px solid #e5e5e5;margin:0;padding:0 0 0 20px;font-style:italic}code,pre{font-size:12px}pre{padding:8px 15px;background:#f8f8f8;border-radius:5px;border:1px solid #e5e5e5;overflow-x:auto}table{width:100%;border-collapse:collapse}td,th{text-align:left;padding:5px 10px;border-bottom:1px solid #e5e5e5}dt{color:#444;font-weight:700}th{color:#444}img{max-width:100%}header{width:270px;float:left;position:fixed}header ul{list-style:none;height:40px;padding:0;background:#eee;background:-moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd));background:-webkit-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);background:-o-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);background:-ms-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);background:linear-gradient(top, #f8f8f8 0%,#dddddd 100%);border-radius:5px;border:1px solid #d2d2d2;box-shadow:inset #fff 0 1px 0, inset rgba(0,0,0,0.03) 0 -1px 0;width:270px}header li{width:89px;float:left;border-right:1px solid #d2d2d2;height:40px}header ul a{line-height:1;font-size:11px;color:#999;display:block;text-align:center;padding-top:6px;height:40px}strong{color:#222;font-weight:700}header ul li + li{width:88px;border-left:1px solid #fff}header ul li + li + li{border-right:none;width:89px}header ul a strong{font-size:14px;display:block;color:#222}section{width:500px;float:right;padding-bottom:50px}small{font-size:11px}hr{border:0;background:#e5e5e5;height:1px;margin:0 0 20px}footer{width:270px;float:left;position:fixed;bottom:50px}@media print, screen and (max-width: 960px){div.wrapper{width:auto;margin:0}footer,header,section{float:none;position:static;width:auto}header{padding-right:320px}section{border:1px solid #e5e5e5;border-width:1px 0;padding:20px 0;margin:0 0 20px}header a small{display:inline}header ul{position:absolute;right:50px;top:52px}}@media print, screen and (max-width: 720px){body{word-wrap:break-word}header{padding:0}header p.view,header ul{position:static}code,pre{word-wrap:normal}}@media print, screen and (max-width: 480px){body{padding:15px}header ul{display:none}}@media print{body{padding:0.4in;font-size:12pt;color:#444}}#wrapper{margin-left:auto;margin-right:auto;background-color:white}.ca-menu{list-style:none;padding:0;margin:20px auto}#navi{padding-top:15px;padding-right:15px;float:right;width:420px}#title{padding-left:15px;width:460px;float:left}div.clear{clear:both}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.2em}h5{font-size:1em;font-weight:bold}h6{font-size:1em;font-weight:bold}h1,h2,h3,h4,h5,h6{font-weight:normal;line-height:2.5rem;margin:1rem 0}.post p{max-width:580px}ol.list,ul.list{padding-left:3.333em;max-width:580px}.post h2{border-bottom:1px solid #EDEDED}h1:nth-child(1),h2:nth-child(1),h3:nth-child(1),h4:nth-child(1),h5:nth-child(1),h6:nth-child(1){margin-top:0}body{padding:1em}#wrapper{padding:1em}@media (min-width: 43.75em){body{padding:2em}#wrapper{padding:2em}}@media (min-width: 62em){body{padding:3em}#wrapper{max-width:740px;padding:3em}}
|
||||||
ol{background: #eff4f2;padding-top:20px;padding-bottom:20px;border:1px solid #e3e3ec}
|
ol{background: #eff4f2;/*padding-top:20px;padding-bottom:20px;*/border:1px solid #e3e3ec}
|
||||||
h4{background:#e0f7ed;padding:6px 12px; font-weight: bold!important;font-size:100%;margin-top:0}
|
h4{background:#e0f7ed;padding:6px 12px; font-weight: bold!important;font-size:100%;margin-top:0}
|
||||||
h5{text-decoration: underline}
|
h5{text-decoration: underline}
|
||||||
h3 {display: flex;align-items: center;padding: 0 15px 0 15px;font-variant: small-caps;border-bottom: 5px solid #ccc;line-height: 60px;}
|
h3 {display: flex;align-items: center;padding: 0 15px 0 15px;font-variant: small-caps;border-bottom: 5px solid #ccc;line-height: 60px;}
|
||||||
@ -33,11 +33,16 @@
|
|||||||
ul ul > li:before {content:"↳"}
|
ul ul > li:before {content:"↳"}
|
||||||
ol .title { display: flex;justify-content: space-between;background: #ffffffb2;padding: 9px 5px;border: 1px solid #fff;}
|
ol .title { display: flex;justify-content: space-between;background: #ffffffb2;padding: 9px 5px;border: 1px solid #fff;}
|
||||||
.field-desc > div {padding:5px;}
|
.field-desc > div {padding:5px;}
|
||||||
|
.header-fields {color: #fff;line-height: 1.8rem;font-variant: small-caps;padding: 4px 0.8rem 0 0.8rem}
|
||||||
|
/*.fields-wrapper {border-left: 3px solid #c14141; margin-left: -10px; padding-left: 10px;}*/
|
||||||
|
|
||||||
.forms ol {background: #ccdef2;}
|
.forms ol {background: #ccdef2;}
|
||||||
.forms li {border-color: #859aae;}
|
.forms li {border-color: #859aae;}
|
||||||
.forms .form-name {background: #9cc5e6;display:flex;justify-content: space-between}
|
.forms .form-name {background: #9cc5e6;display:flex;justify-content: space-between}
|
||||||
.forms .form-name span {color: #284168;font-size:110%}
|
.forms .form-name span {color: #284168;font-size:110%}
|
||||||
.forms .form-name .btn {background:rgba(50,50,50,0.5);padding:0 15px;border: 1px solid rgba(50,50,50,0.8);font-family: 'Déja Vu', 'Courier New', Courier, monospace, serif;font-size: 90%;color: #fff;text-decoration: underline;}
|
.forms .form-name .btn {background:rgba(50,50,50,0.5);padding:0 15px;border: 1px solid rgba(50,50,50,0.8);font-family: 'Déja Vu', 'Courier New', Courier, monospace, serif;font-size: 90%;color: #fff;text-decoration: underline;}
|
||||||
|
.forms .header-fields {background: #677b8c;}
|
||||||
|
.forms .fields-wrapper{border-color:#677b8c}
|
||||||
|
|
||||||
.routes-wrapper {padding:5px}
|
.routes-wrapper {padding:5px}
|
||||||
.routes-wrapper li {display:flex;border: 1px solid #ccc;align-items: stretch;cursor:pointer}
|
.routes-wrapper li {display:flex;border: 1px solid #ccc;align-items: stretch;cursor:pointer}
|
||||||
@ -74,13 +79,19 @@
|
|||||||
|
|
||||||
.entities {background: #f0e0e0;padding:5px;}
|
.entities {background: #f0e0e0;padding:5px;}
|
||||||
.entity-wrapper .entity-name {background:#eaa1af;color: #682828;font-size:110%}
|
.entity-wrapper .entity-name {background:#eaa1af;color: #682828;font-size:110%}
|
||||||
|
.entity-wrapper .fields-wrapper {border-color: #c14141}
|
||||||
|
.entity-wrapper .header-fields {background:#c14141}
|
||||||
.entity-wrapper ol {background: #e3d0d0;}
|
.entity-wrapper ol {background: #e3d0d0;}
|
||||||
.entity-wrapper li {border-color: #ae8585;}
|
.entity-wrapper li {border-color: #ae8585;}
|
||||||
|
.entity-wrapper li .default {color:#bf7d4d;}
|
||||||
|
|
||||||
.search-request-name {background: #b6e6ae;color: #395332;font-size:110%}
|
.search-request-name {background: #b6e6ae;color: #395332;font-size:110%}
|
||||||
.search-request-wrapper {padding: 15px;margin-top:5px;border-left: 3px solid #72886a;background: #eeffe6;}
|
.search-request-wrapper {padding: 15px;margin-top:5px;border-left: 3px solid #72886a;background: #eeffe6;}
|
||||||
|
.search-request-wrapper .header-fields {background:#395332}
|
||||||
|
.search-request-wrapper .fields-wrapper{border-color:#395332}
|
||||||
.search-request-wrapper ol {background: #d8f0cd;}
|
.search-request-wrapper ol {background: #d8f0cd;}
|
||||||
.search-request-wrapper li {border-color: #72886a;}
|
.search-request-wrapper li {border-color: #72886a;}
|
||||||
|
.search-request-wrapper .default {color:#72886a;}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
{% endsection %}
|
{% endsection %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user