diff --git a/app/Http/Controllers/ProgramAppendConstructController.php b/app/Http/Controllers/ProgramAppendConstructController.php index 47af017..df3b98f 100644 --- a/app/Http/Controllers/ProgramAppendConstructController.php +++ b/app/Http/Controllers/ProgramAppendConstructController.php @@ -9,6 +9,7 @@ use Illuminate\Routing\Controller as BaseController; class ProgramAppendConstructController extends BaseController { + // region Views public function index(Request $request, Programs $program) { return view("program.construct.append.index", [ "program" => $program, @@ -27,21 +28,6 @@ class ProgramAppendConstructController extends BaseController ]); } - public function create(Request $request, Programs $program) { - $request->validate([ - "name" => ["required_without:is_original"], - "from" => ["required"], - "price" => ["required", "numeric"], - ]); - $createPayload = $request->only(["name", "from", "price", "append"]); - $append = $program->appends()->create($createPayload); - $append->is_original = $request->post("is_original", 0); - $append->save(); - return redirect(route("program.construct.append.list", [ - "program"=>$program->id, - ])); - } - public function edit(Request $request, ProgramAppends $append) { return view("program.construct.append.create", [ "program" => $append->program, @@ -49,16 +35,44 @@ class ProgramAppendConstructController extends BaseController ]); } + public function copy_view(Request $request, Programs $program) { + return view("program.construct.append.copy_broadcast", [ + "program" => $program, + ]); + } + // endregion + + // region Form Submits + public function create(Request $request, Programs $program) { + $append = $this->fill_model($request); + $program->appends()->save($append); + return redirect(route("program.construct.append.list", [ + "program"=>$program->id, + ])); + } + public function submit(Request $request, ProgramAppends $append) { - $submitPayload = $request->only(["name", "from", "price", "append"]); - $append->update($submitPayload); - $append->is_original = $request->post("is_original", 0); + $append = $this->fill_model($request, $append); $append->save(); return redirect(route("program.construct.append.list", [ "program"=>$append->program->id, ])); } + public function copy_append(Request $request, Programs $program) { + $payload = $request->validate([ + "id" => ["required", "numeric", "exists:App\Models\ProgramAppends,id"] + ]); + $original_append = ProgramAppends::query()->findOrFail($payload["id"]); + $append = $original_append->replicate(); + $program->appends()->save($append); + return redirect(route("program.construct.append.list", [ + "program"=>$append->program->id, + ])); + } + // endregion + + // region API public function from_list(Request $request) { $query = ProgramAppends::query()->groupBy("from") ->select("from") @@ -73,4 +87,35 @@ class ProgramAppendConstructController extends BaseController ]; })->toArray(); } + + public function broadcast_list(Request $request) { + $query = ProgramAppends::query()->groupBy("name") + ->where("broadcast", "=", 1) + ->select("name")->selectRaw("max(id) as id"); + return $query->get()->map(function ($item) { + return [ + "text" => $item["name"], + "value" => $item["id"], + "alias" => implode("", \pinyin($item["name"], PINYIN_NO_TONE|PINYIN_KEEP_ENGLISH)), + "abbr" => \pinyin_abbr($item["name"]), + ]; + }); + } + // endregion + + private function fill_model(Request $request, ?ProgramAppends $append = null): ProgramAppends + { + if ($append === null) { + $append = new ProgramAppends(); + } + $payload = $request->validate([ + "name" => ["required_without:is_original"], + "from" => ["required"], + "price" => ["required", "numeric"], + "post" => [], + ]); + $append->fill($payload); + $append->is_original = $request->post("is_original", 0); + return $append; + } } diff --git a/resources/js/component/broadcast_select.js b/resources/js/component/broadcast_select.js new file mode 100644 index 0000000..fa0614d --- /dev/null +++ b/resources/js/component/broadcast_select.js @@ -0,0 +1,30 @@ +import PickleComplate from "../vendor/picomplete/picomplete"; + +(function () { + const id_input = document.getElementById("broadcast_id") + const pickle_config = { + target: '#broadcast_select', + suggest: ["alias", "abbr"], + clickCallback: (target, node) => { + target.value = node.text; + id_input.value = node.value; + } + }; + let local_data_string = window.localStorage.getItem("append_broadcast_list"); + if (!local_data_string) { + return fetch("/programs/construct/append/broadcast_list", { + "method": "GET", + }).then((response) => response.json()).then((data) => { + window.localStorage.setItem("append_broadcast_list", JSON.stringify(data)); + new PickleComplate({ + data: data, + config: pickle_config, + }) + }); + } else { + new PickleComplate({ + data: JSON.parse(local_data_string), + config: pickle_config, + }) + } +})() diff --git a/resources/js/vendor/picomplete/picomplete.js b/resources/js/vendor/picomplete/picomplete.js index 89aac98..2de6f11 100644 --- a/resources/js/vendor/picomplete/picomplete.js +++ b/resources/js/vendor/picomplete/picomplete.js @@ -118,8 +118,8 @@ export default class PickleComplate { } containsSuggest(item, value) { - if (item.text.toLowerCase().includes(value.toLowerCase()) || - item.value.toLowerCase().includes(value.toLowerCase())) { + if (item.text.toString().toLowerCase().includes(value.toLowerCase()) || + item.value.toString().toLowerCase().includes(value.toLowerCase())) { return true; } if (this.config.suggest) { @@ -127,7 +127,7 @@ export default class PickleComplate { this.config.suggest = [this.config.suggest] } for (const suggest_key of this.config.suggest) { - if (item.hasOwnProperty(suggest_key) && item[suggest_key].toLowerCase().includes(value.toLowerCase())) { + if (item.hasOwnProperty(suggest_key) && item[suggest_key].toString().toLowerCase().includes(value.toLowerCase())) { return true; } } diff --git a/resources/views/program/construct/append/copy_broadcast.blade.php b/resources/views/program/construct/append/copy_broadcast.blade.php new file mode 100644 index 0000000..2a0b668 --- /dev/null +++ b/resources/views/program/construct/append/copy_broadcast.blade.php @@ -0,0 +1,26 @@ + + + + 录播节目点播信息修改 + + + + + + +@include("common.header") +
+ + @include("common.form_error") +
+ +
+
+@include("common.footer") + + + diff --git a/resources/views/program/construct/append/index.blade.php b/resources/views/program/construct/append/index.blade.php index cfc76b1..d94212a 100644 --- a/resources/views/program/construct/append/index.blade.php +++ b/resources/views/program/construct/append/index.blade.php @@ -8,6 +8,7 @@ @include("common.header") $program->id])}}">新增 +$program->id])}}">复制常驻留言 diff --git a/routes/web.php b/routes/web.php index 0348fae..685f630 100644 --- a/routes/web.php +++ b/routes/web.php @@ -55,6 +55,9 @@ Route::prefix("/programs/construct")->middleware("auth:web")->group(function (Ro $router->get('/{program}/append/add', ["\\App\\Http\\Controllers\\ProgramAppendConstructController","add"])->name("program.construct.append.add"); $router->post('/{program}/append/add', ["\\App\\Http\\Controllers\\ProgramAppendConstructController","create"])->name("program.construct.append.create"); $router->get('/append/from_list', ["\\App\\Http\\Controllers\\ProgramAppendConstructController", "from_list"])->name("program.construct.append.from_list"); + $router->get('/{program}/append/copy', ["\\App\\Http\\Controllers\\ProgramAppendConstructController","copy_view"])->name("program.construct.append.copy"); + $router->post('/{program}/append/copy', ["\\App\\Http\\Controllers\\ProgramAppendConstructController","copy_append"])->name("program.construct.append.copy.submit"); + $router->get('/append/broadcast_list', ["\\App\\Http\\Controllers\\ProgramAppendConstructController", "broadcast_list"])->name("program.construct.append.broadcast_list"); $router->get('/append/{append}', ["\\App\\Http\\Controllers\\ProgramAppendConstructController","edit"])->name("program.construct.append.edit"); $router->post('/append/{append}', ["\\App\\Http\\Controllers\\ProgramAppendConstructController","submit"])->name("program.construct.append.submit"); }); diff --git a/webpack.mix.js b/webpack.mix.js index bb80a03..b85f43e 100644 --- a/webpack.mix.js +++ b/webpack.mix.js @@ -13,6 +13,7 @@ const mix = require('laravel-mix'); mix .js('resources/js/component/from_select.js', 'public/js/component') + .js('resources/js/component/broadcast_select.js', 'public/js/component') .js('resources/js/app.js', 'public/js') .extract(['axios', 'lodash']) .js('resources/js/webauthn.js', 'public/js')