From da077dc8bf8fb398d81c2ca889ba1a025bb1a6a8 Mon Sep 17 00:00:00 2001 From: Wisp X Date: Fri, 31 Dec 2021 14:08:22 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E6=94=B9=E8=BF=9B=E5=8F=B3?= =?UTF-8?q?=E9=94=AE=E6=93=8D=E4=BD=9C=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/User/ImageController.php | 20 +++++++++- public/js/context-js/context-js.js | 7 ++-- resources/js/context-js.js | 7 ++-- resources/views/images.blade.php | 40 +++++++++++-------- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/app/Http/Controllers/User/ImageController.php b/app/Http/Controllers/User/ImageController.php index 6a80c914..b6d600cd 100644 --- a/app/Http/Controllers/User/ImageController.php +++ b/app/Http/Controllers/User/ImageController.php @@ -3,12 +3,14 @@ namespace App\Http\Controllers\User; use App\Http\Controllers\Controller; +use App\Models\Album; use App\Models\Image; use App\Models\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\DB; use Illuminate\View\View; class ImageController extends Controller @@ -58,7 +60,23 @@ class ImageController extends Controller { /** @var User $user */ $user = Auth::user(); - $user->images()->whereIn('id', $request->input('selected'))->update(['album_id' => $request->input('album_id')]); + DB::transaction(function () use ($user, $request) { + /** @var null|Album $album */ + $album = $user->albums()->find($request->input('id')); + $user->images()->whereIn('id', $request->input('selected'))->update([ + 'album_id' => $album->id ?? null, + ]); + if ($album) { + $album->image_num = $album->images()->count(); + $album->save(); + } + if ($request->has('album_id')) { + /** @var Album $originAlbum */ + $originAlbum = $user->albums()->find($request->input('album_id')); + $originAlbum->image_num = $originAlbum->images()->count(); + $originAlbum->save(); + } + }); return $this->success('移动成功'); } } diff --git a/public/js/context-js/context-js.js b/public/js/context-js/context-js.js index 95c818af..990c5ef8 100644 --- a/public/js/context-js/context-js.js +++ b/public/js/context-js/context-js.js @@ -131,7 +131,10 @@ window.context = window.context || (function () { e.preventDefault(); e.stopPropagation(); - let $menu = buildMenu(e.target.closest(selector), data, id); + let item = e.target.closest(selector); + open && open.call(item, this); + + let $menu = buildMenu(item, data, id); // clear dropdowns $('body .dropdown-menu.dropdown-context').remove(); // create dropdown @@ -161,8 +164,6 @@ window.context = window.context || (function () { }).fadeIn(options.fadeSpeed); } } - - open && open.call($dd.get(0), this); }); } diff --git a/resources/js/context-js.js b/resources/js/context-js.js index 95c818af..990c5ef8 100644 --- a/resources/js/context-js.js +++ b/resources/js/context-js.js @@ -131,7 +131,10 @@ window.context = window.context || (function () { e.preventDefault(); e.stopPropagation(); - let $menu = buildMenu(e.target.closest(selector), data, id); + let item = e.target.closest(selector); + open && open.call(item, this); + + let $menu = buildMenu(item, data, id); // clear dropdowns $('body .dropdown-menu.dropdown-context').remove(); // create dropdown @@ -161,8 +164,6 @@ window.context = window.context || (function () { }).fadeIn(options.fadeSpeed); } } - - open && open.call($dd.get(0), this); }); } diff --git a/resources/views/images.blade.php b/resources/views/images.blade.php index 9bdd46d1..f0e91e8f 100644 --- a/resources/views/images.blade.php +++ b/resources/views/images.blade.php @@ -132,7 +132,7 @@ waitThumbnailsLoad: false, }; - let selectedAlbum = 0; // 选择的相册 + let selectedAlbumId = 0; // 选择的相册 const HEADER_TITLE = '#header-title'; const PHOTOS_SCROLL = '#photos-scroll'; @@ -248,7 +248,7 @@ .replace(/__name__/g, albums[i].name) .replace(/__intro__/g, albums[i].intro) .replace(/__image_num__/g, albums[i].image_num) - if (albums[i].id === selectedAlbum) { + if (albums[i].id === selectedAlbumId) { // 选中的相册高亮 item = item .replace(/bg-gray-100/g, 'bg-blue-400') @@ -266,12 +266,12 @@ $albums.off('click', '>a').on('click', '>a', function () { // 如果当前已经为选中状态则清除 - if (selectedAlbum === $(this).data('id')) { - selectedAlbum = 0; + if (selectedAlbumId === $(this).data('id')) { + selectedAlbumId = 0; } else { - selectedAlbum = $(this).data('id'); + selectedAlbumId = $(this).data('id'); } - resetImages({page: 1, album_id: selectedAlbum}); + resetImages({page: 1, album_id: selectedAlbumId}); drawer.close(); ds.clearSelection(); }); @@ -408,7 +408,7 @@ const methods = { copy: { - text: '复制', + text: '复制图片', action: e => { let src = $(e).find('img').attr('src'); CopyImageClipboard.copyImageToClipboard(src).then(() => { @@ -417,12 +417,18 @@ toastr.warning('复制失败, ' + e.message) }); }, + visible: () => ds.getSelection().length === 1, }, refresh: {text: '刷新', action: _ => resetImages()}, - rename: {text: '重命名', action: e => {}}, + rename: { + text: '重命名', + action: e => {}, + visible: () => ds.getSelection().length === 1, + }, open: { text: '新窗口打开', action: e => window.open($(e).find('img').attr('src')), + visible: () => ds.getSelection().length === 1, }, copies: { text: '复制链接', @@ -453,17 +459,18 @@ attributes: {"data-link-type": "markdown_with_link"}, }, ], + visible: () => ds.getSelection().length === 1, }, movements: { text: '移动到相册', action: _ => { getAlbums({title: '选择相册'}, e => { let selected = ds.getSelection().map(item => $(item).data('id')); - $headerTitle.text(`移动 ${selected.length} 张图片到...`) + $headerTitle.text(`移动 ${selected.length} 张图片至...`) $(e).off('click', '>a').on('click', '>a', function () { axios.put('{{ route('user.images.movement') }}', { selected: selected, - album_id: $(this).data('id') + id: $(this).data('id'), }).then(response => { if (response.data.status) { drawer.close(); @@ -484,7 +491,8 @@ $headerTitle.text(`移出 ${selected.length} 张图片`) axios.put('{{ route('user.images.movement') }}', { selected: selected, - album_id: null, + album_id: selectedAlbumId, // 原相册ID + id: null, }).then(response => { if (response.data.status) { drawer.close(); @@ -495,7 +503,7 @@ } }); }, - visible: _ => selectedAlbum !== 0, + visible: _ => selectedAlbumId !== 0, }, detail: {text: '详细信息', action: e => {}}, delete: {text: '删除', action: e => {}}, @@ -516,12 +524,12 @@ {divider: true}, methods.rename, methods.delete, - ], function (e) { - let $item = $(e).closest(PHOTOS_ITEM); - let data = $item.data('json'); + ], function (item) { + let data = $(item).data('json'); // 选中当前项目 if (ds.getSelection().length <= 1) ds.clearSelection(); - ds.addSelection($item); + ds.addSelection($(item)); + // 追加链接 $(this).find('.copy').each(function () { $(this).data('copy-value', data.links[$(this).data('link-type')])