diff --git a/Gemfile b/Gemfile index e512667f..0a3d0bef 100644 --- a/Gemfile +++ b/Gemfile @@ -26,6 +26,7 @@ gem "bootsnap", '~> 1.9.4' gem 'browser' gem 'c_geohash', require: false gem 'countries' +gem "country_select" gem 'dalli' gem 'date_validator' gem 'diffy', require: false diff --git a/Gemfile.lock b/Gemfile.lock index b7aa3880..6a533f70 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -142,6 +142,8 @@ GEM connection_pool (2.4.1) countries (5.4.0) unaccent (~> 0.3) + country_select (9.0.0) + countries (> 5.0, < 7.0) crack (0.4.5) rexml crass (1.0.6) @@ -603,6 +605,7 @@ DEPENDENCIES cane capybara countries + country_select dalli date_validator diffy diff --git a/app/assets/images/default_avatar.png b/app/assets/images/default_avatar.png new file mode 100644 index 00000000..e9e3031a Binary files /dev/null and b/app/assets/images/default_avatar.png differ diff --git a/app/assets/images/default_avatar.svg b/app/assets/images/default_avatar.svg new file mode 100644 index 00000000..938d925b --- /dev/null +++ b/app/assets/images/default_avatar.svg @@ -0,0 +1,18 @@ + + diff --git a/app/assets/stylesheets/global.scss b/app/assets/stylesheets/global.scss index 7b86f892..1caff0d2 100644 --- a/app/assets/stylesheets/global.scss +++ b/app/assets/stylesheets/global.scss @@ -37,10 +37,18 @@ body > .container { background-color: $white; border: 3px solid $black; } + &.btn-dark { + background-color: $black; + color: $white; + border: 3px solid $white; + } &:hover, &:active, &:focus, &:focus-visible { background-color: $primary !important; color: $black !important; border: 3px solid $black !important; + &.btn-dark { + border: 3px solid $primary !important; + } outline: none !important; box-shadow: none !important; &.btn-danger { @@ -90,6 +98,22 @@ input:checked[type="checkbox"] { background-color: $white !important; } +input[type="file"] { + padding: 0; + &::file-selector-button { + padding: 1rem 1rem 1rem 2rem; + background-color: $black; + color: $white; + border-right: 2px solid $black; + } + &:hover { + &::file-selector-button { + background-color: $primary !important; + color: $black; + } + } +} + .form-label { margin-left: 1rem; } diff --git a/app/assets/stylesheets/user_profile.scss b/app/assets/stylesheets/user_profile.scss index 91c2d874..5d1730f8 100644 --- a/app/assets/stylesheets/user_profile.scss +++ b/app/assets/stylesheets/user_profile.scss @@ -1,6 +1,6 @@ .user-profile-header { h1 { - line-height: 0.6 !important; + line-height: 1.6rem !important; padding-bottom: 0.4rem !important; } } diff --git a/app/controllers/shared_controller_methods.rb b/app/controllers/shared_controller_methods.rb index 9e91b454..c03e2bc5 100644 --- a/app/controllers/shared_controller_methods.rb +++ b/app/controllers/shared_controller_methods.rb @@ -4,6 +4,7 @@ module SharedControllerMethods def self.included(klass) klass.helper_method :current_user + klass.helper_method :authorize? end def authorize?(*args) diff --git a/app/controllers/ui/users_controller.rb b/app/controllers/ui/users_controller.rb index cffaea96..fc25f053 100644 --- a/app/controllers/ui/users_controller.rb +++ b/app/controllers/ui/users_controller.rb @@ -7,7 +7,8 @@ def index end def show - @user = User.find(params[:id]) + @user = User.friendly.find(params[:id]) + @title = I18n.t(:users_show_title, username: @user.username) render "show", layout: "base" end @@ -42,38 +43,65 @@ def create else flash[:alert] = I18n.t(:new_user_failure) render :new, status: :unprocessable_entity - ned end - def delete - @user = User.find(params[:id]) - unless authorize? @user, :destroy? - flash[:alert] = I18n.t(:delete_user_forbidden) - redirect_to current_user ? ui_users_path : login_path - return - end - @title = I18n.t(:delete_user_title) + end + + def edit + @user = User.friendly.find(params[:id]) + @title = I18n.t(:edit_user_title) + end + + def update + @user = User.friendly.find(params[:id]) + @user.update(params.require(:user).permit( + :profile_picture, + :username, + :email, + :password, + :password_confirmation, + :city, + :country_code, + :url + )) + if @user.valid? + @user.save + flash[:success] = I18n.t(:update_user_success) + redirect_to ui_user_path(@user.username) + else + flash[:alert] = I18n.t(:update_user_failure) + redirect_to edit_ui_user_path(@user.username) end + end - def destroy - @user = User.find(params[:id]) - unless authorize? @user - flash[:alert] = I18n.t(:delete_user_forbidden) - redirect_to current_user ? ui_users_path : login_path - return - end - if @user.username != params[:username] - flash[:alert] = I18n.t(:delete_user_wrong_username) - redirect_to delete_ui_user_path(@user.id) - return - end - @user.archive! - session[:user_id] = nil - redirect_to post_delete_ui_users_path + def delete + @user = User.friendly.find(params[:id]) + unless authorize? @user, :destroy? + flash[:alert] = I18n.t(:delete_user_forbidden) + redirect_to current_user ? ui_users_path : login_path + return end + @title = I18n.t(:delete_user_title) + end - def post_delete - @title = I18n.t(:post_delete_user_title) + def destroy + @user = User.friendly.find(params[:id]) + unless authorize? @user + flash[:alert] = I18n.t(:delete_user_forbidden) + redirect_to current_user ? ui_users_path : login_path + return + end + if @user.username != params[:username] + flash[:alert] = I18n.t(:delete_user_wrong_username) + redirect_to delete_ui_user_path(@user.username) + return end + @user.archive! + session[:user_id] = nil + redirect_to post_delete_ui_users_path + end + + def post_delete + @title = I18n.t(:post_delete_user_title) end end end diff --git a/app/views/layouts/_base.html.erb b/app/views/layouts/_base.html.erb new file mode 100644 index 00000000..c1cdd01c --- /dev/null +++ b/app/views/layouts/_base.html.erb @@ -0,0 +1,17 @@ + + +
+