index.blade.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. @extends('layouts.main')
  2. @section('content')
  3. <!-- CONTENT HEADER -->
  4. <section class="content-header">
  5. <div class="container-fluid">
  6. <div class="mb-2 row">
  7. <div class="col-sm-6">
  8. <h1>{{ __('Settings') }}</h1>
  9. </div>
  10. <div class="col-sm-6">
  11. <ol class="breadcrumb float-sm-right">
  12. <li class="breadcrumb-item"><a href="">{{ __('Dashboard') }}</a></li>
  13. <li class="breadcrumb-item"><a class="text-muted"
  14. href="{{ route('admin.settings.index') }}">{{ __('Settings') }}</a>
  15. </li>
  16. </ol>
  17. </div>
  18. </div>
  19. </div>
  20. </section>
  21. <!-- END CONTENT HEADER -->
  22. @if (!file_exists(base_path() . '/install.lock'))
  23. <div class="callout callout-danger">
  24. <h4>{{ __('The installer is not locked!') }}</h4>
  25. <p>{{ __('please create a file called "install.lock" in your dashboard Root directory. Otherwise no settings will be loaded!') }}
  26. </p>
  27. <a href="/install?step=7">
  28. <button class="btn btn-outline-danger">{{ __('or click here') }}</button>
  29. </a>
  30. </div>
  31. @endif
  32. <!-- MAIN CONTENT -->
  33. <section class="content">
  34. <div class="container-fluid">
  35. <div class="card">
  36. <div class="card-header">
  37. <div class="d-flex justify-content-between">
  38. <h5 class="card-title"><i class="mr-2 fas fa-tools"></i>{{ __('Settings') }}</h5>
  39. </div>
  40. </div>
  41. <div class="card-body">
  42. <!-- Sidebar Menu -->
  43. <div class="d-flex w-100">
  44. <div class="p-0 col-2">
  45. <nav class="mt-1">
  46. <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="tablist"
  47. data-accordion="false">
  48. <li class="nav-item border-bottom-0">
  49. <a href="#icons" class="nav-link" data-toggle="pill" role="tab">
  50. <i class="nav-icon fas fa-image"></i>
  51. <p>
  52. {{ __('Images / Icons') }}
  53. </p>
  54. </a>
  55. </li>
  56. @foreach ($settings as $category => $options)
  57. @if (!str_contains($options['settings_class'], 'Extension'))
  58. @canany(['settings.' . strtolower($category) . '.read', 'settings.' .
  59. strtolower($category) . '.write'])
  60. <li class="nav-item border-bottom-0">
  61. <a href="#{{ $category }}"
  62. class="nav-link {{ $loop->first ? 'active' : '' }}" data-toggle="pill"
  63. role="tab">
  64. <i
  65. class="nav-icon fas {{ $options['category_icon'] ?? 'fas fa-cog' }}"></i>
  66. <p>
  67. {{ $category }}
  68. </p>
  69. </a>
  70. </li>
  71. @endcanany
  72. @endif
  73. @endforeach
  74. </ul>
  75. <button class="btn btn-outline-secondary" type="button" data-toggle="collapse"
  76. data-target="#collapseExtensions" aria-expanded="false"
  77. aria-controls="collapseExtensions">
  78. {{ __('Extension Settings') }}
  79. </button>
  80. <div class="collapse" id="collapseExtensions">
  81. <ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="tablist"
  82. data-accordion="false">
  83. @foreach ($settings as $category => $options)
  84. @if (str_contains($options['settings_class'], 'Extension'))
  85. @canany(['settings.' . strtolower($category) . '.read', 'settings.' .
  86. strtolower($category) . '.write'])
  87. <li class="nav-item border-bottom-0">
  88. <a href="#{{ $category }}" class="nav-link" data-toggle="pill"
  89. role="tab">
  90. <i
  91. class="nav-icon fas {{ $options['category_icon'] ?? 'fas fa-cog' }}"></i>
  92. <p>
  93. {{ $category }}
  94. </p>
  95. </a>
  96. </li>
  97. @endcanany
  98. @endif
  99. @endforeach
  100. </div>
  101. </ul>
  102. </nav>
  103. </div>
  104. <!-- /.sidebar-menu -->
  105. <!-- Content in $settings -->
  106. <div class="p-0 col-10">
  107. <div class="ml-3 tab-content" style="width: 100%;">
  108. <div container class="container tab-pane fade" id="icons" role="tabpanel">
  109. <form method="POST" enctype="multipart/form-data" class="mb-3"
  110. action="{{ route('admin.settings.updateIcons') }}">
  111. @csrf
  112. @method('POST')
  113. <div class="row">
  114. <div class="ml-5 card" style="width: 18rem;">
  115. <span class="text-center h3">{{ __('FavIcon') }} </span>
  116. <img src="{{ Storage::disk('public')->exists('favicon.ico') ? asset('storage/favicon.ico') : asset('images/controlpanel_logo.png') }}"
  117. style="width:5vw;display: block; margin-left: auto;margin-right: auto"
  118. class="card-img-top" alt="...">
  119. <div class="card-body">
  120. </div>
  121. <input type="file" accept="image/x-icon" class="form-control"
  122. name="favicon" id="favicon">
  123. </div>
  124. <div class="ml-5 card" style="width: 18rem;">
  125. <span class="text-center h3">{{ __('Icon') }} </span>
  126. <img src="{{ Storage::disk('public')->exists('icon.png') ? asset('storage/icon.png') : asset('images/controlpanel_logo.png') }}"
  127. style="width:5vw;display: block; margin-left: auto;margin-right: auto"
  128. class="card-img-top" alt="...">
  129. <div class="card-body">
  130. </div>
  131. <input type="file" accept="image/png,image/jpeg,image/jpg"
  132. class="form-control" name="icon" id="icon">
  133. </div>
  134. <div class="ml-5 card" style="width: 18rem;">
  135. <span class="text-center h3">{{ __('Login-page Logo') }} </span>
  136. <img src="{{ Storage::disk('public')->exists('logo.png') ? asset('storage/logo.png') : asset('images/controlpanel_logo.png') }}"
  137. style="width:5vw;display: block; margin-left: auto;margin-right: auto"
  138. class="card-img-top" alt="...">
  139. <div class="card-body">
  140. </div>
  141. <input type="file" accept="image/png,image/jpeg,image/jpg"
  142. class="form-control" name="logo" id="logo">
  143. </div>
  144. </div>
  145. <div class="row">
  146. <button class="mt-3 ml-3 btn btn-primary">{{ __('Save') }}</button>
  147. </div>
  148. </form>
  149. </div>
  150. @foreach ($settings as $category => $options)
  151. @canany(['settings.' . strtolower($category) . '.read', 'settings.' .
  152. strtolower($category) . '.write'])
  153. <div class="tab-pane fade container {{ $loop->first ? 'active show' : '' }}"
  154. id="{{ $category }}" role="tabpanel">
  155. <form action="{{ route('admin.settings.update') }}" method="POST">
  156. @csrf
  157. @method('POST')
  158. <input type="hidden" name="settings_class"
  159. value="{{ $options['settings_class'] }}">
  160. <input type="hidden" name="category" value="{{ $category }}">
  161. @foreach ($options as $key => $value)
  162. @if ($key == 'category_icon' || $key == 'settings_class')
  163. @continue
  164. @endif
  165. <div class="row">
  166. <div class="col-4 d-flex align-items-center">
  167. <label for="{{ $key }}">{{ $value['label'] }}</label>
  168. </div>
  169. <div class="col-8">
  170. <div class="mb-3 custom-control d-flex align-items-center">
  171. @if ($value['description'])
  172. <i class="mr-4 fas fa-info-circle" data-toggle="popover"
  173. data-trigger="hover" data-placement="top"
  174. data-html="true"
  175. data-content="{{ $value['description'] }}"></i>
  176. @else
  177. <i class="invisible mr-4 fas fa-info-circle"></i>
  178. @endif
  179. <div class="w-100">
  180. @switch($value)
  181. @case($value['type'] == 'string')
  182. <input type="text" class="form-control"
  183. name="{{ $key }}"
  184. value="{{ $value['value'] }}">
  185. @break
  186. @case($value['type'] == 'password')
  187. <input type="password" class="form-control"
  188. name="{{ $key }}"
  189. value="{{ $value['value'] }}">
  190. @break
  191. @case($value['type'] == 'boolean')
  192. <input type="checkbox" name="{{ $key }}"
  193. value="{{ $value['value'] }}"
  194. {{ $value['value'] ? 'checked' : '' }}>
  195. @break
  196. @case($value['type'] == 'number')
  197. <input type="number" class="form-control"
  198. name="{{ $key }}"
  199. value="{{ $value['value'] }}">
  200. @break
  201. @case($value['type'] == 'select')
  202. <select id="{{ $key }}"
  203. class="custom-select w-100"
  204. name="{{ $key }}">
  205. @if ($value['identifier'] == 'display')
  206. @foreach ($value['options'] as $option => $display)
  207. <option value="{{ $display }}"
  208. {{ $value['value'] == $display ? 'selected' : '' }}>
  209. {{ __($display) }}
  210. </option>
  211. @endforeach
  212. @else
  213. @foreach ($value['options'] as $option => $display)
  214. <option value="{{ $option }}"
  215. {{ $value['value'] == $option ? 'selected' : '' }}>
  216. {{ __($display) }}
  217. </option>
  218. @endforeach
  219. @endif
  220. </select>
  221. @break
  222. @case($value['type'] == 'multiselect')
  223. <select id="{{ $key }}"
  224. class="custom-select w-100"
  225. name="{{ $key }}[]" multiple>
  226. @foreach ($value['options'] as $option)
  227. <option value="{{ $option }}"
  228. {{ strpos($value['value'], $option) !== false ? 'selected' : '' }}>
  229. {{ __($option) }}
  230. </option>
  231. @endforeach
  232. </select>
  233. @break
  234. @case($value['type'] == 'textarea')
  235. <textarea class="form-control" name="{{ $key }}" rows="3">{{ $value['value'] }}</textarea>
  236. @break
  237. @default
  238. @endswitch
  239. @error($key)
  240. <div class="text-danger ">
  241. {{ $message }}
  242. </div>
  243. @enderror
  244. </div>
  245. </div>
  246. </div>
  247. </div>
  248. @endforeach
  249. <!-- TODO: Display this only on the General tab
  250. <div class="row">
  251. <div class="col-4 d-flex align-items-center">
  252. <label for="recaptcha_preview">{{ __('ReCAPTCHA Preview') }}</label>
  253. </div>
  254. <div class="col-8">
  255. <div class="w-100">
  256. <div class="mb-3 input-group">
  257. {!! htmlScriptTagJsApi() !!}
  258. {!! htmlFormSnippet() !!}
  259. @error('g-recaptcha-response')
  260. <span class="text-danger" role="alert">
  261. <small><strong>{{ $message }}</strong></small>
  262. </span>
  263. @enderror
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. -->
  269. <div class="row">
  270. <div class="col-12 d-flex align-items-center justify-content-end">
  271. <button type="submit" class="float-right btn btn-primary ">Save
  272. </button>
  273. <button type="reset"
  274. class="float-right ml-2 btn btn-secondary">Reset
  275. </button>
  276. </div>
  277. </div>
  278. </form>
  279. </div>
  280. @endcanany
  281. @endforeach
  282. </div>
  283. </div>
  284. </div>
  285. </div>
  286. </div>
  287. </div>
  288. </div>
  289. <!-- END CUSTOM CONTENT -->
  290. </section>
  291. <!-- END CONTENT -->
  292. <script>
  293. const tabPaneHash = window.location.hash;
  294. if (tabPaneHash) {
  295. $('.nav-item a[href="' + tabPaneHash + '"]').tab('show');
  296. }
  297. $('.nav-pills a').click(function(e) {
  298. $(this).tab('show');
  299. const scrollmem = $('body').scrollTop();
  300. window.location.hash = this.hash;
  301. $('html,body').scrollTop(scrollmem);
  302. });
  303. document.addEventListener('DOMContentLoaded', (event) => {
  304. $('.custom-select').select2();
  305. })
  306. tinymce.init({
  307. selector: 'textarea',
  308. promotion: false,
  309. skin: "oxide-dark",
  310. content_css: "dark",
  311. branding: false,
  312. height: 500,
  313. width: '100%',
  314. plugins: ['image', 'link'],
  315. });
  316. </script>
  317. @endsection