Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

誕生日に月日のみ設定したい #10005

Open
wh1tecat-nya opened this issue Feb 20, 2023 · 39 comments
Open

誕生日に月日のみ設定したい #10005

wh1tecat-nya opened this issue Feb 20, 2023 · 39 comments
Labels
✨Feature This adds/improves/enhances a feature

Comments

@wh1tecat-nya
Copy link

Summary

年齢は公開してないみたいな時用の設定。
一応0001年とかにすることは出来るけど、2022歳とかになるのに違和感を感じるので・・・

@wh1tecat-nya wh1tecat-nya added the ✨Feature This adds/improves/enhances a feature label Feb 20, 2023
@GrapeApple0
Copy link
Contributor

横から失礼します。0000年とか9999年をマジックナンバーにしてその時だけ消すっていう実装がいいのかなって思ったり
screenshot 563

@tar-bin
Copy link
Contributor

tar-bin commented Mar 8, 2023

誕生日の年を隠す機能はほしいです。あと一度設定すると消せないらしいので、消せるようにもしてもらえると・・・

@Sayamame-beans
Copy link
Member

個人的には、マジックナンバーにするよりは個別の設定としてしっかり持っているべきなような気がします…?

@kakkokari-gtyih
Copy link
Contributor

birthday: {
    year: number | null;
    month: number | null;
    date: number | null;
}

みたいな感じで保持するようにする…?

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Dec 28, 2023

birthday: {
    year: number | null;
    month: number | null;
    date: number | null;
}

みたいな感じで保持するようにする…?

オブジェクトにすると他の実装が崩れる(indexが効かなくなる)ので、年をxxxxにしたら非公開とかでもいいかもしれない よくないな

@1STEP621
Copy link
Contributor

birthdayはそのままにisAgeHidden: boolean;のような設定を生やして、isAgeHiddenがtrueのときはbirthdayの年を9999という扱いにする
というのがサードパーティ製クライアントの対応なども考えたときに最適ではと思いましたが、どうでしょう?

@syuilo
Copy link
Member

syuilo commented Dec 28, 2023

横から失礼します。0000年とか9999年をマジックナンバーにしてその時だけ消すっていう実装がいいのかなって思ったり screenshot 563

これで良いんじゃね

@1STEP621
Copy link
Contributor

1STEP621 commented Jan 3, 2024

Screenshot_20240103-102247_Chrome.png
スマホの<input type="date">はカレンダーUIなので、ここから9999年を選ばせるのは微妙という問題がある

@syuilo
Copy link
Member

syuilo commented Jan 3, 2024

UI上は年非表示スイッチでも付ければ良いんじゃないかしら

@nryeouo
Copy link
Contributor

nryeouo commented Jan 3, 2024

カレンダーUIなので

左上の「2024年」の部分を押すと、年選択画面が出てくるはず

@1STEP621
Copy link
Contributor

1STEP621 commented Jan 3, 2024

左上の「2024年」の部分を押すと、年選択画面が出てくるはず

それでもスクロールが大変ではある気がする

@1STEP621
Copy link
Contributor

1STEP621 commented Jan 3, 2024

Screencast.from.2024.01.03.12.26.18.webm

年非表示スイッチ

つけました(本当はmanualSaveにしたかったけど良い実装方法がわからず...)

@kotonefami
Copy link

年非表示スイッチをONにするとそのinputがmin="0001-01-01" max="0001-12-31"とかになるみたいな挙動だと未設定の時と被らなくていいかなぁと思いました
なお0000-01-01はなぜか反応しませんでした
image

@1STEP621
Copy link
Contributor

1STEP621 commented Jan 3, 2024

とりあえずONだとmin="9999-01-01" max="9999-12-31"になるように実装してみました(0001年を選んだのは何か意図があってですか?)

@kotonefami
Copy link

おま環かもしれませんが、min="0000-01-01" max="0000-12-31"min="9999-01-01" max="9999-12-31"では制限が適用されませんでした。Win11のChrome120です。
あと、MDNドキュメントではdisabledされたように灰色になるっぽいですが、minとmaxを動的に設定してもvalueが変わることはないっぽい?です

@1STEP621
Copy link
Contributor

1STEP621 commented Jan 3, 2024

min="0000-01-01" max="0000-12-31"min="9999-01-01" max="9999-12-31"では制限が適用されませんでした。

これは再現できなかった(Firefox 121.0 / Ubuntu 22.04 LTS)んですが、iOS / Safariだと<input type="date">は4001年以降の日付は設定できない仕様らしく、9999年内で日付を変えるとクラッシュする(!?)そうなので、確かに0001年のほうが良いかもしれません(<input type="date">自体ブラウザ間の差がひどいのでやめるべきかも)
https://misskey.systems/notes/9o0vuhoqba

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Jan 3, 2024

birthdayはそのままにisAgeHidden: boolean;のような設定を生やして、isAgeHiddenがtrueのときはbirthdayの年を9999という扱いにする というのがサードパーティ製クライアントの対応なども考えたときに最適ではと思いましたが、どうでしょう?

バグ等の考慮のこと考えたらこれのほうがいいかもしれないわね(年齢を隠すチェックを入れるとフォームが月日だけを指定するものに変わり、内部的に 0001- or 9999- などを付加した上で保存する+その上でisAgeHiddenのプロパティも明示的に保存とか)

@noellabo
Copy link
Contributor

noellabo commented Jan 3, 2024

参考に。

FedibirdではMisskeyから連合してくるvcard:bdayを受け取って内部で年月日birthdayで保持しているのと別に、年、月、日をバラでも保持しています。年月日が揃っているときはbirthdayが有効な値に、何か欠けている場合はnullになり、年齢判断はそのbirthdayだけみるようにしています。年だけ表示以外に『6月生まれ』とか『12日生まれ』だけにすることも可能になっていて、表示も対応しています。

other_settings: {
  location: "埼玉県",
  birthday: null,
  birth_day: 12,
  birth_year: null,
  birth_month: 6,
}

@samunohito
Copy link
Member

0000や9999に特別な意味を持たせず、user_profileなどに年齢表示のフラグを持たせて愚直に制御したほうが良いように思えます。
みるかぎり、プラットフォームの穴埋めをする実装をしなければならないようですし…トリッキーな実装が増えると後が大変なので、素直に表現できるところはシンプルに解決したほうが今後も楽になるだろうと考えます。

@syuilo
Copy link
Member

syuilo commented Jan 4, 2024

0000で済ました方がシンプルそう

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Jan 4, 2024

0000で済ました方がシンプルそう

0000はinputタグで入力できないみたい。あと0000年は年号として不正な値になるらしい?
#12821 (comment) #12821 (comment)

@samunohito
Copy link
Member

0000で済ました方が

それが難しそうなので、フロントの実装を力とパワーで解決するよりは愚直にやったほうがいいのではないかというご提案です

@syuilo
Copy link
Member

syuilo commented Jan 4, 2024

inputにこだわる必要はないわね

@taiyme
Copy link
Contributor

taiyme commented Jan 4, 2024

日付入力用のコンポーネント作って柔軟に入力できるようにした方がいいんじゃないかな

@syuilo
Copy link
Member

syuilo commented Jan 4, 2024

それが難しそう

全くそんなことはないと考えてる

@syuilo
Copy link
Member

syuilo commented Jan 4, 2024

UI上どう表現するかと内部的にどう持つかは全く別

@kakkokari-gtyih
Copy link
Contributor

日付入力用のコンポーネント作って柔軟に入力できるようにした方がいいんじゃないかな

それはそれでバンドルがデカくなりそうで悩ましい

@kakkokari-gtyih
Copy link
Contributor

UI上どう表現するかと内部的にどう持つかは全く別

たしかにhideAgeをもたせる場合でもbirthdayはyyyy-mm-ddとして表示しないとおかしくなりそうなのでどうにかしないと

@1STEP621
Copy link
Contributor

1STEP621 commented Jan 4, 2024

ちょっと前提と案をまとめてみました

  • birthdayyyyy-mm-ddを保ちたい
  • 年齢を隠した場合はAPIレスポンス上でもyyyy部分が意味のない数字になってほしい

  • 案1: いっそyyyyがマジックナンバーだったら年齢を隠したものとして扱ってしまう
    • (UI) スイッチでマジックナンバーに切り替える機能なども提供する
      • (UI) このスイッチがONだと年入力が消えて日付のみになると便利
    • (UI) <input type="date">にこだわると実装がややこしくなりそう
  • 案2: アカウント情報に別でisAgeHidden: boolean;を生やして、birthdayの方もisAgeHiddenに応じてバックエンドから9999-とか0000-とかに変化させる
    • (UI) 案1と同様、isAgeHiddenがtrueだと年入力が消えて日付のみになると便利
  • 案3: 年齢情報が欠けた場合はbirthdayをnullにして、birth_month/birth_dayなどにフォールバックする
    • 今日誕生日の人ウィジェットなどの改修が必要になるかも

@KisaragiEffective
Copy link
Sponsor Member

KisaragiEffective commented Jan 11, 2024

0年にした方が良いのではないかという意見を見かけたので参照用に書いておきますが、西暦0年はグレゴリオ暦でもその前のユリウス暦の妥当な年数ではありません。これはAPI経由で日付をプログラミング言語の暦1として解釈しようとした時に不都合になり得ます。まだ不都合のあるケースは発見できていませんが、わざわざリスキーな選択肢を取る理由はないでしょう。

Originally posted by @KisaragiEffective in #12821 (comment)

補足: 上記のコメントはHTTP APIの話です

Footnotes

  1. 世の中には様々な暦がありますが、ここでは1582年以前の日付についてのみ振る舞いが異なるグレゴリオ暦の変種を考えます: A) グレゴリオ暦として遡る B) ユリウス暦として解釈する

@syuilo
Copy link
Member

syuilo commented Jan 11, 2024

まあ通常あり得ない値だからこそ特別な意味があるというのが分かりやすくなる

@u1-liquid
Copy link
Sponsor Contributor

年齢を隠すみたいなチェックボックスをはやしてチェックいれたらそもそも年度の入力欄を隠してapi上には0000で送るかそもそも年度を送らないようにするといいかも(backend側でyyyy-MM-ddとMM-ddの両方を対応させる)
dbにどう表現するかについては個人的には誕生日でユーザーを探すみたいな機能を実装しちゃっている以上ある程度インデックスの効く形だと嬉しいかもしれません(sqlのdateタイプか、そもそものデータをintegerタイプ三つに分けるなど)

@KisaragiEffective
Copy link
Sponsor Member

西暦1年に生まれた存命人物がいるとは非常に考えにくいことと、西暦1年の前年が紀元前1年であることを考えると、マジックナンバー案で「西暦0年」を使う案は同意できません。

@u1-liquid
Copy link
Sponsor Contributor

西暦1年の前年が紀元前1年であることを考えると

実在しない年ということで0年を使うのは結構都合の良いことだと思いますが何が問題何でしょう
例えばもし歴史上の人物のなりきりアカウントなどが作りたい場合でも、0年に産まれた人は存在しないので何もマジックナンバーの仕様を気にすることなくプロフィールを設定することができるでしょう。
個人的にはむしろ上記の理由で「1年」や「9999年」はユーザーのやりたいことの邪魔になる可能性があると思っています。

@Sayamame-beans
Copy link
Member

案2のケースでは、隠すかどうかを確認出来るプロパティがある訳なので、yyyyが0でも1でも9999でも問題ないのではないかと思います。(であれば0にする必要性は弱くなります)

案1のケースでは、ユーザーが(通常)設定可能な値と区別する事を考える場合には、0を取らざるを得ないという感じがあります。(ただ、サードパーティクライアント等で例外が出るようになる可能性があると考えると、あまり望ましくないような気はします)

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Jan 12, 2024

  • 案2のように年齢を隠すプロパティを作成して
  • dbに入る生データではそのまま年を記録して(年の指定がない場合は0000などで記録)
  • hideAge: trueならユーザーのpack時に自動で年の部分を0000などにするのが良い気がする(もちろん、hideAge自体もMiUserに入れる)

@syuilo
Copy link
Member

syuilo commented Jan 12, 2024

DB側に追加のプロパティは要らないと思う

@kakkokari-gtyih
Copy link
Contributor

kakkokari-gtyih commented Jan 12, 2024

実在しない年ということで0年を使う

なら確かにプロパティをつける必要ないか

@u1-liquid
Copy link
Sponsor Contributor

birthdayの保存のフォーマットをMM-DD(-YYYY)?にすると色々都合がいい気がしますね…

今日(もしくは明日)誕生日のユーザー検索も先頭からのクエリーになるのでbtreeのインデックスでもwhere birthday like :monthday || '%'でインデックスが効いて文字列をごちゃごちゃしなくても一発で出てくるようになりますし、年を見せたく無ければAPIには送らない&DBでも余計な値を足さずに保存できますし…
(年の値があるかないかは-でsplitすると一発でわかる)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨Feature This adds/improves/enhances a feature
Projects
None yet
Development

Successfully merging a pull request may close this issue.