Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
845e9cc
refactor(maps): port core map engine from Leaflet to vue-maplibre-gl
CarlSchwan Aug 21, 2026
bdd81b4
fix(maps): allow MapLibre GL to fetch its map sources under CSP
CarlSchwan Aug 21, 2026
5928741
feat(maps): port favorites markers and clustering to vue-maplibre-gl
CarlSchwan Aug 21, 2026
20eae9b
fix(maps): translate MapLibre click event shape for add-to-map clicks
CarlSchwan Aug 21, 2026
320157b
fix(maps): unwrap vue-maplibre-gl's map event envelope for add-click
CarlSchwan Aug 21, 2026
ca79f79
feat(maps): port contacts markers and clustering to vue-maplibre-gl
CarlSchwan Aug 21, 2026
a30a629
feat(maps): port photo markers and clustering to vue-maplibre-gl
CarlSchwan Aug 21, 2026
28b6850
feat(maps): show a representative photo thumbnail on cluster bubbles
CarlSchwan Aug 21, 2026
47229d0
feat(maps): port track lines and waypoints to vue-maplibre-gl
CarlSchwan Aug 21, 2026
74496e4
fix(maps): restore Map.vue's exposed zoom/fitBounds methods
CarlSchwan Aug 21, 2026
87cdcaa
fix(maps): open the track metadata tab instead of a generic file sidebar
CarlSchwan Aug 21, 2026
1a01802
feat(maps): port device markers and history trails to vue-maplibre-gl
CarlSchwan Aug 21, 2026
c6d5ee2
fix(maps): stop exceeding the device points endpoint's max limit
CarlSchwan Aug 21, 2026
d131a3c
feat(maps): port routing from leaflet-routing-machine to maplibre-gl-…
CarlSchwan Aug 21, 2026
93231ed
fix(maps): gate routing export/zoom buttons on an actual route
CarlSchwan Aug 21, 2026
9bdcb29
feat(maps): add turn-by-turn instructions and NcButton to routing
CarlSchwan Aug 21, 2026
48da56f
fix(maps): route only re-fetched on router change, not step edits
CarlSchwan Aug 21, 2026
7f934e4
style(maps): give the routing steps colored start/via/end accents
CarlSchwan Aug 21, 2026
0764fef
Revert "style(maps): give the routing steps colored start/via/end acc…
CarlSchwan Aug 21, 2026
63ed8f5
feat(maps): port the search box from leaflet to vue-maplibre-gl
CarlSchwan Aug 21, 2026
d8ab23d
feat(maps): add right-click menu and drag-to-edit to favorites
CarlSchwan Aug 21, 2026
ba07a3c
fix(maps): send a referer on nominatim requests so they aren't blocked
CarlSchwan Aug 21, 2026
0beda81
fix(maps): wait for the map style to load before building directions
CarlSchwan Aug 22, 2026
3149984
fix(maps): surface poi search failures instead of failing silently
CarlSchwan Aug 22, 2026
b77df85
fix(maps): use a centered poi icon with the default anchor
CarlSchwan Aug 22, 2026
9bddaab
fix(maps): render poi markers and give them real category icons
CarlSchwan Aug 22, 2026
0cbb2ff
feat(maps): make the base style's own poi icons clickable
CarlSchwan Aug 22, 2026
f8b5823
style(maps): make search result markers bigger
CarlSchwan Aug 22, 2026
a25b8e9
docs(maps): update the port-progress tracking comment
CarlSchwan Aug 22, 2026
dd8c7b4
feat(maps): add right-click menus to contacts/photos/tracks/devices
CarlSchwan Aug 22, 2026
3d13b71
docs(maps): update the port-progress tracking comment
CarlSchwan Aug 22, 2026
d3a089c
feat(maps): add drag-to-edit to photos
CarlSchwan Aug 22, 2026
e61e6b4
fix(maps): remove stylelint rules no longer present in stylelint 16
CarlSchwan Aug 22, 2026
b60b2c6
docs(maps): update the port-progress tracking comment
CarlSchwan Aug 22, 2026
bd5efff
feat(maps): port the history control and wire up the date-range slider
CarlSchwan Aug 22, 2026
54b219e
feat(maps): port the track elevation profile chart
CarlSchwan Aug 22, 2026
e57e5ac
feat(maps): port the public favorite share page to vue-maplibre-gl
CarlSchwan Aug 22, 2026
5dcf3a0
feat(maps): port PhotoSuggestionsLayer to vue-maplibre-gl
CarlSchwan Aug 24, 2026
e448a57
chore(maps): remove all remaining Leaflet usage from the app
CarlSchwan Aug 24, 2026
8e32417
feat(maps): restore placing a contact address and the empty-map menu
CarlSchwan Aug 24, 2026
be01e87
chore: Remove dead code
CarlSchwan Aug 31, 2026
625e770
chore(maps): remove dead Leaflet CSS and retarget it at MapLibre GL
CarlSchwan Aug 31, 2026
cd0fcc5
chore(maps): remove image assets orphaned by the Leaflet CSS cleanup
CarlSchwan Aug 31, 2026
846284c
chore(maps): remove the now-unused opening_hours dependency
CarlSchwan Aug 31, 2026
29c687d
fix(maps): persist the chosen base map style again
CarlSchwan Aug 31, 2026
56d564d
docs(maps): mark the Leaflet to vue-maplibre-gl port as complete
CarlSchwan Aug 31, 2026
a8f6e50
feat(maps): restore click-anywhere-to-search
CarlSchwan Sep 1, 2026
a65c7fc
Rework a bit the contact popup behavior
CarlSchwan Oct 15, 2026
f0f539e
refactor(maps): use the files sidebar API instead of OCA.Files.Sidebar
CarlSchwan Oct 15, 2026
9bd94c5
feat(maps): redesign the track metadata table
CarlSchwan Oct 15, 2026
3267aa1
fix(maps): compute track duration and moving speed correctly
CarlSchwan Oct 15, 2026
a878102
chore(maps): update @nextcloud/vue to 9.13.1
CarlSchwan Oct 15, 2026
f4ffac5
fix(maps): open the files sidebar from the viewer
CarlSchwan Oct 15, 2026
21bf05f
feat(maps): redesign the favorite sidebar
CarlSchwan Oct 15, 2026
9fb8bd3
feat(maps): redesign the photo suggestions sidebar
CarlSchwan Oct 15, 2026
a419fbb
feat(maps): redesign the navigation after the teams app
CarlSchwan Oct 15, 2026
7d5c106
fix(maps): clean up the map search field
CarlSchwan Oct 15, 2026
6a0175f
fix(maps): restore routing with an unsaved travel mode and untrimmed …
CarlSchwan Oct 15, 2026
34e8383
feat(maps): restore the find directions button and redesign routing
CarlSchwan Oct 15, 2026
aac7733
feat(maps): register "Copy link to map" with the new sharing sidebar API
CarlSchwan Oct 15, 2026
82855a3
fix(maps): load the public map options
CarlSchwan Oct 15, 2026
1419e34
fix(maps): load the shared map's data on public pages
CarlSchwan Oct 15, 2026
6252ccc
fix(maps): hide personal settings and tracking on public map pages
CarlSchwan Oct 15, 2026
df0217d
fix(maps): fix renaming, creating and deleting maps from the switcher
CarlSchwan Oct 15, 2026
7c40998
feat(maps): use the standard settings dialog layout
CarlSchwan Oct 15, 2026
c3ff08d
fix(maps): open popups again with MapLibre 5
CarlSchwan Oct 15, 2026
93c9e7e
feat(maps): show shared favorites in a sidebar
CarlSchwan Oct 15, 2026
889a38d
docs(maps): drop comments about the Leaflet port
CarlSchwan Oct 15, 2026
df10520
docs(maps): describe the MapLibre base maps in the app description
CarlSchwan Oct 15, 2026
18d7c73
chore(maps): remove dead code
CarlSchwan Oct 15, 2026
8e6d75d
ci: Update workflow templates
CarlSchwan Oct 16, 2026
af90e77
fix: Escape html
CarlSchwan Oct 16, 2026
46eda37
fix(psalm): Enforce php 8.3
CarlSchwan Oct 16, 2026
3d7d61c
refactor: Port away from IServerContainer
CarlSchwan Oct 16, 2026
6aab8f6
test(maps): mock IUserFolder on Nextcloud 36
CarlSchwan Oct 16, 2026
5d95e55
fix(psalm): Set it up correctly
CarlSchwan Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@ module.exports = {
extends: [
'@nextcloud'
],
overrides: [
{
// Allow `<script setup lang="ts">` in Vue SFCs being ported to TypeScript
files: ['*.vue'],
parserOptions: {
parser: '@typescript-eslint/parser',
sourceType: 'module',
extraFileExtensions: ['.vue'],
},
},
],
rules: {
'no-restricted-properties': [
'error',
Expand Down
69 changes: 32 additions & 37 deletions .github/workflows/phpunit-mariadb.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,29 +18,16 @@ concurrency:
cancel-in-progress: true

jobs:
matrix:
runs-on: ubuntu-latest-low
outputs:
php-version: ${{ steps.versions.outputs.php-available-list }}
server-max: ${{ steps.versions.outputs.branches-max-list }}
steps:
- name: Checkout app
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6.0.2
with:
persist-credentials: false

- name: Get version matrix
id: versions
uses: icewind1991/nextcloud-version-matrix@8a7bac6300b2f0f3100088b297995a229558ddba # v1.3.2.3.1.3.2

changes:
changes-and-matrix:
runs-on: ubuntu-latest-low
permissions:
contents: read
pull-requests: read

outputs:
src: ${{ steps.changes.outputs.src}}
src: ${{ steps.changes.outputs.src }}
php-version: ${{ steps.versions.outputs.php-available-list }}
server-max: ${{ steps.versions.outputs.branches-max-list }}

steps:
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
Expand All @@ -60,17 +47,29 @@ jobs:
- 'composer.json'
- 'composer.lock'

- name: Checkout app
if: steps.changes.outputs.src != 'false'
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Get version matrix
if: steps.changes.outputs.src != 'false'
id: versions
uses: nextcloud-libraries/nextcloud-version-matrix@cd0211ffcef1065e2020cd579e4843b8746e7a58 # v1.3.3

phpunit-mariadb:
runs-on: ubuntu-latest

needs: [changes, matrix]
if: needs.changes.outputs.src != 'false'
needs: changes-and-matrix
if: needs.changes-and-matrix.outputs.src != 'false'

strategy:
fail-fast: false
matrix:
php-versions: ${{ fromJson(needs.matrix.outputs.php-version) }}
server-versions: ${{ fromJson(needs.matrix.outputs.server-max) }}
mariadb-versions: ['10.6', '11.4']
php-versions: ${{ fromJson(needs.changes-and-matrix.outputs.php-version) }}
server-versions: ${{ fromJson(needs.changes-and-matrix.outputs.server-max) }}
mariadb-versions: ['10.6', '11.8']

name: MariaDB ${{ matrix.mariadb-versions }} PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }}

Expand All @@ -91,29 +90,21 @@ jobs:
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV

- name: Checkout server
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6.0.2
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}

- name: Checkout app
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6.0.2
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
path: apps/${{ env.APP_NAME }}

- name: Checkout viewer
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6.0.2
with:
persist-credentials: false
path: apps/viewer
ref: ${{ matrix.server-versions }}
repository: nextcloud/viewer

- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@7c071dfe9dc99bdf297fa79cb49ea005b9fcadbc # v2.37.1
uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # 2.37.2
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
Expand All @@ -136,13 +127,17 @@ jobs:
with:
files: apps/${{ env.APP_NAME }}/composer.json

- name: Set up dependencies
- name: Remove nextcloud/ocp
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: |
composer remove nextcloud/ocp --dev --no-scripts
composer i

- name: Install composer dependencies
uses: ramsey/composer-install@65e4f84970763564f46a70b8a54b90d033b3bdda # 4.0.0
with:
working-directory: apps/${{ env.APP_NAME }}

- name: Set up Nextcloud
env:
Expand Down Expand Up @@ -199,12 +194,12 @@ jobs:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, phpunit-mariadb]
needs: [changes-and-matrix, phpunit-mariadb]

if: always()

name: phpunit-mariadb-summary

steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mariadb.result != 'success' }}; then exit 1; fi
run: if ${{ needs.changes-and-matrix.outputs.src != 'false' && needs.phpunit-mariadb.result != 'success' }}; then exit 1; fi
200 changes: 200 additions & 0 deletions .github/workflows/phpunit-mysql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
#
# SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors
# SPDX-License-Identifier: MIT

name: PHPUnit MySQL

on: pull_request

permissions:
contents: read

concurrency:
group: phpunit-mysql-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

jobs:
matrix:
runs-on: ubuntu-latest-low
outputs:
matrix: ${{ steps.versions.outputs.sparse-matrix }}
steps:
- name: Checkout app
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false

- name: Get version matrix
id: versions
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
with:
matrix: '{"mysql-versions": ["8.4"]}'

changes:
runs-on: ubuntu-latest-low
permissions:
contents: read
pull-requests: read

outputs:
src: ${{ steps.changes.outputs.src}}

steps:
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
id: changes
continue-on-error: true
with:
filters: |
src:
- '.github/workflows/**'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'vendor/**'
- 'vendor-bin/**'
- '.php-cs-fixer.dist.php'
- 'composer.json'
- 'composer.lock'

phpunit-mysql:
runs-on: ubuntu-latest

needs: [changes, matrix]
if: needs.changes.outputs.src != 'false'

strategy:
matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}

name: MySQL ${{ matrix.mysql-versions }} PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }}

services:
mysql:
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest # zizmor: ignore[unpinned-images]
ports:
- 4444:3306/tcp
env:
MYSQL_ROOT_PASSWORD: rootpassword
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10

steps:
- name: Set app env
if: ${{ env.APP_NAME == '' }}
run: |
# Split and keep last
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV

- name: Checkout server
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
submodules: true
repository: nextcloud/server
ref: ${{ matrix.server-versions }}

- name: Checkout app
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
path: apps/${{ env.APP_NAME }}

- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, mysql, pdo_mysql
coverage: none
ini-file: development
# Temporary workaround for missing pcntl_* in PHP 8.3
ini-values: disable_functions=
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Enable ONLY_FULL_GROUP_BY MySQL option
run: |
echo "SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
echo 'SELECT @@sql_mode;' | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword

- name: Check composer file existence
id: check_composer
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
with:
files: apps/${{ env.APP_NAME }}/composer.json

- name: Set up dependencies
# Only run if phpunit config file exists
if: steps.check_composer.outputs.files_exists == 'true'
working-directory: apps/${{ env.APP_NAME }}
run: |
composer remove nextcloud/ocp --dev --no-scripts
composer i

- name: Set up Nextcloud
env:
DB_PORT: 4444
run: |
mkdir data
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ app:enable --force ${{ env.APP_NAME }}

- name: Check PHPUnit script is defined
id: check_phpunit
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep '^ test:unit ' | wc -l | grep 1

- name: PHPUnit
# Only run if phpunit config file exists
if: steps.check_phpunit.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:unit

- name: Check PHPUnit integration script is defined
id: check_integration
continue-on-error: true
working-directory: apps/${{ env.APP_NAME }}
run: |
composer run --list | grep '^ test:integration ' | wc -l | grep 1

- name: Run Nextcloud
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
run: php -S localhost:8080 &

- name: PHPUnit integration
# Only run if phpunit integration config file exists
if: steps.check_integration.outcome == 'success'
working-directory: apps/${{ env.APP_NAME }}
run: composer run test:integration

- name: Print logs
if: always()
run: |
cat data/nextcloud.log

- name: Skipped
# Fail the action when neither unit nor integration tests ran
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
run: |
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
exit 1

summary:
permissions:
contents: none
runs-on: ubuntu-latest-low
needs: [changes, phpunit-mysql]

if: always()

name: phpunit-mysql-summary

steps:
- name: Summary status
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mysql.result != 'success' }}; then exit 1; fi
Loading
Loading