1
0

home.blade.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. @extends('admin.partial.template-full')
  2. @section('section')
  3. <div class="title mb-4">
  4. <h3 class="font-weight-bold">Settings</h3>
  5. @if(config('instance.enable_cc'))
  6. <p class="lead mb-0">Manage instance settings</p>
  7. </div>
  8. <form method="post">
  9. @csrf
  10. <ul class="nav nav-tabs nav-fill border-bottom-0" id="myTab" role="tablist">
  11. <li class="nav-item">
  12. <a class="nav-link font-weight-bold active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true"><i class="fas fa-home"></i></a>
  13. </li>
  14. <li class="nav-item border-none">
  15. <a class="nav-link font-weight-bold px-4" id="landing-tab" data-toggle="tab" href="#landing" role="tab" aria-controls="landing">Landing</a>
  16. </li>
  17. <li class="nav-item border-none">
  18. <a class="nav-link font-weight-bold px-4" id="brand-tab" data-toggle="tab" href="#brand" role="tab" aria-controls="brand">Brand</a>
  19. </li>
  20. {{-- <li class="nav-item border-none">
  21. <a class="nav-link font-weight-bold px-4" id="media-tab" data-toggle="tab" href="#media" role="tab" aria-controls="media">Mail</a>
  22. </li> --}}
  23. <li class="nav-item border-none">
  24. <a class="nav-link font-weight-bold px-4" id="media-tab" data-toggle="tab" href="#media" role="tab" aria-controls="media">Media</a>
  25. </li>
  26. <li class="nav-item border-none">
  27. <a class="nav-link font-weight-bold px-4" id="rules-tab" data-toggle="tab" href="#rules" role="tab" aria-controls="rules">Rules</a>
  28. </li>
  29. <li class="nav-item border-none">
  30. <a class="nav-link font-weight-bold px-4" id="users-tab" data-toggle="tab" href="#users" role="tab" aria-controls="users">Users</a>
  31. </li>
  32. <li class="nav-item">
  33. <a class="nav-link font-weight-bold px-4" id="advanced-tab" data-toggle="tab" href="#advanced" role="tab" aria-controls="advanced">Advanced</a>
  34. </li>
  35. </ul>
  36. <div class="tab-content" id="myTabContent">
  37. <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
  38. {{-- <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  39. <label class="font-weight-bold text-muted">System Configuration</label>
  40. <ul class="list-unstyled">
  41. <li>
  42. <span class="text-muted">Max Upload Size: </span>
  43. <span class="font-weight-bold">{{$system['max_upload_size']}}</span>
  44. </li>
  45. <li>
  46. <span class="text-muted">Image Driver: </span>
  47. <span class="font-weight-bold">{{$system['image_driver']}}</span>
  48. </li>
  49. <li>
  50. <span class="text-muted">Image Driver Loaded: </span>
  51. <span class="font-weight-bold">
  52. @if($system['image_driver_loaded'])
  53. <i class="fas fa-check text-success"></i>
  54. @else
  55. <i class="fas fa-times text-danger"></i>
  56. @endif
  57. </span>
  58. </li>
  59. <li>
  60. <span class="text-muted">File Permissions: </span>
  61. <span class="font-weight-bold">
  62. @if($system['permissions'])
  63. <i class="fas fa-check text-success"></i>
  64. @else
  65. <i class="fas fa-times text-danger"></i>
  66. @endif
  67. </span>
  68. </li>
  69. <li>
  70. <span class="text-muted"></span>
  71. <span class="font-weight-bold"></span>
  72. </li>
  73. </ul>
  74. </div> --}}
  75. <div class="form-group mb-0">
  76. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  77. <label class="font-weight-bold text-muted">Features</label>
  78. @if($cloud_ready)
  79. <div class="custom-control custom-checkbox mt-2">
  80. <input type="checkbox" name="cloud_storage" class="custom-control-input" id="cls1" {{config_cache('pixelfed.cloud_storage') ? 'checked' : ''}}>
  81. <label class="custom-control-label font-weight-bold" for="cls1">Cloud Storage</label>
  82. </div>
  83. <p class="mb-4 small">Store photos &amp; videos on S3 compatible object storage providers.</p>
  84. @endif
  85. <div class="custom-control custom-checkbox mt-2">
  86. <input type="checkbox" name="activitypub" class="custom-control-input" id="ap" {{config_cache('federation.activitypub.enabled') ? 'checked' : ''}}>
  87. <label class="custom-control-label font-weight-bold" for="ap">ActivityPub</label>
  88. </div>
  89. <p class="mb-4 small">ActivityPub federation, compatible with Pixelfed, Mastodon and other projects.</p>
  90. <div class="custom-control custom-checkbox mt-2">
  91. <input type="checkbox" name="open_registration" class="custom-control-input" id="openReg" {{config_cache('pixelfed.open_registration') ? 'checked' : ''}}>
  92. <label class="custom-control-label font-weight-bold" for="openReg">Open Registrations</label>
  93. </div>
  94. <p class="mb-4 small">Allow new user registrations.</p>
  95. <div class="custom-control custom-checkbox mt-2">
  96. <input type="checkbox" name="mobile_apis" class="custom-control-input" id="cf2" {{config_cache('pixelfed.oauth_enabled') ? 'checked' : ''}}>
  97. <label class="custom-control-label font-weight-bold" for="cf2">Mobile APIs</label>
  98. </div>
  99. <p class="mb-4 small">Enable apis required for mobile app support.</p>
  100. <div class="custom-control custom-checkbox mt-2">
  101. <input type="checkbox" name="stories" class="custom-control-input" id="cf3" {{config_cache('instance.stories.enabled') ? 'checked' : ''}}>
  102. <label class="custom-control-label font-weight-bold" for="cf3">Stories</label>
  103. </div>
  104. <p class="mb-4 small">Allow users to share ephemeral Stories.</p>
  105. <div class="custom-control custom-checkbox mt-2">
  106. <input type="checkbox" name="ig_import" class="custom-control-input" id="cf4" {{config_cache('pixelfed.import.instagram.enabled') ? 'checked' : ''}}>
  107. <label class="custom-control-label font-weight-bold" for="cf4">Instagram Import</label>
  108. </div>
  109. <p class="mb-4 small">Allow <span class="font-weight-bold">experimental</span> Instagram Import support.</p>
  110. <div class="custom-control custom-checkbox mt-2">
  111. <input type="checkbox" name="spam_detection" class="custom-control-input" id="cf5" {{config_cache('pixelfed.bouncer.enabled') ? 'checked' : ''}}>
  112. <label class="custom-control-label font-weight-bold" for="cf5">Spam detection</label>
  113. </div>
  114. <p class="mb-4 small">Detect and remove spam from timelines.</p>
  115. </div>
  116. </div>
  117. {{-- <div class="form-group mb-0">
  118. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  119. <label class="font-weight-bold text-muted">Name</label>
  120. <input class="form-control col-8" name="name" placeholder="Pixelfed" value="{{config_cache('app.name')}}">
  121. <p class="help-text small text-muted mt-3 mb-0">The instance name used in titles, metadata and apis.</p>
  122. </div>
  123. </div>
  124. <div class="form-group mb-0">
  125. <div class="ml-n4 mr-n2 p-3 border-bottom">
  126. <label class="font-weight-bold text-muted">Short Description</label>
  127. <textarea class="form-control" rows="3" name="short_description">{{config_cache('app.short_description')}}</textarea>
  128. <p class="help-text small text-muted mt-3 mb-0">Short description of instance used on various pages and apis.</p>
  129. </div>
  130. </div>
  131. <div class="form-group mb-0">
  132. <div class="ml-n4 mr-n2 p-3 border-bottom">
  133. <label class="font-weight-bold text-muted">Long Description</label>
  134. <textarea class="form-control" rows="3" name="long_description">{{config_cache('app.description')}}</textarea>
  135. <p class="help-text small text-muted mt-3 mb-0">Longer description of instance used on about page.</p>
  136. </div>
  137. </div> --}}
  138. </div>
  139. <div class="tab-pane" id="landing" role="tabpanel" aria-labelledby="landing-tab">
  140. <div class="form-group mb-0">
  141. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  142. <p class="mb-0 small">Configure your landing page</p>
  143. </div>
  144. </div>
  145. <div class="form-group mb-0">
  146. <div class="ml-n4 mr-n2 p-3 border-bottom">
  147. <p class="font-weight-bold text-muted">Discovery</p>
  148. <div class="my-3">
  149. <div class="custom-control custom-checkbox">
  150. <input type="checkbox" class="custom-control-input" id="show_directory" name="show_directory" {{ config_cache('instance.landing.show_directory') ? 'checked' : ''}}>
  151. <label class="custom-control-label font-weight-bold" for="show_directory">Show Directory</label>
  152. </div>
  153. </div>
  154. <div class="my-3">
  155. <div class="custom-control custom-checkbox">
  156. <input type="checkbox" class="custom-control-input" id="show_explore_feed" name="show_explore_feed" {{ config_cache('instance.landing.show_explore') ? 'checked' : ''}}>
  157. <label class="custom-control-label font-weight-bold" for="show_explore_feed">Show Explore Feed</label>
  158. </div>
  159. </div>
  160. </div>
  161. </div>
  162. <div class="form-group mb-0">
  163. <div class="ml-n4 mr-n2 p-3 border-bottom">
  164. <p class="font-weight-bold text-muted">Admin Account</p>
  165. <div class="my-3">
  166. <select class="custom-select" name="admin_account_id" style="max-width: 300px;">
  167. <option selected disabled>Select an admin account</option>
  168. @foreach($availableAdmins as $acct)
  169. <option
  170. value="{{ $acct->profile_id }}" {!! $currentAdmin && $currentAdmin['id'] == $acct->profile_id ? 'selected' : null !!}
  171. >
  172. <span class="font-weight-bold">&commat;{{ $acct->username }}</span>
  173. </option>
  174. @endforeach
  175. </select>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. <div class="tab-pane" id="brand" role="tabpanel" aria-labelledby="brand-tab">
  181. <div class="form-group mb-0">
  182. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  183. <label class="font-weight-bold text-muted">Name</label>
  184. <input class="form-control col-8" name="name" placeholder="Pixelfed" value="{{config_cache('app.name')}}">
  185. <p class="help-text small text-muted mt-3 mb-0">The instance name used in titles, metadata and apis.</p>
  186. </div>
  187. </div>
  188. <div class="form-group mb-0">
  189. <div class="ml-n4 mr-n2 p-3 border-bottom">
  190. <label class="font-weight-bold text-muted">Short Description</label>
  191. <textarea class="form-control" rows="3" name="short_description">{{config_cache('app.short_description')}}</textarea>
  192. <p class="help-text small text-muted mt-3 mb-0">Short description of instance used on various pages and apis.</p>
  193. </div>
  194. </div>
  195. <div class="form-group mb-0">
  196. <div class="ml-n4 mr-n2 p-3 border-bottom">
  197. <label class="font-weight-bold text-muted">Long Description</label>
  198. <textarea class="form-control" rows="3" name="long_description">{{config_cache('app.description')}}</textarea>
  199. <p class="help-text small text-muted mt-3 mb-0">Longer description of instance used on about page.</p>
  200. </div>
  201. </div>
  202. <div class="form-group mb-0">
  203. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  204. <label class="font-weight-bold text-muted">About Title</label>
  205. <input class="form-control col-8" name="about_title" placeholder="Photo Sharing. For Everyone" value="{{config_cache('about.title')}}">
  206. <p class="help-text small text-muted mt-3 mb-0">The header title used on the <a href="/site/about">about page</a>.</p>
  207. </div>
  208. </div>
  209. </div>
  210. <div class="tab-pane" id="users" role="tabpanel" aria-labelledby="users-tab">
  211. <div class="form-group mb-0">
  212. <div class="ml-n4 mr-n2 p-3 border-top">
  213. <div class="custom-control custom-checkbox mt-2">
  214. <input type="checkbox" name="require_email_verification" class="custom-control-input" id="mailVerification" {{config_cache('pixelfed.enforce_email_verification') ? 'checked' : ''}}>
  215. <label class="custom-control-label font-weight-bold" for="mailVerification">Require Email Verification</label>
  216. </div>
  217. </div>
  218. </div>
  219. <div class="form-group">
  220. <div class="ml-n4 mr-n2 p-3 border-top">
  221. <div class="custom-control custom-checkbox my-2">
  222. <input type="checkbox" name="enforce_account_limit" class="custom-control-input" id="userEnforceLimit" {{config_cache('pixelfed.enforce_account_limit') ? 'checked' : ''}}>
  223. <label class="custom-control-label font-weight-bold" for="userEnforceLimit">Enable account storage limit</label>
  224. <p class="help-text small text-muted">Set a storage limit per user account.</p>
  225. </div>
  226. <label class="font-weight-bold text-muted">Account Limit</label>
  227. <input class="form-control" name="account_limit" placeholder="Pixelfed" value="{{config_cache('pixelfed.max_account_size')}}">
  228. <p class="help-text small text-muted mt-3 mb-0">Account limit size in KB.</p>
  229. <p class="help-text small text-muted mb-0">{{config_cache('pixelfed.max_account_size')}} KB = {{floor(config_cache('pixelfed.max_account_size') / 1024)}} MB</p>
  230. </div>
  231. </div>
  232. <div class="form-group">
  233. <div class="ml-n4 mr-n2 p-3 border-top">
  234. <div class="custom-control custom-checkbox my-2">
  235. <input type="checkbox" name="account_autofollow" class="custom-control-input" id="userAccountAutofollow" {{config_cache('account.autofollow') ? 'checked' : ''}}>
  236. <label class="custom-control-label font-weight-bold" for="userAccountAutofollow">Auto Follow Accounts</label>
  237. <p class="help-text small text-muted">Enable auto follow accounts, new accounts will follow accounts you set.</p>
  238. </div>
  239. <label class="font-weight-bold text-muted">Accounts</label>
  240. <textarea class="form-control" name="account_autofollow_usernames" placeholder="Add account usernames to follow separated by commas">{{config_cache('account.autofollow_usernames')}}</textarea>
  241. <p class="help-text small text-muted mt-3 mb-0">Add account usernames to follow separated by commas.</p>
  242. </div>
  243. </div>
  244. </div>
  245. <div class="tab-pane" id="media" role="tabpanel" aria-labelledby="media-tab">
  246. <div class="form-group mb-0">
  247. <div class="ml-n4 mr-n2 p-3 border-top">
  248. <label class="font-weight-bold text-muted">Max Size</label>
  249. <input class="form-control" name="max_photo_size" value="{{config_cache('pixelfed.max_photo_size')}}">
  250. <p class="help-text small text-muted mt-3 mb-0">Maximum file upload size in KB</p>
  251. <p class="help-text small text-muted mb-0">{{config_cache('pixelfed.max_photo_size')}} KB = {{number_format(config_cache('pixelfed.max_photo_size') / 1024)}} MB</p>
  252. </div>
  253. </div>
  254. <div class="form-group mb-0">
  255. <div class="ml-n4 mr-n2 p-3 border-top">
  256. <label class="font-weight-bold text-muted">Photo Album Limit</label>
  257. <input class="form-control" name="max_album_length" value="{{config_cache('pixelfed.max_album_length')}}">
  258. <p class="help-text small text-muted mt-3 mb-0">The maximum number of photos or videos per album</p>
  259. </div>
  260. </div>
  261. <div class="form-group mb-0">
  262. <div class="ml-n4 mr-n2 p-3 border-top">
  263. <label class="font-weight-bold text-muted">Image Quality</label>
  264. <input class="form-control" name="image_quality" value="{{config_cache('pixelfed.image_quality')}}">
  265. <p class="help-text small text-muted mt-3 mb-0">Image optimization quality from 0-100%. Set to 0 to disable image optimization.</p>
  266. </div>
  267. </div>
  268. <div class="form-group">
  269. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  270. <label class="font-weight-bold text-muted">Media Types</label>
  271. <div class="custom-control custom-checkbox mt-2">
  272. <input type="checkbox" name="type_jpeg" class="custom-control-input" id="mediaType1" {{$jpeg ? 'checked' : ''}}>
  273. <label class="custom-control-label" for="mediaType1"><span class="border border-dark px-1 rounded font-weight-bold">JPEG</span></label>
  274. </div>
  275. <div class="custom-control custom-checkbox mt-2">
  276. <input type="checkbox" name="type_png" class="custom-control-input" id="mediaType2" {{$png ? 'checked' : ''}}>
  277. <label class="custom-control-label" for="mediaType2"><span class="border border-dark px-1 rounded font-weight-bold">PNG</span></label>
  278. </div>
  279. <div class="custom-control custom-checkbox mt-2">
  280. <input type="checkbox" name="type_gif" class="custom-control-input" id="mediaType3" {{$gif ? 'checked' : ''}}>
  281. <label class="custom-control-label" for="mediaType3"><span class="border border-dark px-1 rounded font-weight-bold">GIF</span></label>
  282. </div>
  283. <div class="custom-control custom-checkbox mt-2">
  284. <input type="checkbox" name="type_webp" class="custom-control-input" id="mediaType4" {{$webp ? 'checked' : ''}}>
  285. <label class="custom-control-label" for="mediaType4"><span class="border border-dark px-1 rounded font-weight-bold">WebP</span></label>
  286. </div>
  287. <div class="custom-control custom-checkbox mt-2">
  288. <input type="checkbox" name="type_mp4" class="custom-control-input" id="mediaType5" {{$mp4 ? 'checked' : ''}}>
  289. <label class="custom-control-label" for="mediaType5"><span class="border border-dark px-1 rounded font-weight-bold">MP4</span></label>
  290. </div>
  291. <p class="help-text small text-muted mt-3 mb-0">Allowed media types.</p>
  292. </div>
  293. </div>
  294. </div>
  295. <div class="tab-pane" id="rules" role="tabpanel" aria-labelledby="rules-tab">
  296. <div class="border-top">
  297. <p class="lead mt-3 py-3 text-center">Add rules that explain what is acceptable use.</p>
  298. </div>
  299. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  300. <p class="font-weight-bold text-muted">Active Rules</p>
  301. <ol class="font-weight-bold">
  302. @if($rules)
  303. @foreach($rules as $rule)
  304. <li class="mb-4">
  305. <p class="mb-0">
  306. {{$rule}}
  307. </p>
  308. <p>
  309. <button type="button" class="btn btn-outline-danger btn-sm py-0 rule-delete" data-index="{{$loop->index}}">Delete</button>
  310. </p>
  311. </li>
  312. @endforeach
  313. @endif
  314. </ol>
  315. </div>
  316. <div class="form-group mb-0">
  317. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  318. <label class="font-weight-bold text-muted">Add Rule</label>
  319. <input class="form-control" name="new_rule" placeholder="Add a new rule, we recommend being descriptive but keeping it short"/>
  320. </div>
  321. </div>
  322. </div>
  323. <div class="tab-pane" id="advanced" role="tabpanel" aria-labelledby="advanced-tab">
  324. <div class="form-group mb-0">
  325. <div class="ml-n4 mr-n2 p-3 border-top border-bottom">
  326. <label class="font-weight-bold text-muted">Custom CSS</label>
  327. <div class="custom-control custom-checkbox my-2">
  328. <input type="checkbox" name="show_custom_css" class="custom-control-input" id="showCustomCss" {{config_cache('uikit.show_custom.css') ? 'checked' : ''}}>
  329. <label class="custom-control-label font-weight-bold" for="showCustomCss">Enable custom CSS</label>
  330. </div>
  331. <textarea class="form-control" name="custom_css" rows="3">{{config_cache('uikit.custom.css')}}</textarea>
  332. <p class="help-text small text-muted mt-3 mb-0">Add custom CSS, will be used on all pages</p>
  333. </div>
  334. </div>
  335. </div>
  336. </div>
  337. <div class="form-group row mb-0 mt-4">
  338. <div class="col-12 text-right">
  339. <button type="submit" class="btn btn-primary font-weight-bold px-5">Save</button>
  340. </div>
  341. </div>
  342. </form>
  343. @else
  344. </div>
  345. <div class="py-5">
  346. <p class="lead text-center font-weight-bold">Not enabled</p>
  347. <p class="text-center">Add <code>ENABLE_CONFIG_CACHE=true</code> in your <span class="font-weight-bold">.env</span> file <br /> and run <span class="font-weight-bold">php artisan config:cache</span></p>
  348. </div>
  349. @endif
  350. @endsection
  351. @push('scripts')
  352. <script type="text/javascript">
  353. $('.rule-delete').on('click', function(e) {
  354. if(window.confirm('Are you sure you want to delete this rule?')) {
  355. let idx = e.target.dataset.index;
  356. axios.post(window.location.href, {
  357. 'rule_delete': idx
  358. }).then(res => {
  359. $('.rule-delete[data-index="'+idx+'"]').parents().eq(1).remove();
  360. });
  361. }
  362. });
  363. $(document).ready(function() {
  364. setTimeout(() => {
  365. $('.alert-success').fadeOut();
  366. }, 1000);
  367. });
  368. </script>
  369. @endpush