Unverified Commit fe133a4b authored by Christian Giupponi's avatar Christian Giupponi Committed by GitHub

Merge pull request #2 from AsgardCms/master

Merge from AsgardCMS 
parents f61d8660 f6df9b81
......@@ -98,4 +98,20 @@ interface BaseRepository
* @return bool
*/
public function clearCache();
/**
* Add where statement to current builder
*
* @param string $field
* @param string|int $value
* @param string $operator
*/
public function where(string $field, $value, string $operator = null);
/**
* Eager relationship(s) loading
*
* @param array|string $relationships
*/
public function with($relationships);
}
......@@ -220,4 +220,24 @@ abstract class BaseCacheDecorator implements BaseRepository
$this->entityName
);
}
/**
* @inheritdoc
*/
public function where(string $field, $value, string $operator = null)
{
return $this->remember(function () use ($field, $value, $operator) {
return $this->repository->where($field, $value, $operator);
});
}
/**
* @inheritdoc
*/
public function with($relationships)
{
return $this->remember(function () use ($relationships) {
return $this->repository->with($relationships);
});
}
}
......@@ -191,4 +191,26 @@ abstract class EloquentBaseRepository implements BaseRepository
{
return true;
}
/**
* @inheritdoc
*/
public function where(string $field, $value, string $operator = null)
{
if ($operator === null) {
$operator = '=';
} else {
list($value, $operator) = [$operator, $value];
}
return $this->model->where($field, $operator, $value);
}
/**
* @inheritdoc
*/
public function with($relationships)
{
return $this->model->with($relationships);
}
}
......@@ -6,21 +6,16 @@ trait NamespacedEntity
{
/**
* Returns the entity namespace.
*
* @return string
*/
public static function getEntityNamespace()
public static function getEntityNamespace(): string
{
return isset(static::$entityNamespace) ? static::$entityNamespace : get_called_class();
}
/**
* Sets the entity namespace.
*
* @param string $namespace
* @return void
*/
public static function setEntityNamespace($namespace)
public static function setEntityNamespace(string $namespace)
{
static::$entityNamespace = $namespace;
}
......
<template>
<div class="row">
<div class="col-xs-12">
<el-upload
class="media-upload"
drag
:action="uploadUrl"
:on-preview="handlePreview"
:on-remove="handleRemove"
:on-success="handleSuccess"
:file-list="fileList"
:headers="requestHeaders"
multiple>
list-type="picture"
:show-file-list="false"
:http-request="uploadFile"
multiple
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">Drop file here or <em>click to upload</em></div>
</el-upload>
</div>
</div>
</template>
<script>
import axios from 'axios';
export default {
props: {
parentId: { type: Number },
},
data() {
return {
fileList: [],
fileIsUploading: false,
};
},
computed: {
uploadUrl() {
return route('api.media.store').domain + route('api.media.store').url;
},
requestHeaders() {
const userApiToken = document.head.querySelector('meta[name="user-api-token"]');
return {
Authorization: `Bearer ${userApiToken.content}`,
};
},
},
methods: {
handleSuccess(response) {
uploadFile(event) {
this.fileIsUploading = true;
const data = new FormData();
data.append('parent_id', this.parentId);
data.append('file', event.file);
axios.post(route('api.media.store'), data).then((response) => {
this.$events.emit('fileWasUploaded', response);
this.fileList = [];
this.$message({
type: 'success',
message: this.trans('media.file uploaded'),
});
this.fileIsUploading = false;
}, (error) => {
console.log(error.response.data);
this.fileIsUploading = false;
this.$notify.error({
title: 'Error',
message: error.response.data.errors.file[0],
});
});
},
handlePreview() {},
handleRemove() {},
},
mounted() {},
};
</script>
<style>
.media-upload {
margin-bottom: 10px;
}
.el-upload__input {
display: none !important;
}
.el-upload--text {
display: block;
.el-upload--picture, .el-upload--picture-card {
width: 100%;
height: 175px;
line-height: 100px;
border: none;
}
.el-upload-dragger {
width: 100%;
height: 100%;
}
.media-upload {
margin-bottom: 10px;
.el-upload-dragger .el-upload__text {
position: absolute;
bottom: 0;
width: 100%;
}
.el-upload--text {
display: block;
}
</style>
......@@ -3,102 +3,88 @@
namespace Modules\Tag\Contracts;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
interface TaggableInterface
{
/**
* The Eloquent tag entity name.
* @var string
*/
public static function getEntityNamespace();
public static function getEntityNamespace(): string;
/**
* Returns the Eloquent tags entity name.
* @return string
*/
public static function getTagsModel();
public static function getTagsModel(): string;
/**
* Sets the Eloquent tags entity name.
* @param string $model
* @return void
*/
public static function setTagsModel($model);
public static function setTagsModel(string $model);
/**
* Get all the entities with the given tag(s)
* Optionally specify the column on which
* to perform the search operation.
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @param string|array $tags
* @param string $type
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeWhereTag(Builder $query, $tags, $type = 'slug');
public function scopeWhereTag(Builder $query, $tags, string $type = 'slug'): Builder;
/**
* Get all the entities with one of the given tag(s)
* Optionally specify the column on which
* to perform the search operation.
* @param \Illuminate\Database\Eloquent\Builder $query
*
* @param string|array $tags
* @param string $type
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeWithTag(Builder $query, $tags, $type = 'slug');
public function scopeWithTag(Builder $query, $tags, string $type = 'slug'): Builder;
/**
* Define the eloquent morphMany relationship
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany
*/
public function tags();
public function tags(): MorphToMany;
/**
* Returns all the tags under the current entity namespace.
* @return \Illuminate\Database\Eloquent\Builder
*/
public static function allTags();
public static function allTags(): Builder;
/**
* Creates a new model instance.
* @return \Illuminate\Database\Eloquent\Model
*/
public static function createTagsModel();
public static function createTagsModel(): Model;
/**
* Syncs the given tags.
*
* @param string|array $tags
* @param string $type
* @return bool
*/
public function setTags($tags, $type = 'name');
public function setTags($tags, string $type = 'name'): bool;
/**
* Detaches multiple tags from the entity or if no tags are
* passed, removes all the attached tags from the entity.
*
* @param string|array|null $tags
* @return bool
*/
public function untag($tags = null);
public function untag($tags = null): bool;
/**
* Detaches the given tag from the entity.
* @param string $name
* @return void
*/
public function removeTag($name);
public function removeTag(string $name);
/**
* Attaches multiple tags to the entity.
*
* @param string|array $tags
* @return bool
*/
public function tag($tags);
public function tag($tags): bool;
/**
* Attaches the given tag to the entity.
* @param string $name
* @return void
*/
public function addTag($name);
public function addTag(string $name);
}
......@@ -3,42 +3,29 @@
namespace Modules\Tag\Traits;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
use Modules\Tag\Entities\Tag;
trait TaggableTrait
{
/**
* {@inheritdoc}
*/
protected static $tagsModel = Tag::class;
/**
* {@inheritdoc}
*/
public static function getTagsModel()
public static function getTagsModel(): string
{
return static::$tagsModel;
}
/**
* {@inheritdoc}
*/
public static function setTagsModel($model)
public static function setTagsModel(string $model)
{
static::$tagsModel = $model;
}
/**
* {@inheritdoc}
*/
public function scopeWhereTag(Builder $query, $tags, $type = 'slug')
public function scopeWhereTag(Builder $query, $tags, string $type = 'slug'): Builder
{
if (is_string($tags) === true) {
$tags = [$tags];
}
$query->with('translations');
foreach ($tags as $tag) {
foreach (array_wrap($tags) as $tag) {
$query->whereHas('tags', function (Builder $query) use ($type, $tag) {
$query->whereHas('translations', function (Builder $query) use ($type, $tag) {
$query->where($type, $tag);
......@@ -49,14 +36,10 @@ trait TaggableTrait
return $query;
}
/**
* {@inheritdoc}
*/
public function scopeWithTag(Builder $query, $tags, $type = 'slug')
public function scopeWithTag(Builder $query, $tags, string $type = 'slug'): Builder
{
if (is_string($tags) === true) {
$tags = [$tags];
}
$tags = array_wrap($tags);
$query->with('translations');
return $query->whereHas('tags', function (Builder $query) use ($type, $tags) {
......@@ -66,43 +49,31 @@ trait TaggableTrait
});
}
/**
* {@inheritdoc}
*/
public function tags()
public function tags(): MorphToMany
{
return $this->morphToMany(static::$tagsModel, 'taggable', 'tag__tagged', 'taggable_id', 'tag_id');
}
/**
* {@inheritdoc}
*/
public static function createTagsModel()
public static function createTagsModel(): Model
{
return new static::$tagsModel;
}
/**
* {@inheritdoc}
*/
public static function allTags()
public static function allTags(): Builder
{
$instance = new static;
return $instance->createTagsModel()->with('translations')->whereNamespace($instance->getEntityClassName());
return self::createTagsModel()->with('translations')->where('namespace', $instance->getEntityClassName());
}
/**
* {@inheritdoc}
*/
public function setTags($tags, $type = 'slug')
public function setTags($tags, string $type = 'slug'): bool
{
if (empty($tags)) {
$tags = [];
}
// Get the current entity tags
$entityTags = $this->tags->pluck($type)->all();
$entityTags = $this->tags()->get()->pluck($type)->all();
// Prepare the tags to be added and removed
$tagsToAdd = array_diff($tags, $entityTags);
......@@ -121,25 +92,18 @@ trait TaggableTrait
return true;
}
/**
* {@inheritdoc}
*/
public function tag($tags)
public function tag($tags): bool
{
foreach ($tags as $tag) {
foreach (array_wrap($tags) as $tag) {
$this->addTag($tag);
}
return true;
}
/**
* {@inheritdoc}
*/
public function addTag($name)
public function addTag(string $name)
{
$tag = $this->createTagsModel()->where('namespace', $this->getEntityClassName())
->with('translations')
$tag = self::allTags()
->whereHas('translations', function (Builder $q) use ($name) {
$q->where('slug', $this->generateTagSlug($name));
})->first();
......@@ -157,17 +121,14 @@ trait TaggableTrait
$tag->save();
}
if ($this->tags->contains($tag->id) === false) {
if ($this->tags()->get()->contains($tag->id) === false) {
$this->tags()->attach($tag);
}
}
/**
* {@inheritdoc}
*/
public function untag($tags = null)
public function untag($tags = null): bool
{
$tags = $tags ?: $this->tags->pluck('name')->all();
$tags = $tags ?: $this->tags()->get()->pluck('name')->all();
foreach ($tags as $tag) {
$this->removeTag($tag);
......@@ -176,14 +137,9 @@ trait TaggableTrait
return true;
}
/**
* {@inheritdoc}
*/
public function removeTag($name)
public function removeTag(string $name)
{
$tag = $this->createTagsModel()
->where('namespace', $this->getEntityClassName())
->with('translations')
$tag = self::allTags()
->whereHas('translations', function (Builder $q) use ($name) {
$q->where('slug', $this->generateTagSlug($name));
})->first();
......@@ -193,10 +149,7 @@ trait TaggableTrait
}
}
/**
* {@inheritdoc}
*/
protected function getEntityClassName()
protected function getEntityClassName(): string
{
if (isset(static::$entityNamespace)) {
return static::$entityNamespace;
......@@ -205,24 +158,21 @@ trait TaggableTrait
return $this->tags()->getMorphClass();
}
/**
* {@inheritdoc}
*/
public function generateTagSlug($name, $separator = '-')
public function generateTagSlug($name, $separator = '-'): string
{
// Convert all dashes/underscores into separator
$flip = $separator == '-' ? '_' : '-';
$name = preg_replace('!['.preg_quote($flip).']+!u', $separator, $name);
$name = preg_replace('![' . preg_quote($flip, '!') . ']+!u', $separator, $name);
// Replace @ with the word 'at'
$name = str_replace('@', $separator.'at'.$separator, $name);
$name = str_replace('@', $separator . 'at' . $separator, $name);
// Remove all characters that are not the separator, letters, numbers, or whitespace.
$name = preg_replace('![^'.preg_quote($separator).'\pL\pN\s]+!u', '', mb_strtolower($name));
$name = preg_replace('![^' . preg_quote($separator, '!') . '\pL\pN\s]+!u', '', mb_strtolower($name));
// Replace all separator characters and whitespace by a single separator
$name = preg_replace('!['.preg_quote($separator).'\s]+!u', $separator, $name);
$name = preg_replace('![' . preg_quote($separator, '!') . '\s]+!u', $separator, $name);
return trim($name, $separator);
}
......
......@@ -38,6 +38,7 @@ return [
'create resource' => 'Create media',
'edit resource' => 'Edit media',
'destroy resource' => 'Delete media',
'file uploaded' => 'File uploaded successfully',
'file too large' => 'File is too large. Must be below :size MB.',
'some files not moved' => 'Some files were not moved',
'files moved successfully' => 'Files moved successfully',
......
......@@ -2,6 +2,7 @@
namespace Modules\$MODULE$\Providers;
use Illuminate\Database\Eloquent\Factory as EloquentFactory;
use Illuminate\Support\ServiceProvider;
use Modules\Core\Traits\CanPublishConfiguration;
use Modules\Core\Events\BuildingSidebar;
......@@ -31,6 +32,8 @@ class $MODULE$ServiceProvider extends ServiceProvider
$this->app['events']->listen(LoadingBackendTranslations::class, function (LoadingBackendTranslations $event) {
// append translations
});
$this->registerEloquentFactoriesFrom(__DIR__ . '/../Database/factories');
}
public function boot()
......@@ -54,4 +57,15 @@ class $MODULE$ServiceProvider extends ServiceProvider
{
// add bindings
}
/**
* Register factories.
*
* @param string $path
* @return void
*/
protected function registerEloquentFactoriesFrom($path)
{
$this->app->make(EloquentFactory::class)->load($path);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment