From de709f04a2c717c27f17bdf1c6da83541611ab59 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 17 Jul 2026 17:05:43 +0200 Subject: [PATCH 01/16] api: add policy endpoints --- src/backend/api.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/backend/api.js b/src/backend/api.js index c51845ed..d357d001 100644 --- a/src/backend/api.js +++ b/src/backend/api.js @@ -98,6 +98,19 @@ export const wikiDiscovery = async ({ sort, direction, active, currentPage, resu })).data } +export const policiesCurrent = async () => { + return (await axios.get('/v1/policies/current')); +} + +export const policyByDate = async ({ policyType, activeFrom }) => { + return (await axios.get('/v1/policies/{policy_type}/by_active_from/{active_from}', { + params: { + policy_type: policyType, + active_from: activeFrom, + } + })); +} + export const importEntities = async ({ wikiId, entityIds = [ From 33a542f35067d93a4a30cb59906b671993870695 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 17 Jul 2026 17:06:10 +0200 Subject: [PATCH 02/16] adjust router --- src/router/index.js | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/router/index.js b/src/router/index.js index dcaaba2c..7771ba49 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -14,13 +14,13 @@ import ResetPassword from '@/components/Pages/ResetPassword' import EmailVerification from '@/components/Pages/EmailVerification' import CreateWiki from '@/components/Pages/CreateWiki' import TabSettings from '@/components/Pages/ManageWiki/TabSettings' -import TermsOfUse from '@/components/Pages/TermsOfUse/Current.vue' +import TermsOfUse from '@/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue' +import TermsOfUseRenderer from '@/components/Pages/TermsOfUse/TermsOfUseRenderer.vue' import Privacy from '@/components/Pages/Privacy/Privacy' import User from '@/components/Pages/User' import Discovery from '@/components/Pages/Discovery/Discovery' import Complaint from '@/components/Pages/Complaint.vue' import HostingPolicy from '@/components/Pages/HostingPolicy.vue' -import TermsOfUseUpcoming from '@/components/Pages/TermsOfUse/Upcoming.vue' import DsaInfo from '@/components/Pages/DsaInfo/DsaInfo' Vue.use(Router) @@ -74,12 +74,12 @@ const router = new Router({ { path: '/terms-of-use', name: 'TermsOfUse', - component: TermsOfUse, + component: TermsOfUseRenderer, }, { - path: '/terms-of-use/upcoming', - name: 'TermsOfUseUpcoming', - component: TermsOfUseUpcoming, + path: '/terms-of-use/:version', + name: 'TermsOfUseRenderer', + component: TermsOfUseRenderer, }, { path: '/hosting-policy/pilot', @@ -184,6 +184,7 @@ router.beforeEach(async (to, from, next) => { }) router.afterEach(({ title, name }) => { + if (typeof name !== 'undefined') { if (typeof title === 'undefined') { // split pascal-case into separate words title = [...name.matchAll(/([A-Z]+[^A-Z]*)/g)] @@ -192,6 +193,7 @@ router.afterEach(({ title, name }) => { } document.title = `wikibase.cloud ${title.length ? ' - ' + title : ''}` + } }) export default router From 61ab8826467c0a8bb926e84f82b4f3cc81f4f5a7 Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 17 Jul 2026 17:06:27 +0200 Subject: [PATCH 03/16] WIP dynamic ToU render --- .../TermsOfUse/TermsOfUseNavigationPanel.vue | 1 + .../Pages/TermsOfUse/TermsOfUseRenderer.vue | 88 +++++++++++++++++++ .../2022-01-01.vue} | 2 +- .../upcoming.vue} | 2 +- 4 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue rename src/components/Pages/TermsOfUse/{Current.vue => terms-of-use/2022-01-01.vue} (99%) rename src/components/Pages/TermsOfUse/{Upcoming.vue => terms-of-use/upcoming.vue} (99%) diff --git a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue index 7ed9f406..061a6f43 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue @@ -11,6 +11,7 @@ export default { PolicyNavigationPanel, }, data: () => ({ + // TODO update with info from API termsOfUseLinks: [ { title: 'Upcoming Version', routePath: '/terms-of-use/upcoming' }, { title: '11 April 2022 (current)', routePath: '/terms-of-use' }, diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue new file mode 100644 index 00000000..bde52c34 --- /dev/null +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/Pages/TermsOfUse/Current.vue b/src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue similarity index 99% rename from src/components/Pages/TermsOfUse/Current.vue rename to src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue index c34473e0..c04501ee 100644 --- a/src/components/Pages/TermsOfUse/Current.vue +++ b/src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue @@ -1292,7 +1292,7 @@ + + diff --git a/src/components/Pages/TermsOfUse/Upcoming.vue b/src/components/Pages/TermsOfUse/Upcoming.vue new file mode 100644 index 00000000..4094c294 --- /dev/null +++ b/src/components/Pages/TermsOfUse/Upcoming.vue @@ -0,0 +1,1164 @@ + + + + + diff --git a/src/router/index.js b/src/router/index.js index f32bd9c4..b591cca4 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -14,6 +14,8 @@ import ResetPassword from '@/components/Pages/ResetPassword' import EmailVerification from '@/components/Pages/EmailVerification' import CreateWiki from '@/components/Pages/CreateWiki' import TabSettings from '@/components/Pages/ManageWiki/TabSettings' +import TermsOfUse from '@/components/Pages/TermsOfUse/Current.vue' +import TermsOfUseUpcoming from '@/components/Pages/TermsOfUse/Upcoming.vue' import TermsOfUseRenderer from '@/components/Pages/TermsOfUse/TermsOfUseRenderer.vue' import Privacy from '@/components/Pages/Privacy/Privacy' import User from '@/components/Pages/User' @@ -70,10 +72,17 @@ const router = new Router({ name: 'ResetPassword', component: ResetPassword, }, + // this should be handled by TermsOfUseRenderer { path: '/terms-of-use', name: 'TermsOfUse', - component: TermsOfUseRenderer, + component: TermsOfUse, + }, + // this should be handled by TermsOfUseRenderer + { + path: '/terms-of-use/upcoming', + name: 'TermsOfUseUpcoming', + component: TermsOfUseUpcoming, }, { path: '/terms-of-use/:version', From d674ae2c6a094c083a0d455c3c468a3cede9476c Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 21 Jul 2026 11:49:21 +0200 Subject: [PATCH 10/16] move navigation panel --- src/backend/api.js | 3 - .../Pages/TermsOfUse/TermsOfUseRenderer.vue | 47 +- .../TermsOfUse/terms-of-use/2022-01-01.vue | 2578 ++++++++--------- 3 files changed, 1303 insertions(+), 1325 deletions(-) diff --git a/src/backend/api.js b/src/backend/api.js index 801b04e6..d424640f 100644 --- a/src/backend/api.js +++ b/src/backend/api.js @@ -103,9 +103,6 @@ export const policiesCurrent = async () => { } export const policyByDate = async ( { policyType, activeFrom }) => { - console.info(policyType); - console.info(activeFrom); - return (await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`)).data; } diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index aed16d75..13325fef 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -1,48 +1,44 @@ - + diff --git a/src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue b/src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue index c04501ee..aa61a3b9 100644 --- a/src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue +++ b/src/components/Pages/TermsOfUse/terms-of-use/2022-01-01.vue @@ -1,1304 +1,1289 @@ @@ -1307,13 +1292,16 @@ export default { h5 { margin-bottom: 16px; } + .italic { font-style: italic; } + .first-column { text-align: center; min-width: 60px; } + .processing { padding: 20px; } From 5d3370c396e0f2937f6c1ae3d3869d9392135cc3 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 21 Jul 2026 12:44:20 +0200 Subject: [PATCH 11/16] delete new upcoming tou for now --- .../Pages/TermsOfUse/TermsOfUseRenderer.vue | 1 - .../TermsOfUse/terms-of-use/upcoming.vue | 1164 ----------------- 2 files changed, 1165 deletions(-) delete mode 100644 src/components/Pages/TermsOfUse/terms-of-use/upcoming.vue diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index 13325fef..2b94202d 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -19,7 +19,6 @@ import TermsOfUseNavigationPanel from './TermsOfUseNavigationPanel.vue' export const versions = { "2022-01-01": () => ({ component: import('./terms-of-use/2022-01-01.vue') }), - upcoming: () => ({ component: import('./terms-of-use/upcoming.vue') }), } export default { diff --git a/src/components/Pages/TermsOfUse/terms-of-use/upcoming.vue b/src/components/Pages/TermsOfUse/terms-of-use/upcoming.vue deleted file mode 100644 index 1d5d387d..00000000 --- a/src/components/Pages/TermsOfUse/terms-of-use/upcoming.vue +++ /dev/null @@ -1,1164 +0,0 @@ - - - - - From dab8565b20984026fed73f85e24776c2ebceec66 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 21 Jul 2026 12:45:11 +0200 Subject: [PATCH 12/16] policynavigationpanel uses link number not route --- .../Pages/Components/PolicyNavigationPanel.vue | 6 +++--- .../TermsOfUse/TermsOfUseNavigationPanel.vue | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/components/Pages/Components/PolicyNavigationPanel.vue b/src/components/Pages/Components/PolicyNavigationPanel.vue index adbdfb15..1557d78c 100644 --- a/src/components/Pages/Components/PolicyNavigationPanel.vue +++ b/src/components/Pages/Components/PolicyNavigationPanel.vue @@ -5,9 +5,9 @@ - + - + {{ link.title }} @@ -29,7 +29,7 @@ export default { name: 'NavigationPanel', props: { title: String, - currentPath: String, + currentLink: Number, links: Array, }, } diff --git a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue index 061a6f43..e0c8cf67 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue @@ -1,5 +1,5 @@ From 2b40c7b6563b80a0ef75a9952f66587f7ae6776f Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 21 Jul 2026 14:42:32 +0200 Subject: [PATCH 14/16] cleanup --- .../Pages/TermsOfUse/TermsOfUseNavigationPanel.vue | 4 ++-- .../Pages/TermsOfUse/TermsOfUseRenderer.vue | 11 +++++------ src/router/index.js | 6 +++--- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue index f00586ea..2ca6ac6c 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue @@ -11,7 +11,7 @@ export default { PolicyNavigationPanel, }, data: () => ({ - // TODO update with info from API + // TODO read this from API termsOfUseLinks: [ { title: 'Upcoming Version', routePath: '/terms-of-use/upcoming' }, { title: '11 April 2022 (current)', routePath: '/terms-of-use' }, @@ -23,7 +23,7 @@ export default { const positionInList = this.termsOfUseLinks.findIndex(isCurrentPath) if (positionInList === -1) { - // not in a list, must be current version, because the TermsOfUseRenderer only allows accessing the current version by its active from date + // not in a list, must be current version, because the TermsOfUseRenderer only allows accessing the current version by its active_from date return 1 } diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index 587da7b2..6aae042a 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -27,8 +27,8 @@ export default { TermsOfUseNavigationPanel, }, computed: { - policyId: function () { // TODO rename to activeFrom ? - return this.$route.params.version + policyActiveFrom: function () { + return this.$route.params.activeFrom }, }, data () { @@ -39,17 +39,16 @@ export default { methods: { async loadPolicy () { try { - // const response = await this.$api.policiesCurrent(); const policyType = 'terms-of-use' // TODO read this from component property - const activeFrom = this.policyId + const activeFrom = this.policyActiveFrom - const response = await this.$api.policyByDate({ policyType, activeFrom }) + const response = await this.$api.policyByDate({ policyType, policyActiveFrom }) const metadata = await response.metadata this.policy = versions[metadata.active_from] } catch (error) { console.error(error) - alert('Failed to show policy') + alert('Failed to load policy.') } }, }, diff --git a/src/router/index.js b/src/router/index.js index b591cca4..7b005e77 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -72,20 +72,20 @@ const router = new Router({ name: 'ResetPassword', component: ResetPassword, }, - // this should be handled by TermsOfUseRenderer + // TODO should be handled by TermsOfUseRenderer { path: '/terms-of-use', name: 'TermsOfUse', component: TermsOfUse, }, - // this should be handled by TermsOfUseRenderer + // TODO should be handled by TermsOfUseRenderer { path: '/terms-of-use/upcoming', name: 'TermsOfUseUpcoming', component: TermsOfUseUpcoming, }, { - path: '/terms-of-use/:version', + path: '/terms-of-use/:activeFrom', name: 'TermsOfUseRenderer', component: TermsOfUseRenderer, }, From 300b09e55c5630fff03ca0f0a6c7dea3aae82bd9 Mon Sep 17 00:00:00 2001 From: dena Date: Tue, 21 Jul 2026 14:44:45 +0200 Subject: [PATCH 15/16] fix --- src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index 6aae042a..d30f65a0 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -42,7 +42,7 @@ export default { const policyType = 'terms-of-use' // TODO read this from component property const activeFrom = this.policyActiveFrom - const response = await this.$api.policyByDate({ policyType, policyActiveFrom }) + const response = await this.$api.policyByDate({ policyType, activeFrom }) const metadata = await response.metadata this.policy = versions[metadata.active_from] From 859a1f193beec92625a4e699d60c2de97162afb7 Mon Sep 17 00:00:00 2001 From: Thomas Arrow Date: Wed, 22 Jul 2026 11:18:08 +0100 Subject: [PATCH 16/16] Remove unused api method --- src/backend/api.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/backend/api.js b/src/backend/api.js index 2cc0ae5c..fe8cc0a3 100644 --- a/src/backend/api.js +++ b/src/backend/api.js @@ -98,10 +98,6 @@ export const wikiDiscovery = async ({ sort, direction, active, currentPage, resu })).data } -export const policiesCurrent = async () => { - return (await axios.get('/v1/policies/current')) -} - export const policyByDate = async ({ policyType, activeFrom }) => { return (await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`)).data }