home.blade.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. @extends('settings.template')
  2. @section('section')
  3. <div class="title">
  4. <h3 class="font-weight-bold">{{__('settings.home.account_settings')}}</h3>
  5. </div>
  6. <hr>
  7. <div class="form-group row">
  8. <div class="col-sm-3">
  9. <img src="{{Auth::user()->profile->avatarUrl()}}" width="38px" height="38px" class="rounded-circle float-right" draggable="false" onerror="this.src='/storage/avatars/default.jpg?v=0';this.onerror=null;">
  10. </div>
  11. <div class="col-sm-9">
  12. <p class="lead font-weight-bold mb-0">{{Auth::user()->username}}</p>
  13. <p class="">
  14. <a href="#" class="font-weight-bold change-profile-photo" data-toggle="collapse" data-target="#avatarCollapse" aria-expanded="false" aria-controls="avatarCollapse">{{__('settings.home.change_profile_photo')}}</a>
  15. </p>
  16. <div class="collapse" id="avatarCollapse">
  17. <form method="post" action="/settings/avatar" enctype="multipart/form-data">
  18. @csrf
  19. <div class="card card-body">
  20. <div class="custom-file mb-1">
  21. <input type="file" name="avatar" class="custom-file-input" id="avatarInput">
  22. <label class="custom-file-label" for="avatarInput">{{__('settings.home.select_a_profile_photo')}}</label>
  23. </div>
  24. <p><span class="small font-weight-bold">{{__('settings.home.must_be_a_jpeg_or_png_max_avatar_size')}} <span id="maxAvatarSize"></span></span></p>
  25. <div id="previewAvatar"></div>
  26. <p class="mb-0"><button type="submit" class="btn btn-primary px-4 py-0 font-weight-bold">{{__('settings.home.upload')}}</button></p>
  27. </div>
  28. </form>
  29. </div>
  30. <p class="">
  31. <a class="font-weight-bold text-muted delete-profile-photo" href="#">{{__('settings.home.delete_profile_photo')}}</a>
  32. </p>
  33. </div>
  34. </div>
  35. <form method="post">
  36. @csrf
  37. <div class="form-group row">
  38. <label for="name" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.name')}}</label>
  39. <div class="col-sm-9">
  40. <input type="text" class="form-control" id="name" name="name" placeholder="{{__('settings.home.your_name')}}" maxlength="30" value="{{Auth::user()->profile->name}}" v-pre>
  41. </div>
  42. </div>
  43. <div class="form-group row">
  44. <label for="website" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.website')}}</label>
  45. <div class="col-sm-9">
  46. <input type="text" class="form-control" id="website" name="website" placeholder="{{__('settings.home.website')}}" value="{{Auth::user()->profile->website}}" v-pre>
  47. </div>
  48. </div>
  49. <div class="form-group row">
  50. <label for="bio" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.bio')}}</label>
  51. <div class="col-sm-9">
  52. <textarea
  53. class="form-control"
  54. id="bio"
  55. name="bio"
  56. placeholder="{{__('settings.home.add_a_bio_here')}}"
  57. rows="2"
  58. data-max-length="{{config('pixelfed.max_bio_length')}}"
  59. maxlength="{{config('pixelfed.max_bio_length')}}"
  60. v-pre>{{strip_tags(Auth::user()->profile->bio)}}</textarea>
  61. <p class="form-text">
  62. <span class="bio-counter float-right small text-muted">0/{{config('pixelfed.max_bio_length')}}</span>
  63. </p>
  64. </div>
  65. </div>
  66. <div class="form-group row">
  67. <label for="language" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.language')}}</label>
  68. <div class="col-sm-9">
  69. <select class="form-control" name="language">
  70. @foreach(App\Util\Localization\Localization::languages() as $lang)
  71. <option value="{{$lang}}" {{(Auth::user()->language ?? 'en') == $lang ? 'selected':''}}>{{locale_get_display_language($lang, 'en')}} - {{locale_get_display_language($lang, $lang)}}</option>
  72. @endforeach
  73. </select>
  74. </div>
  75. </div>
  76. <div class="form-group row">
  77. <label for="pronouns" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.pronouns')}}</label>
  78. <div class="col-sm-9">
  79. <select class="form-control" name="pronouns[]" multiple="" id="pronouns">
  80. <option>{{__('settings.home.select_pronouns')}}</option>
  81. @foreach(\App\Services\PronounService::pronouns() as $val)
  82. <option value="{{$val}}" {{$pronouns && in_array($val, $pronouns) ? 'selected' : ''}}>{{$val}}</option>
  83. @endforeach
  84. </select>
  85. <p class="help-text text-muted small">{{__('settings.home.select_up_to_4_pronouns_that_will_appear_on_etc')}}</p>
  86. </div>
  87. </div>
  88. @if((bool) config_cache('federation.activitypub.enabled'))
  89. <div class="form-group row">
  90. <label for="aliases" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.account_aliases')}}</label>
  91. <div class="col-sm-9" id="aliases">
  92. <a class="font-weight-bold" href="/settings/account/aliases/manage">{{__('settings.home.manage_account_alias')}}</a>
  93. <p class="help-text text-muted small">{{__('settings.home.to_move_from_another_account_to_this_one_first_etc')}}</p>
  94. </div>
  95. </div>
  96. @if((bool) config_cache('federation.migration'))
  97. <div class="form-group row">
  98. <label for="aliases" class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.account_migrate')}}</label>
  99. <div class="col-sm-9" id="aliases">
  100. <a class="font-weight-bold" href="/settings/account/migration/manage">{{__('settings.home.migrate_to_another_account')}}</a>
  101. <p class="help-text text-muted small">{{__('settings.home.to_redirect_this_account_to_a_different_one_etc')}}</p>
  102. </div>
  103. </div>
  104. @endif
  105. @endif
  106. @if(config_cache('pixelfed.enforce_account_limit'))
  107. <div class="pt-3">
  108. <p class="font-weight-bold text-muted text-center">{{__('settings.home.storage_usage')}}</p>
  109. </div>
  110. <div class="form-group row">
  111. <label class="col-sm-3 col-form-label font-weight-bold">{{__('settings.home.storage_used')}}</label>
  112. <div class="col-sm-9">
  113. <div class="progress mt-2">
  114. <div class="progress-bar" role="progressbar" style="width: {{$storage['percentUsed']}}%" aria-valuenow="{{$storage['percentUsed']}}" aria-valuemin="0" aria-valuemax="100"></div>
  115. </div>
  116. <div class="help-text">
  117. <span class="small text-muted">
  118. {{$storage['percentUsed']}}% used
  119. </span>
  120. <span class="small text-muted float-right">
  121. {{$storage['usedPretty']}} / {{$storage['limitPretty']}}
  122. </span>
  123. </div>
  124. </div>
  125. </div>
  126. @endif
  127. <hr>
  128. <div class="form-group row">
  129. <div class="col-12 text-right">
  130. <button type="submit" class="btn btn-primary font-weight-bold py-0 px-5">{{__('settings.submit')}}</button>
  131. </div>
  132. </div>
  133. </form>
  134. @endsection
  135. @push('scripts')
  136. <script type="text/javascript">
  137. $(document).ready(function() {
  138. let el = $('#bio');
  139. let len = el.val().length;
  140. let limit = el.data('max-length');
  141. if(len > 100) {
  142. el.attr('rows', '4');
  143. }
  144. let val = len + ' / ' + limit;
  145. if(len > limit) {
  146. let diff = len - limit;
  147. val = '<span class="text-danger">-' + diff + '</span> / ' + limit;
  148. }
  149. $('.bio-counter').html(val);
  150. $('#bio').on('change keyup paste', function(e) {
  151. let el = $(this);
  152. let len = el.val().length;
  153. let limit = el.data('max-length');
  154. if(len > 100) {
  155. el.attr('rows', '4');
  156. }
  157. let val = len + ' / ' + limit;
  158. if(len > limit) {
  159. let diff = len - limit;
  160. val = '<span class="text-danger">-' + diff + '</span> / ' + limit;
  161. }
  162. $('.bio-counter').html(val);
  163. });
  164. $(document).on('click', '.modal-close', function(e) {
  165. swal.close();
  166. });
  167. $('#maxAvatarSize').text(filesize({{config('pixelfed.max_avatar_size') * 1024}}, {round: 0}));
  168. $('#avatarInput').on('change', function(e) {
  169. var file = document.getElementById('avatarInput').files[0];
  170. var reader = new FileReader();
  171. reader.addEventListener("load", function() {
  172. $('#previewAvatar').html('<img src="' + reader.result + '" class="rounded-circle box-shadow mb-3" width="100%" height="100%"/>');
  173. }, false);
  174. if (file) {
  175. reader.readAsDataURL(file);
  176. }
  177. });
  178. $('.delete-profile-photo').on('click', function(e) {
  179. e.preventDefault();
  180. if(window.confirm('{{__('settings.home.are_you_sure_you_want_to_delete_your_profile_photo')}}') == false) {
  181. return;
  182. }
  183. axios.delete('/settings/avatar').then(res => {
  184. window.location.href = window.location.href;
  185. }).catch(err => {
  186. swal('{{__('settings.error')}}', '{{__('settings.home.an_error_occured_please_try_again_later')}}', 'error');
  187. });
  188. });
  189. })
  190. </script>
  191. @endpush