info.blade.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. @extends('admin.layouts')
  2. @section('css')
  3. <link href="/assets/global/vendor/dropify/dropify.min.css" rel="stylesheet">
  4. <link href="/assets/global/vendor/bootstrap-select/bootstrap-select.min.css" rel="stylesheet">
  5. @endsection
  6. @section('content')
  7. <div class="page-content container">
  8. <x-ui.panel :title="trans(isset($article) ? 'admin.action.edit_item' : 'admin.action.add_item', ['attribute' => trans('model.article.attribute')])">
  9. <x-slot:alert>
  10. @if (Session::has('successMsg'))
  11. <x-alert :message="Session::pull('successMsg')" />
  12. @endif
  13. @if ($errors->any())
  14. <x-alert type="danger" :message="$errors->all()" />
  15. @endif
  16. </x-slot:alert>
  17. <x-admin.form.container :route="isset($article) ? route('admin.article.update', $article) : route('admin.article.store')" :method="isset($article) ? 'PUT' : 'POST'">
  18. <x-admin.form.radio-group name="type" :label="trans('model.common.type')" :options="[1 => trans('admin.article.type.knowledge'), 2 => trans('admin.article.type.announcement')]" />
  19. <x-admin.form.input name="title" :label="ucfirst(trans('validation.attributes.title'))" required autofocus />
  20. <x-admin.form.input name="category" container="form-group row article" :label="trans('model.article.category')" attribute="list=category_list" :help="trans('admin.article.category_hint')" />
  21. <datalist id="category_list">
  22. @foreach ($categories as $category)
  23. <option value="{{ $category }}">{{ $category }}</option>
  24. @endforeach
  25. </datalist>
  26. <x-admin.form.select name="language" :label="trans('model.article.language')">
  27. @foreach (config('common.language') as $key => $value)
  28. <option data-content="<i class='fi fi-{{ $value[1] }}' aria-hidden='true'></i> {{ $value[0] }}" value="{{ $key }}">
  29. </option>
  30. @endforeach
  31. </x-admin.form.select>
  32. <x-admin.form.input class="form-group row article" name="sort" type="number" :label="trans('model.common.sort')" min="0" max="255" required
  33. :help="trans('admin.sort_asc')" />
  34. <x-admin.form.skeleton name="logo" :label="trans('model.article.logo')">
  35. <input id="logo" name="logo" data-plugin="dropify" data-default-file="{{ asset($article->logo ?? '/assets/images/default.png') }}"
  36. type="file" />
  37. <input class="form-control" id="logoUrl" type="text" placeholder="{{ trans('admin.article.logo_placeholder') }}">
  38. </x-admin.form.skeleton>
  39. <x-admin.form.textarea name="content" :label="ucfirst(trans('validation.attributes.content'))" label_grid="col-xxl-1 col-lg-2" input_grid="col-lg-10" />
  40. <div class="form-actions text-right">
  41. <div class="btn-group">
  42. <a class="btn btn-danger" href="{{ route('admin.article.index') }}">{{ trans('common.back') }}</a>
  43. <button class="btn btn-success" type="submit">{{ trans('common.submit') }}</button>
  44. </div>
  45. </div>
  46. </x-admin.form.container>
  47. </x-ui.panel>
  48. </div>
  49. @endsection
  50. @section('javascript')
  51. <script src="/assets/global/vendor/dropify/dropify.min.js"></script>
  52. <script src="/assets/global/js/Plugin/dropify.js"></script>
  53. <script src="/assets/custom/tinymce/tinymce.min.js"></script>
  54. <script src="/assets/global/vendor/bootstrap-select/bootstrap-select.min.js"></script>
  55. <script src="/assets/global/js/Plugin/bootstrap-select.js"></script>
  56. <script>
  57. // 初始化 TinyMCE
  58. tinymce.init({
  59. selector: "textarea", // change this value according to your HTML
  60. license_key: "gpl",
  61. plugins: "advlist autolink autoresize autosave code emoticons help image importcss link lists media " +
  62. "preview quickbars searchreplace table visualblocks visualchars wordcount",
  63. toolbar: "restoredraft undo redo | styles | bold italic forecolor backcolor emoticons| alignleft aligncenter alignright alignjustify" +
  64. " | bullist numlist outdent indent | link image media",
  65. menubar: "view edit insert format table tools help",
  66. link_default_target: "_blank",
  67. quickbars_insert_toolbar: "quicktable image media",
  68. quickbars_selection_toolbar: "bold italic underline | blocks | bullist numlist | blockquote quicklink",
  69. extended_valid_elements: "button[onclick|class],i[class|aria-hidden]", // Allow more attributes for <a>
  70. language: '{{ app()->getLocale() !== 'ko' ? app()->getLocale() : 'ko_KR' }}',
  71. content_css: [
  72. "/assets/bundle/app.min.css",
  73. "/assets/global/fonts/font-awesome/css/all.min.css",
  74. "/assets/global/fonts/material-design/material-design.min.css",
  75. "/assets/global/fonts/web-icons/web-icons.min.css",
  76. "https://fonts.loli.net/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap",
  77. "/assets/custom/articles.min.css",
  78. "/assets/custom/tinymce.min.css"
  79. ],
  80. min_height: 500,
  81. max_height: 800
  82. });
  83. // 类型切换处理
  84. $("input:radio[name=type]").on("change", function() {
  85. $(".article").toggle($(this).val() === "1");
  86. });
  87. // 初始化 Dropify
  88. const $logo = $("#logo");
  89. const $logoUrl = $("#logoUrl");
  90. let logoCleared = false;
  91. const dropify = $logo.dropify().data("dropify");
  92. // 添加 Dropify clear 事件处理
  93. $logo.on("dropify.afterClear", function() {
  94. logoCleared = true;
  95. });
  96. // Logo URL 输入处理
  97. $logoUrl.on("input", function() {
  98. const imageUrl = $logoUrl.val();
  99. if (imageUrl) { //updateDropifyPreview
  100. dropify.settings.defaultFile = imageUrl;
  101. dropify.destroy();
  102. $logo.dropify({
  103. defaultFile: imageUrl
  104. }).data("dropify").init();
  105. } else {
  106. dropify.resetPreview();
  107. dropify.clearElement();
  108. }
  109. });
  110. // 表单提交处理
  111. $("form").on("submit", function() {
  112. const logoUrl = $logoUrl.val();
  113. if (logoUrl || (logoCleared && !$logo.val())) {
  114. $logo.attr("type", "text").val(logoUrl || null);
  115. }
  116. });
  117. $(document).ready(function() {
  118. let articleData = {
  119. type: 1
  120. };
  121. @isset($article)
  122. articleData = @json($article);
  123. @endisset
  124. autoPopulateForm(articleData, {
  125. skipFields: ['logo']
  126. })
  127. });
  128. </script>
  129. @endsection