From b85e3b06cf53ed4c5e5f161ebeabc4f6b473d969 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:39:39 -0300 Subject: [PATCH 1/2] chore(appinfo): align donation links with LibreSign sponsorship Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- appinfo/info.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/appinfo/info.xml b/appinfo/info.xml index 28068aa..71099c3 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -19,9 +19,9 @@ Each field can be governed with edit and visibility rules so teams can combine s ## Donation -Developed with ❤️ by [LibreCode](https://librecode.coop). Help us transform people and businesses through cooperativism. +Developed with ❤️ by [LibreCode](https://librecode.coop). Ongoing maintenance, bug fixes, and long-term sustainability depend on community support. -* [Donate with GitHub Sponsor: ![Donate using GitHub Sponsor](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86)](https://github.com/sponsors/libresign) +* [Sponsor LibreSign on GitHub (monthly recurring support is especially welcome): ![Donate using GitHub Sponsor](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86)](https://github.com/sponsors/LibreSign) ]]> 0.0.1-dev agpl @@ -39,7 +39,8 @@ Developed with ❤️ by [LibreCode](https://librecode.coop). Help us transform https://raw.githubusercontent.com/LibreCodeCoop/profile_fields/main/img/screenshots/user-management-dialog.png https://raw.githubusercontent.com/LibreCodeCoop/profile_fields/main/img/screenshots/personal-settings.png https://raw.githubusercontent.com/LibreCodeCoop/profile_fields/main/img/screenshots/workflow-notify-admins.png - https://github.com/sponsors/LibreSign + https://github.com/sponsors/LibreSign + https://buy.stripe.com/eVqfZibhx8QO3LseWc2kw00 From 9e24d1d8fa26fa3a20efbc1c89d8782973806d6e Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Thu, 19 Mar 2026 12:39:40 -0300 Subject: [PATCH 2/2] feat(admin-settings): add clear sponsor banner copy and CTA behavior Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- src/views/AdminSettings.vue | 72 +++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/views/AdminSettings.vue b/src/views/AdminSettings.vue index c5dce41..a83c93a 100644 --- a/src/views/AdminSettings.vue +++ b/src/views/AdminSettings.vue @@ -22,6 +22,21 @@ SPDX-License-Identifier: AGPL-3.0-or-later {{ errorMessage }} + +
+

+ This app is open source and released under the AGPL license. + To keep development and maintenance active, please + sponsor LibreSign on GitHub Sponsors + If possible, choose a monthly sponsorship. +

+
+ + Not now + +
+
+
([]) const isLoading = ref(true) const isSaving = ref(false) const errorMessage = ref('') +const supportBannerStorageKey = 'profile_fields_support_banner_dismissed' +const showSupportBanner = ref(true) const selectedId = ref(null) const justSavedId = ref(null) let justSavedTimeout: ReturnType | null = null const successMessage = ref('') let successMessageTimeout: ReturnType | null = null +const dismissSupportBanner = () => { + showSupportBanner.value = false + try { + window.localStorage.setItem(supportBannerStorageKey, '1') + } catch { + // Ignore storage errors and keep only in-memory dismissal. + } +} + const setSuccessMessage = (message: string) => { if (successMessageTimeout !== null) { clearTimeout(successMessageTimeout) @@ -1002,6 +1028,11 @@ watch(() => form.type, (newType: FieldType) => { onMounted(() => { loadDefinitions() + try { + showSupportBanner.value = window.localStorage.getItem(supportBannerStorageKey) !== '1' + } catch { + showSupportBanner.value = true + } compactLayoutMediaQuery = window.matchMedia('(max-width: 1024px)') updateCompactLayout(compactLayoutMediaQuery.matches) compactLayoutMediaQuery.addEventListener('change', handleCompactLayoutChange) @@ -1081,6 +1112,35 @@ onBeforeUnmount(() => { gap: 20px; } + &__support-banner { + display: grid; + grid-template-columns: minmax(0, 1fr); + gap: 10px; + width: 100%; + + p { + margin: 0; + overflow-wrap: anywhere; + line-height: 1.5; + } + + a { + font-weight: 600; + overflow-wrap: anywhere; + } + } + + &__support-banner-actions { + display: flex; + justify-content: flex-end; + width: 100%; + } + + &__support-banner-action { + flex: 0 0 auto; + white-space: nowrap; + } + &__field-helper { margin: 8px 0 0; color: var(--color-text-maxcontrast); @@ -1601,6 +1661,18 @@ onBeforeUnmount(() => { width: 100%; } + &__support-banner { + gap: 8px; + + :deep(.button-vue) { + max-width: 100%; + } + } + + &__support-banner-actions { + justify-content: flex-start; + } + &__submit-row, &__editor-actions { flex-wrap: wrap;