dirty state

This commit is contained in:
Henry Jameson 2025-08-05 14:58:53 +03:00
commit bc2964c327
3 changed files with 52 additions and 28 deletions

View file

@ -1,4 +1,5 @@
import merge from 'lodash/merge' import merge from 'lodash/merge'
import isEqual from 'lodash/isEqual'
import unescape from 'lodash/unescape' import unescape from 'lodash/unescape'
import ColorInput from 'src/components/color_input/color_input.vue' import ColorInput from 'src/components/color_input/color_input.vue'
@ -116,6 +117,7 @@ export default {
newShowRole: user.show_role, newShowRole: user.show_role,
newFields: user.fields?.map(field => ({ name: field.name, value: field.value })), newFields: user.fields?.map(field => ({ name: field.name, value: field.value })),
editingFields: false, editingFields: false,
} }
}, },
@ -123,6 +125,21 @@ export default {
this.$store.dispatch('fetchUserRelationship', this.user.id) this.$store.dispatch('fetchUserRelationship', this.user.id)
}, },
computed: { computed: {
somethingToSave () {
if (this.newName !== this.user.name_unescaped) return true
if (this.newBio !== unescape(this.user.description)) return true
if (this.newAvatar !== null) return true
if (this.newBanner !== null) return true
if (this.newActorType !== this.user.actor_type) return true
if (this.newBirthday !== this.user.birthday) return true
if (this.newShowBirthday !== this.user.show_birthday) return true
if (this.newShowRole !== this.user.show_role) return true
if (!isEqual(
this.newFields,
this.user.fields?.map(field => ({ name: field.name, value: field.value }))
)) return true
return false
},
groupActorAvailable () { groupActorAvailable () {
return this.$store.state.instance.groupActorAvailable return this.$store.state.instance.groupActorAvailable
}, },

View file

@ -153,6 +153,11 @@
border-style: solid; border-style: solid;
border-color: var(--border); border-color: var(--border);
} }
.bottom-buttons {
display: flex;
gap: 0.5em;
}
} }
.user-info { .user-info {

View file

@ -293,34 +293,6 @@
:user="user" :user="user"
/> />
</template> </template>
<button
v-if="editable"
:disabled="somethingToSave"
class="btn button-default reset-profile-button"
@click="resetState"
>
{{ $t('settings.reset') }}
<FAIcon
fixed-width
class="icon"
icon="clock-rotate-left"
:title="$t('user_card.edit_profile')"
/>
</button>
<button
v-if="editable"
:disabled="somethingToSave"
class="btn button-default save-profile-button"
@click="updateProfile"
>
{{ $t('settings.save') }}
<FAIcon
fixed-width
class="icon"
icon="save"
:title="$t('user_card.edit_profile')"
/>
</button>
</div> </div>
<div <div
v-if="!loggedIn && user.is_local" v-if="!loggedIn && user.is_local"
@ -645,6 +617,36 @@
</div> </div>
</label> </label>
</p> </p>
<div class="bottom-buttons">
<button
v-if="editable"
:disabled="!somethingToSave"
class="btn button-default reset-profile-button"
@click="resetState"
>
{{ $t('settings.reset') }}
<FAIcon
fixed-width
class="icon"
icon="clock-rotate-left"
:title="$t('user_card.edit_profile')"
/>
</button>
<button
v-if="editable"
:disabled="!somethingToSave"
class="btn button-default save-profile-button"
@click="updateProfile"
>
{{ $t('settings.save') }}
<FAIcon
fixed-width
class="icon"
icon="save"
:title="$t('user_card.edit_profile')"
/>
</button>
</div>
</template> </template>
<teleport to="#modal"> <teleport to="#modal">
<UserTimedFilterModal <UserTimedFilterModal