From df0855a91b596f3bd2d4d4c9bced7a30b201ed1b Mon Sep 17 00:00:00 2001 From: chr Date: Mon, 12 Nov 2018 20:30:47 -0800 Subject: [PATCH] Bio length -> 413 characters Increase the cybre.space profile bio text length limit to 413 characters. Also modifies the account settings page to automatically resize the textbox to the size of the contained text, so that it's easier to type longer bios. --- app/javascript/packs/public.js | 35 +++++++++++++++++++++- app/models/account.rb | 13 ++++---- app/views/settings/profiles/show.html.haml | 2 +- spec/models/account_spec.rb | 8 ++--- 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js index 3b02b7c39..2aca2d160 100644 --- a/app/javascript/packs/public.js +++ b/app/javascript/packs/public.js @@ -1,4 +1,4 @@ -import loadPolyfills from '../mastodon/load_polyfills'; + import loadPolyfills from '../mastodon/load_polyfills'; import ready from '../mastodon/ready'; import { start } from '../mastodon/common'; @@ -17,6 +17,12 @@ window.addEventListener('message', e => { id: data.id, height: document.getElementsByTagName('html')[0].scrollHeight, }, '*'); + + if (document.fonts && document.fonts.ready) { + document.fonts.ready.then(sizeBioText); + } else { + sizeBioText(); + } }); }); @@ -93,6 +99,17 @@ function main() { detailedStatuses[0].scrollIntoView(); history.replace(location.pathname, { ...location.state, scrolledToDetailedStatus: true }); } + + [].forEach.call(document.querySelectorAll('[data-component="Card"]'), (content) => { + const props = JSON.parse(content.getAttribute('data-props')); + ReactDOM.render(, content); + }); + + if (document.fonts && document.fonts.ready) { + document.fonts.ready.then(sizeBioText); + } else { + sizeBioText(); + } }); delegate(document, '.webapp-btn', 'click', ({ target, button }) => { @@ -188,6 +205,22 @@ function main() { console.error(err); } }); + + delegate(document, '#account_note', 'input', sizeBioText); + + function sizeBioText() { + const noteCounter = document.querySelector('.note-counter'); + const bioTextArea = document.querySelector('#account_note'); + + if (noteCounter) { + noteCounter.textContent = 413 - length(bioTextArea.value); + } + + if (bioTextArea) { + bioTextArea.style.height = 'auto'; + bioTextArea.style.height = (bioTextArea.scrollHeight+3) + 'px'; + } + } } loadPolyfills().then(main).catch(error => { diff --git a/app/models/account.rb b/app/models/account.rb index 44963f3e6..7afc33014 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -75,7 +75,8 @@ class Account < ApplicationRecord validates_with UniqueUsernameValidator, if: -> { local? && will_save_change_to_username? } validates_with UnreservedUsernameValidator, if: -> { local? && will_save_change_to_username? } validates :display_name, length: { maximum: 30 }, if: -> { local? && will_save_change_to_display_name? } - validates :note, length: { maximum: 160 }, if: -> { local? && will_save_change_to_note? } + validates :note, length: { maximum: 413 }, if: -> { local? && will_save_change_to_note? } + validate :note_has_eight_newlines?, if: -> { local? && will_save_change_to_note? } validates :fields, length: { maximum: 4 }, if: -> { local? && will_save_change_to_fields? } # Timelines @@ -279,10 +280,8 @@ class Account < ApplicationRecord def save_with_optional_media! save! rescue ActiveRecord::RecordInvalid - self.avatar = nil - self.header = nil - self[:avatar_remote_url] = '' - self[:header_remote_url] = '' + self.avatar = nil if errors[:avatar].present? + self.header = nil if errors[:header].present? save! end @@ -306,6 +305,10 @@ class Account < ApplicationRecord shared_inbox_url.presence || inbox_url end + def note_has_eight_newlines? + errors.add(:note, 'Bio can\'t have more then 8 newlines') unless note.count("\n") <= 8 + end + class Field < ActiveModelSerializers::Model attributes :name, :value, :verified_at, :account, :errors diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml index f5c50144b..1b2dee19e 100644 --- a/app/views/settings/profiles/show.html.haml +++ b/app/views/settings/profiles/show.html.haml @@ -7,7 +7,7 @@ .fields-row .fields-row__column.fields-group.fields-row__column-6 = f.input :display_name, wrapper: :with_label, input_html: { maxlength: 30 }, hint: false - = f.input :note, wrapper: :with_label, input_html: { maxlength: 160 }, hint: false + = f.input :note, wrapper: :with_label, input_html: { maxlength: 413 }, hint: false .fields-row .fields-row__column.fields-row__column-6 diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 60d13d32e..18bcd3e0b 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -596,8 +596,8 @@ RSpec.describe Account, type: :model do expect(account).to model_have_error_on_field(:display_name) end - it 'is invalid if the note is longer than 160 characters' do - account = Fabricate.build(:account, note: Faker::Lorem.characters(161)) + it 'is invalid if the note is longer than 413 characters' do + account = Fabricate.build(:account, note: Faker::Lorem.characters(414)) account.valid? expect(account).to model_have_error_on_field(:note) end @@ -636,8 +636,8 @@ RSpec.describe Account, type: :model do expect(account).not_to model_have_error_on_field(:display_name) end - it 'is valid even if the note is longer than 160 characters' do - account = Fabricate.build(:account, domain: 'domain', note: Faker::Lorem.characters(161)) + it 'is valid even if the note is longer than 413 characters' do + account = Fabricate.build(:account, domain: 'domain', note: Faker::Lorem.characters(414)) account.valid? expect(account).not_to model_have_error_on_field(:note) end