From 7d1a436fd1c825a9290f65fed25131e31f56e4ad Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 24 Jul 2026 15:57:42 +0200 Subject: [PATCH 01/16] WIP --- src/backend/api.js | 24 ++++++++++++++--- .../HostingPolicy/HostingPolicyRenderer.vue | 4 +-- .../TermsOfUse/TermsOfUseNavigationPanel.vue | 26 +++++++++++++++---- .../Pages/TermsOfUse/TermsOfUseRenderer.vue | 14 ++++++---- src/router/index.js | 21 ++++++++------- 5 files changed, 64 insertions(+), 25 deletions(-) diff --git a/src/backend/api.js b/src/backend/api.js index b74b0264..08108628 100644 --- a/src/backend/api.js +++ b/src/backend/api.js @@ -58,6 +58,26 @@ export const getCurrentPolicies = async () => { return data.items } +export const getPolicyByDate = async ({ policyType, activeFrom }) => { + const { data } = await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`).data + return data; +} + +export const getAllPoliciesByType = async ({ policyType }) => { + const { data } = await axios.get(`/v1/policies/${policyType}`).data + return data.items; +} + +export const getCurrentPolicyByType = async ({ policyType }) => { + const { data } = await axios.get(`/v1/policies/${policyType}`).data + return data; +} + +export const getUpcomingPolicyByType = async ({ policyType }) => { + const { data } = await axios.get(`/v1/policies/${policyType}/upcoming`).data + return data; +} + /* Wiki endpoints */ export const countWikis = async () => (await axios.get('/wiki/count')).data.data // TODO This doesn't seem to exist and not used? export const myWikis = async () => (await axios.post('/wiki/mine')).data @@ -102,10 +122,6 @@ export const wikiDiscovery = async ({ sort, direction, active, currentPage, resu })).data } -export const policyByDate = async ({ policyType, activeFrom }) => { - return (await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`)).data -} - export const importEntities = async ({ wikiId, entityIds = [ diff --git a/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue b/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue index d21c1430..a39b2def 100644 --- a/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue +++ b/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue @@ -39,10 +39,10 @@ export default { methods: { async loadPolicy () { try { - const policyType = 'hosting-policy' // TODO read this from component property + const policyType = 'hosting-policy' // TODO for a generalized component, read this from component property const activeFrom = this.policyActiveFrom - const response = await this.$api.policyByDate({ policyType, activeFrom }) + const response = await this.$api.getPolicyByDate({ policyType, activeFrom }) const metadata = await response.metadata const policy = versions[metadata.content_vue_file] diff --git a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue index 2ca6ac6c..a46bc01a 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue @@ -11,11 +11,9 @@ export default { PolicyNavigationPanel, }, data: () => ({ - // TODO read this from API - termsOfUseLinks: [ - { title: 'Upcoming Version', routePath: '/terms-of-use/upcoming' }, - { title: '11 April 2022 (current)', routePath: '/terms-of-use' }, - ], + termsOfUseLinks: [], + policies: undefined, + error: undefined, }), computed: { currentLink: function () { @@ -30,6 +28,24 @@ export default { return positionInList }, }, + methods: { + async loadPolicies () { + try { + const policyType = 'terms-of-use'; + const response = await this.$api.getAllPoliciesByType({ policyType }) + + const items = await response.items; + + this.policies = items; + } catch (error) { + this.error = error + console.error(error) + } + }, + }, + mounted () { + this.loadPolicies() + }, } diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index c3603503..65eac5f6 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -38,15 +38,19 @@ export default { return { policy: undefined, error: undefined, + policyType: 'terms-of-use', } }, methods: { async loadPolicy () { try { - const policyType = 'terms-of-use' // TODO read this from component property - const activeFrom = this.policyActiveFrom - - const response = await this.$api.policyByDate({ policyType, activeFrom }) + const policyType = this.policyType; // TODO for a generalized component, read this from component property + + if (this.policyActiveFrom === undefined) { + const response = await this.$api.getCurrentPolicyByType({ policyType }) + } else { + const response = await this.$api.getPolicyByDate({ policyType, activeFrom }) + } const metadata = await response.metadata const policy = versions[metadata.content_vue_file] @@ -66,7 +70,7 @@ export default { this.loadPolicy() }, watch: { - policyId: function () { + policyActiveFrom: function () { this.loadPolicy() }, }, diff --git a/src/router/index.js b/src/router/index.js index 9c7f89ab..03069d0a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -73,31 +73,34 @@ const router = new Router({ name: 'ResetPassword', component: ResetPassword, }, - // TODO should be handled by TermsOfUseRenderer { path: '/terms-of-use', - name: 'TermsOfUse', - component: TermsOfUse, + name: 'TermsOfUseRenderer', + component: TermsOfUseRenderer, }, - // TODO should be handled by TermsOfUseRenderer { path: '/terms-of-use/upcoming', - name: 'TermsOfUseUpcoming', - component: TermsOfUseUpcoming, + name: 'TermsOfUseRendererUpcoming', + component: TermsOfUseRenderer, }, { path: '/terms-of-use/:activeFrom', - name: 'TermsOfUseRenderer', + name: 'TermsOfUseRendererExact', component: TermsOfUseRenderer, }, { path: '/hosting-policy/pilot', - name: 'Hosting Policy', + name: 'HostingPolicyPilot', component: HostingPolicy, }, { path: '/hosting-policy/:activeFrom', - name: 'Hosting Policy', + name: 'HostingPolicyRendererExact', + component: HostingPolicyRenderer, + }, + { + path: '/hosting-policy/upcoming', + name: 'HostingPolicyRendererUpcoming', component: HostingPolicyRenderer, }, { From ba50d69f25424139d570006503dfc3aa0907873d Mon Sep 17 00:00:00 2001 From: dena Date: Fri, 24 Jul 2026 16:18:05 +0200 Subject: [PATCH 02/16] changes --- src/backend/api.js | 8 ++++---- .../Pages/TermsOfUse/TermsOfUseNavigationPanel.vue | 7 +++---- src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue | 5 +++-- src/router/index.js | 2 -- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/backend/api.js b/src/backend/api.js index 08108628..2b0a9201 100644 --- a/src/backend/api.js +++ b/src/backend/api.js @@ -60,22 +60,22 @@ export const getCurrentPolicies = async () => { export const getPolicyByDate = async ({ policyType, activeFrom }) => { const { data } = await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`).data - return data; + return data } export const getAllPoliciesByType = async ({ policyType }) => { const { data } = await axios.get(`/v1/policies/${policyType}`).data - return data.items; + return data.items } export const getCurrentPolicyByType = async ({ policyType }) => { const { data } = await axios.get(`/v1/policies/${policyType}`).data - return data; + return data } export const getUpcomingPolicyByType = async ({ policyType }) => { const { data } = await axios.get(`/v1/policies/${policyType}/upcoming`).data - return data; + return data } /* Wiki endpoints */ diff --git a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue index a46bc01a..dab0aca3 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseNavigationPanel.vue @@ -31,12 +31,11 @@ export default { methods: { async loadPolicies () { try { - const policyType = 'terms-of-use'; + const policyType = 'terms-of-use' const response = await this.$api.getAllPoliciesByType({ policyType }) + const items = await response.items - const items = await response.items; - - this.policies = items; + this.policies = items } catch (error) { this.error = error console.error(error) diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index 65eac5f6..7d71ec27 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -44,8 +44,9 @@ export default { methods: { async loadPolicy () { try { - const policyType = this.policyType; // TODO for a generalized component, read this from component property - + const policyType = this.policyType // TODO for a generalized component, read this from component property + const activeFrom = this.activeFrom + if (this.policyActiveFrom === undefined) { const response = await this.$api.getCurrentPolicyByType({ policyType }) } else { diff --git a/src/router/index.js b/src/router/index.js index 03069d0a..71c39fab 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -14,8 +14,6 @@ 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' From 69b740698d7b548522ec270884557fddd5435d49 Mon Sep 17 00:00:00 2001 From: Dat Date: Mon, 27 Jul 2026 13:17:49 +0200 Subject: [PATCH 03/16] feat(ui): source policy navigation from API instead of hardcode --- src/backend/api.js | 8 +- .../Components/PolicyNavigationPanel.vue | 2 +- .../TermsOfUse/TermsOfUseNavigationPanel.vue | 125 ++++++++++++++++-- 3 files changed, 119 insertions(+), 16 deletions(-) diff --git a/src/backend/api.js b/src/backend/api.js index 2b0a9201..4c8bbfac 100644 --- a/src/backend/api.js +++ b/src/backend/api.js @@ -59,22 +59,22 @@ export const getCurrentPolicies = async () => { } export const getPolicyByDate = async ({ policyType, activeFrom }) => { - const { data } = await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`).data + const { data } = await axios.get(`/v1/policies/${policyType}/by_active_from/${activeFrom}`) return data } export const getAllPoliciesByType = async ({ policyType }) => { - const { data } = await axios.get(`/v1/policies/${policyType}`).data + const { data } = await axios.get(`/v1/policies/${policyType}`) return data.items } export const getCurrentPolicyByType = async ({ policyType }) => { - const { data } = await axios.get(`/v1/policies/${policyType}`).data + const { data } = await axios.get(`/v1/policies/${policyType}/current`) return data } export const getUpcomingPolicyByType = async ({ policyType }) => { - const { data } = await axios.get(`/v1/policies/${policyType}/upcoming`).data + const { data } = await axios.get(`/v1/policies/${policyType}/upcoming`) return data } diff --git a/src/components/Pages/Components/PolicyNavigationPanel.vue b/src/components/Pages/Components/PolicyNavigationPanel.vue index 1557d78c..180969ee 100644 --- a/src/components/Pages/Components/PolicyNavigationPanel.vue +++ b/src/components/Pages/Components/PolicyNavigationPanel.vue @@ -1,5 +1,5 @@ + + diff --git a/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue b/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue index db752f08..4fe5c97a 100644 --- a/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue +++ b/src/components/Pages/HostingPolicy/HostingPolicyRenderer.vue @@ -15,7 +15,7 @@ - + @@ -28,7 +28,7 @@ - - diff --git a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue index f0272926..ba10fd9a 100644 --- a/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue +++ b/src/components/Pages/TermsOfUse/TermsOfUseRenderer.vue @@ -6,7 +6,7 @@ - + @@ -23,7 +23,7 @@