diff --git a/.eslintrc.json b/.eslintrc.json index 02e51f7..e539716 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,26 +6,22 @@ }, "extends": [ "eslint:recommended", - "plugin:vue/essential", - "plugin:vue/base", - "plugin:vue/strongly-recommended", - "plugin:vue/recommended" + "plugin:vue/essential" ], "globals": { "Atomics": "readonly", "SharedArrayBuffer": "readonly" }, "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module" + "ecmaVersion": 2018 }, "plugins": [ "vue" ], "rules": { "indent": [ - "off", - 2 + "error", + 4 ], "linebreak-style": [ "error", @@ -36,10 +32,8 @@ "single" ], "semi": [ - "off", - "always" - ], - "no-console": "off", - "strict": "off" + "error", + "never" + ] } } diff --git a/app/Http/Controllers/ToDoController.php b/app/Http/Controllers/ToDoController.php index 9b3f6a6..719236d 100644 --- a/app/Http/Controllers/ToDoController.php +++ b/app/Http/Controllers/ToDoController.php @@ -14,6 +14,10 @@ class ToDoController extends Controller { $this->authorize('create', ToDoList::class); + $lastToDo = $toDoList->toDos()->orderBy('order', 'desc')->first(); + + request()['order'] = ($lastToDo) ? $lastToDo->order + 1 : 1; + $toDo = $toDoList->toDos()->create($this->validateData()); return (new ToDoResource($toDo)) @@ -32,10 +36,34 @@ class ToDoController extends Controller ->setStatusCode(200); } + public function destroy(ToDoList $toDoList, ToDo $toDo) + { + $this->authorize('delete', $toDoList); + + $toDo->delete(); + + return response([], 204); + } + + public function changeOrder(ToDoList $toDoList, ToDo $toDo) + { + $this->authorize('update', $toDoList); + + $toDoChanged = $toDoList->toDos()->where('order', (int) request()['new-order'])->first(); + + $toDoChanged->update(['order' => (int) $toDo->order]); + $toDo->update(['order' => (int) request()['new-order']]); + + return (new ToDoResource($toDo)) + ->response() + ->setStatusCode(200); + } + private function validateData() { return request()->validate([ 'name' => 'required', + 'order' => 'integer|min:1|max:1000000', ]); } } diff --git a/app/Http/Controllers/ToDoListController.php b/app/Http/Controllers/ToDoListController.php index 98fa2a3..e3ad9e2 100644 --- a/app/Http/Controllers/ToDoListController.php +++ b/app/Http/Controllers/ToDoListController.php @@ -8,6 +8,13 @@ use Illuminate\Http\Request; class ToDoListController extends Controller { + public function index() + { + $this->authorize('viewAny', ToDoList::class); + + return ToDoListResource::collection(request()->user()->toDoLists); + } + public function store() { $this->authorize('create', ToDoList::class); diff --git a/app/Http/Resources/ToDo.php b/app/Http/Resources/ToDo.php index 6341a48..0fbf4c0 100644 --- a/app/Http/Resources/ToDo.php +++ b/app/Http/Resources/ToDo.php @@ -21,7 +21,7 @@ class ToDo extends JsonResource 'attributes' => [ 'data' => [ 'name' => $this->name, - 'order' => $this->order, + 'order' => (int) $this->order, 'checked_at' => optional($this->checked_at)->diffForHumans(), 'last_updated' => $this->updated_at->diffForHumans(), ] diff --git a/app/Http/Resources/ToDoList.php b/app/Http/Resources/ToDoList.php index 534445f..7de7c44 100644 --- a/app/Http/Resources/ToDoList.php +++ b/app/Http/Resources/ToDoList.php @@ -23,7 +23,7 @@ class ToDoList extends JsonResource 'data' => [ 'name' => $this->name, 'to_dos' => new ToDoCollection($this->toDos), - 'posted_by' => new UserResource($this->user), + 'posted_by' => new UserResource($this->author), 'last_updated' => $this->updated_at->diffForHumans(), // 'cover_image' => new ImageResource($this->coverImage), ] diff --git a/app/Models/ToDoList.php b/app/Models/ToDoList.php index c258cbc..e2cbb44 100644 --- a/app/Models/ToDoList.php +++ b/app/Models/ToDoList.php @@ -16,7 +16,7 @@ class ToDoList extends Model return '/to-do-lists/' . $this->id; } - public function users(): BelongsTo + public function author(): BelongsTo { return $this->belongsTo(User::class); } diff --git a/app/Models/User.php b/app/Models/User.php index 3d8cfcd..7d0fe28 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -59,6 +59,11 @@ class User extends Authenticatable return $this->hasMany(Memo::class); } + public function toDoLists() : HasMany + { + return $this->hasMany(ToDoList::class); + } + public function images(): MorphMany { return $this->morphMany(Image::class, 'imageable'); @@ -83,9 +88,4 @@ class User extends Authenticatable $userImage->path = 'images/default-cover.jpg'; }); } - - public function toDoLists(): HasMany - { - return $this->hasMany(ToDoList::class); - } } diff --git a/database/factories/ToDoItemFactory.php b/database/factories/ToDoItemFactory.php new file mode 100644 index 0000000..6a3e32a --- /dev/null +++ b/database/factories/ToDoItemFactory.php @@ -0,0 +1,16 @@ +define(ToDo::class, function (Faker $faker) { + $toDoList = factory(\App\Models\ToDoList::class); + return [ + 'to_do_list_id' => $toDoList, + 'name' => $faker->words(3, [false]), + // 'order' => $toDoList->toDos->orderBy('id', 'desc')->first()->order + 1, +// 'checket_at' => now(), + ]; +}); diff --git a/database/migrations/2020_04_19_144900_create_to_do_lists_table.php b/database/migrations/2020_04_19_144900_create_to_do_lists_table.php index dc8bd15..a76f084 100644 --- a/database/migrations/2020_04_19_144900_create_to_do_lists_table.php +++ b/database/migrations/2020_04_19_144900_create_to_do_lists_table.php @@ -17,6 +17,7 @@ class CreateToDoListsTable extends Migration $table->id(); $table->unsignedBigInteger('user_id'); $table->string('name'); + $table->integer('order')->default(1); $table->timestamps(); }); } diff --git a/database/migrations/2020_04_19_190733_create_to_dos_table.php b/database/migrations/2020_04_19_190733_create_to_dos_table.php index 75061c7..caf9e56 100644 --- a/database/migrations/2020_04_19_190733_create_to_dos_table.php +++ b/database/migrations/2020_04_19_190733_create_to_dos_table.php @@ -17,7 +17,7 @@ class CreateToDosTable extends Migration $table->id(); $table->unsignedBigInteger('to_do_list_id'); $table->string('name'); - $table->integer('order')->default(0); + $table->integer('order')->default(1); $table->timestamp('checked_at')->nullable(); $table->timestamps(); }); diff --git a/package.json b/package.json index 879612a..3ea767e 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,20 @@ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", "prod": "npm run production", "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", - "eslint": "./node_modules/.bin/eslint resources/assets/js/ test/ --ext .js,.vue" + "eslint": "./node_modules/.bin/eslint resources/js/ --ext .js,.vue", + "lint": "eslint --ext .js,.vue resources/js/" }, "devDependencies": { "axios": "^0.19", "babel-eslint": "^10.1.0", "cross-env": "^7.0", "eslint": "^6.8.0", + "eslint-config-standard": "^14.1.1", "eslint-loader": "^3.0.3", + "eslint-plugin-import": "^2.20.2", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1", + "eslint-plugin-standard": "^4.0.1", "eslint-plugin-vue": "^6.2.2", "laravel-mix": "^5.0.1", "laravel-mix-eslint": "^0.1.3", diff --git a/resources/js/app.js b/resources/js/app.js index d5a8523..4abac1b 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -2,12 +2,13 @@ import Vue from 'vue' import router from './router' import App from './components/App' import store from './store' -import SvgVue from 'svg-vue'; +import SvgVue from 'svg-vue' -Vue.use(SvgVue); +Vue.use(SvgVue) -require('./bootstrap'); +require('./bootstrap') +// eslint-disable-next-line no-unused-vars const app = new Vue({ el: '#app', @@ -15,4 +16,4 @@ const app = new Vue({ App }, router, store, -}); +}) diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index f5817b0..8603aa6 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -1,7 +1,5 @@ -window._ = require('lodash'); - -window.axios = require('axios'); - -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; +window._ = require('lodash') +window.axios = require('axios') +window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest' diff --git a/resources/js/components/AlertBox.vue b/resources/js/components/AlertBox.vue index c7b51a8..430cea1 100644 --- a/resources/js/components/AlertBox.vue +++ b/resources/js/components/AlertBox.vue @@ -8,19 +8,19 @@ diff --git a/resources/js/components/App.vue b/resources/js/components/App.vue index 8a80cbe..05e6296 100644 --- a/resources/js/components/App.vue +++ b/resources/js/components/App.vue @@ -11,30 +11,31 @@ diff --git a/resources/js/components/Avatar.vue b/resources/js/components/Avatar.vue index 1683f02..1511269 100644 --- a/resources/js/components/Avatar.vue +++ b/resources/js/components/Avatar.vue @@ -7,8 +7,8 @@ diff --git a/resources/js/components/InputField.vue b/resources/js/components/InputField.vue index 8cc8758..bc562dd 100644 --- a/resources/js/components/InputField.vue +++ b/resources/js/components/InputField.vue @@ -1,68 +1,69 @@ diff --git a/resources/js/components/Loader.vue b/resources/js/components/Loader.vue index fdb4c2d..c129197 100644 --- a/resources/js/components/Loader.vue +++ b/resources/js/components/Loader.vue @@ -5,15 +5,15 @@ diff --git a/resources/js/components/Nav.vue b/resources/js/components/Nav.vue index 2f3afe9..edc369a 100644 --- a/resources/js/components/Nav.vue +++ b/resources/js/components/Nav.vue @@ -7,11 +7,15 @@
- Memos + Memos + + + + ToDo Lists - Jeux + Jeux