diff --git a/composer.json b/composer.json
index 378897b..d046761 100644
--- a/composer.json
+++ b/composer.json
@@ -1,6 +1,6 @@
{
"name": "fleetbase/solid-api",
- "version": "0.0.5",
+ "version": "0.0.6",
"description": "Solid Protocol Extension to Store and Share Data with Fleetbase",
"keywords": [
"fleetbase-extension",
diff --git a/extension.json b/extension.json
index 702d6d1..94ba457 100644
--- a/extension.json
+++ b/extension.json
@@ -1,6 +1,6 @@
{
"name": "Solid",
- "version": "0.0.5",
+ "version": "0.0.6",
"description": "Solid Protocol Extension to Store and Share Data with Fleetbase",
"repository": "https://github.com/fleetbase/solid",
"license": "AGPL-3.0-or-later",
diff --git a/package.json b/package.json
index d229147..dcd23d2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@fleetbase/solid-engine",
- "version": "0.0.5",
+ "version": "0.0.6",
"description": "Solid Protocol Extension to Store and Share Data with Fleetbase",
"fleetbase": {
"route": "solid-protocol"
@@ -45,11 +45,12 @@
},
"dependencies": {
"@babel/core": "^7.23.2",
- "@fleetbase/ember-core": "^0.3.9",
- "@fleetbase/ember-ui": "^0.3.15",
- "@fleetbase/fleetops-data": "^0.1.24",
+ "@fleetbase/ember-core": "^0.3.10",
+ "@fleetbase/ember-ui": "^0.3.17",
+ "@fleetbase/fleetops-data": "^0.1.25",
"@fortawesome/ember-fontawesome": "^2.0.0",
"@fortawesome/fontawesome-svg-core": "6.4.0",
+ "@fortawesome/free-brands-svg-icons": "6.4.0",
"@fortawesome/free-solid-svg-icons": "6.4.0",
"broccoli-funnel": "^3.0.8",
"ember-auto-import": "^2.7.4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 76e932b..e76a6b5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,20 +12,23 @@ importers:
specifier: ^7.23.2
version: 7.28.5
'@fleetbase/ember-core':
- specifier: ^0.3.9
- version: 0.3.9(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)
+ specifier: ^0.3.10
+ version: 0.3.10(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)
'@fleetbase/ember-ui':
- specifier: ^0.3.15
- version: 0.3.15(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(@glimmer/component@1.1.2(@babel/core@7.28.5))(@glimmer/tracking@1.1.2)(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(postcss@8.5.6)(rollup@2.79.2)(tracked-built-ins@3.4.0(@babel/core@7.28.5))(webpack@5.104.1)
+ specifier: ^0.3.17
+ version: 0.3.17(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(@glimmer/component@1.1.2(@babel/core@7.28.5))(@glimmer/tracking@1.1.2)(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(postcss@8.5.6)(rollup@2.79.2)(tracked-built-ins@3.4.0(@babel/core@7.28.5))(webpack@5.104.1)
'@fleetbase/fleetops-data':
- specifier: ^0.1.24
- version: 0.1.24(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)
+ specifier: ^0.1.25
+ version: 0.1.25(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)
'@fortawesome/ember-fontawesome':
specifier: ^2.0.0
version: 2.0.0(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(rollup@2.79.2)(webpack@5.104.1)
'@fortawesome/fontawesome-svg-core':
specifier: 6.4.0
version: 6.4.0
+ '@fortawesome/free-brands-svg-icons':
+ specifier: 6.4.0
+ version: 6.4.0
'@fortawesome/free-solid-svg-icons':
specifier: 6.4.0
version: 6.4.0
@@ -1293,16 +1296,16 @@ packages:
peerDependencies:
ember-source: '>= 4.0.0'
- '@fleetbase/ember-core@0.3.9':
- resolution: {integrity: sha512-CxMEyNGhSk0u8SkI6GZiKY2W/246PyBpY6clZahoxtyokL76kWx2KjEk4iXqKdhKKU5a5OKlS8Kw9wb0peZZzw==}
+ '@fleetbase/ember-core@0.3.10':
+ resolution: {integrity: sha512-qPavjAd/WuRiu1E3KbJ58NUMv1elpkvTQZ51X1XeN2W2P4m9Q2bubrwv8TrOpUOOI15lIaG8optlbHMxeCNzig==}
engines: {node: '>= 18'}
- '@fleetbase/ember-ui@0.3.15':
- resolution: {integrity: sha512-eKzaUyTUa6Fp8seRS0dB/6+tf///YVMx8MvuJPQoKBupxmQ7i+D6iehu6KBrbDRfoHVWRL6/44WmoTZoDzDQRA==}
+ '@fleetbase/ember-ui@0.3.17':
+ resolution: {integrity: sha512-hRPa+QAo/Sx7oDmyzw2AGmNw6T4GBJnAe4/bJ3O/ZCm/nsdhsmre4CuY+sK3CagC4cYWii3iOtEf4AHNEB86Og==}
engines: {node: '>= 18'}
- '@fleetbase/fleetops-data@0.1.24':
- resolution: {integrity: sha512-cSK4FXIIO7yidQ6j44oZzmHt1vlTinz3RMvK0vYrXoKehKWy/8LDsT+lrfCEeGeYB0sTnVfnNsSZVkUPLsMxPg==}
+ '@fleetbase/fleetops-data@0.1.25':
+ resolution: {integrity: sha512-uCX/qB4ANDGNN+EM1vdsVc4inprGEwj1dT0G5OTYKsFaHL3CWOeXsOg8qSa5EDClqxIodadx6stB+dSwrhYowg==}
engines: {node: '>= 18'}
'@floating-ui/core@1.7.3':
@@ -1380,18 +1383,18 @@ packages:
resolution: {integrity: sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==}
engines: {node: '>=6'}
- '@fullcalendar/core@6.1.19':
- resolution: {integrity: sha512-z0aVlO5e4Wah6p6mouM0UEqtRf1MZZPt4mwzEyU6kusaNL+dlWQgAasF2cK23hwT4cmxkEmr4inULXgpyeExdQ==}
+ '@fullcalendar/core@6.1.20':
+ resolution: {integrity: sha512-1cukXLlePFiJ8YKXn/4tMKsy0etxYLCkXk8nUCFi11nRONF2Ba2CD5b21/ovtOO2tL6afTJfwmc1ed3HG7eB1g==}
- '@fullcalendar/daygrid@6.1.19':
- resolution: {integrity: sha512-IAAfnMICnVWPjpT4zi87i3FEw0xxSza0avqY/HedKEz+l5MTBYvCDPOWDATpzXoLut3aACsjktIyw9thvIcRYQ==}
+ '@fullcalendar/daygrid@6.1.20':
+ resolution: {integrity: sha512-AO9vqhkLP77EesmJzuU+IGXgxNulsA8mgQHynclJ8U70vSwAVnbcLG9qftiTAFSlZjiY/NvhE7sflve6cJelyQ==}
peerDependencies:
- '@fullcalendar/core': ~6.1.19
+ '@fullcalendar/core': ~6.1.20
- '@fullcalendar/interaction@6.1.19':
- resolution: {integrity: sha512-GOciy79xe8JMVp+1evAU3ytdwN/7tv35t5i1vFkifiuWcQMLC/JnLg/RA2s4sYmQwoYhTw/p4GLcP0gO5B3X5w==}
+ '@fullcalendar/interaction@6.1.20':
+ resolution: {integrity: sha512-p6txmc5txL0bMiPaJxe2ip6o0T384TyoD2KGdsU6UjZ5yoBlaY+dg7kxfnYKpYMzEJLG58n+URrHr2PgNL2fyA==}
peerDependencies:
- '@fullcalendar/core': ~6.1.19
+ '@fullcalendar/core': ~6.1.20
'@glimmer/compiler@0.84.3':
resolution: {integrity: sha512-cj9sGlnvExP9httxY6ZMivJRGulyaZ31DddCYB5h6LxupR4Nk2d1nAJCWPLsvuQJ8qR+eYw0y9aiY/VeT0krpQ==}
@@ -3295,8 +3298,8 @@ packages:
resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
engines: {node: '>= 0.6'}
- content-tag@3.1.3:
- resolution: {integrity: sha512-4Kiv9mEroxuMXfWUNUHcljVJgxThCNk7eEswdHMXdzJnkBBaYDqDwzHkoh3F74JJhfU3taJOsgpR6oEGIDg17g==}
+ content-tag@4.1.0:
+ resolution: {integrity: sha512-On6gUuvI1l5MScHO+Xbwjeq1Pk9H6HOipDWkzqGGUGmKpq6K5TRmQuCl1LGSHbdIo2l+lSsgLKrLgCl5kKYA+A==}
content-type@1.0.5:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
@@ -3422,8 +3425,8 @@ packages:
css-unit-converter@1.1.2:
resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==}
- cssdb@8.5.2:
- resolution: {integrity: sha512-Pmoj9RmD8RIoIzA2EQWO4D4RMeDts0tgAH0VXdlNdxjuBGI3a9wMOIcUwaPNmD4r2qtIa06gqkIf7sECl+cBCg==}
+ cssdb@8.6.0:
+ resolution: {integrity: sha512-7ZrRi/Z3cRL1d5I8RuXEWAkRFP3J4GeQRiyVknI4KC70RAU8hT4LysUZDe0y+fYNOktCbxE8sOPUOhyR12UqGQ==}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@@ -4155,8 +4158,8 @@ packages:
resolution: {integrity: sha512-OS8TUVG2kQYYwP3netunLVfeijPoOKIs1SvPQRTNOQX4Pu8xGGBEZmrv0U1YTnQn12Eg+p6w/0UdGbUnITjyzw==}
engines: {node: 12.* || >= 14}
- ember-template-imports@4.3.0:
- resolution: {integrity: sha512-jZ5D6KLKU8up/AynZltmKh4lkXBPgTGSPgomprI/55XvIVqn42UNUpEz7ra/mO3QiGODDZOUesbggPe49i38sQ==}
+ ember-template-imports@4.4.0:
+ resolution: {integrity: sha512-HNOHabTEMbRluci1uScvh3ljMDo9E46dHHNcJAIf5yjOhIQ/zN4Y0DVDWrRfcbihlHvt4v/iF69G+8tffC1YkA==}
engines: {node: 16.* || >= 18}
ember-template-lint@5.13.0:
@@ -6914,8 +6917,8 @@ packages:
prosemirror-state@1.4.4:
resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==}
- prosemirror-tables@1.8.3:
- resolution: {integrity: sha512-wbqCR/RlRPRe41a4LFtmhKElzBEfBTdtAYWNIGHM6X2e24NN/MTNUKyXjjphfAfdQce37Kh/5yf765mLPYDe7Q==}
+ prosemirror-tables@1.8.5:
+ resolution: {integrity: sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==}
prosemirror-trailing-node@3.0.0:
resolution: {integrity: sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==}
@@ -9832,7 +9835,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@fleetbase/ember-core@0.3.9(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)':
+ '@fleetbase/ember-core@0.3.10(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)':
dependencies:
'@babel/core': 7.28.5
compress-json: 3.4.0
@@ -9865,7 +9868,7 @@ snapshots:
- utf-8-validate
- webpack
- '@fleetbase/ember-ui@0.3.15(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(@glimmer/component@1.1.2(@babel/core@7.28.5))(@glimmer/tracking@1.1.2)(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(postcss@8.5.6)(rollup@2.79.2)(tracked-built-ins@3.4.0(@babel/core@7.28.5))(webpack@5.104.1)':
+ '@fleetbase/ember-ui@0.3.17(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(@glimmer/component@1.1.2(@babel/core@7.28.5))(@glimmer/tracking@1.1.2)(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(postcss@8.5.6)(rollup@2.79.2)(tracked-built-ins@3.4.0(@babel/core@7.28.5))(webpack@5.104.1)':
dependencies:
'@babel/core': 7.28.5
'@ember/render-modifiers': 2.1.0(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))
@@ -9878,9 +9881,9 @@ snapshots:
'@fortawesome/fontawesome-svg-core': 6.4.0
'@fortawesome/free-brands-svg-icons': 6.4.0
'@fortawesome/free-solid-svg-icons': 6.4.0
- '@fullcalendar/core': 6.1.19
- '@fullcalendar/daygrid': 6.1.19(@fullcalendar/core@6.1.19)
- '@fullcalendar/interaction': 6.1.19(@fullcalendar/core@6.1.19)
+ '@fullcalendar/core': 6.1.20
+ '@fullcalendar/daygrid': 6.1.20(@fullcalendar/core@6.1.20)
+ '@fullcalendar/interaction': 6.1.20(@fullcalendar/core@6.1.20)
'@makepanic/ember-power-calendar-date-fns': 0.4.2
'@tailwindcss/forms': 0.5.11(tailwindcss@3.4.19)
'@tiptap/core': 2.27.1(@tiptap/pm@2.27.1)
@@ -9968,10 +9971,10 @@ snapshots:
- webpack-command
- yaml
- '@fleetbase/fleetops-data@0.1.24(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)':
+ '@fleetbase/fleetops-data@0.1.25(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)':
dependencies:
'@babel/core': 7.28.5
- '@fleetbase/ember-core': 0.3.9(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)
+ '@fleetbase/ember-core': 0.3.10(@ember/string@3.1.1)(@ember/test-helpers@3.3.1(@babel/core@7.28.5)(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(webpack@5.104.1))(ember-resolver@11.0.1(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)))(ember-source@5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1))(eslint@8.57.1)(webpack@5.104.1)
date-fns: 2.30.0
ember-cli-babel: 8.2.0(@babel/core@7.28.5)
ember-cli-htmlbars: 6.3.0
@@ -10111,17 +10114,17 @@ snapshots:
dependencies:
'@fortawesome/fontawesome-common-types': 6.4.0
- '@fullcalendar/core@6.1.19':
+ '@fullcalendar/core@6.1.20':
dependencies:
preact: 10.12.1
- '@fullcalendar/daygrid@6.1.19(@fullcalendar/core@6.1.19)':
+ '@fullcalendar/daygrid@6.1.20(@fullcalendar/core@6.1.20)':
dependencies:
- '@fullcalendar/core': 6.1.19
+ '@fullcalendar/core': 6.1.20
- '@fullcalendar/interaction@6.1.19(@fullcalendar/core@6.1.19)':
+ '@fullcalendar/interaction@6.1.20(@fullcalendar/core@6.1.20)':
dependencies:
- '@fullcalendar/core': 6.1.19
+ '@fullcalendar/core': 6.1.20
'@glimmer/compiler@0.84.3':
dependencies:
@@ -10629,7 +10632,7 @@ snapshots:
prosemirror-schema-basic: 1.2.4
prosemirror-schema-list: 1.5.1
prosemirror-state: 1.4.4
- prosemirror-tables: 1.8.3
+ prosemirror-tables: 1.8.5
prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.4)
prosemirror-transform: 1.10.5
prosemirror-view: 1.41.4
@@ -12590,7 +12593,7 @@ snapshots:
dependencies:
safe-buffer: 5.2.1
- content-tag@3.1.3: {}
+ content-tag@4.1.0: {}
content-type@1.0.5: {}
@@ -12741,7 +12744,7 @@ snapshots:
css-unit-converter@1.1.2: {}
- cssdb@8.5.2: {}
+ cssdb@8.6.0: {}
cssesc@3.0.0: {}
@@ -13768,7 +13771,7 @@ snapshots:
ember-cli-htmlbars: 6.3.0
ember-element-helper: 0.8.8
ember-source: 5.4.1(@babel/core@7.28.5)(@glimmer/component@1.1.2(@babel/core@7.28.5))(rsvp@4.8.5)(webpack@5.104.1)
- ember-template-imports: 4.3.0
+ ember-template-imports: 4.4.0
transitivePeerDependencies:
- '@glint/template'
- supports-color
@@ -14256,10 +14259,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- ember-template-imports@4.3.0:
+ ember-template-imports@4.4.0:
dependencies:
broccoli-stew: 3.0.0
- content-tag: 3.1.3
+ content-tag: 4.1.0
ember-cli-version-checker: 5.1.2
transitivePeerDependencies:
- supports-color
@@ -17281,7 +17284,7 @@ snapshots:
css-blank-pseudo: 6.0.2(postcss@8.5.6)
css-has-pseudo: 6.0.5(postcss@8.5.6)
css-prefers-color-scheme: 9.0.1(postcss@8.5.6)
- cssdb: 8.5.2
+ cssdb: 8.6.0
postcss: 8.5.6
postcss-attribute-case-insensitive: 6.0.3(postcss@8.5.6)
postcss-clamp: 4.1.0(postcss@8.5.6)
@@ -17478,7 +17481,7 @@ snapshots:
prosemirror-transform: 1.10.5
prosemirror-view: 1.41.4
- prosemirror-tables@1.8.3:
+ prosemirror-tables@1.8.5:
dependencies:
prosemirror-keymap: 1.2.3
prosemirror-model: 1.25.4
diff --git a/server/src/Http/Controllers/DataController.php b/server/src/Http/Controllers/DataController.php
index 789d876..93e323f 100644
--- a/server/src/Http/Controllers/DataController.php
+++ b/server/src/Http/Controllers/DataController.php
@@ -138,6 +138,35 @@ public function createFolder(Request $request)
'parent_url' => $parentUrl,
]);
+ // Check if parent URL is writable before attempting folder creation
+ $aclService = app(\Fleetbase\Solid\Services\AclService::class);
+
+ if (!$aclService->isWritable($identity, $parentUrl)) {
+ Log::warning('[FOLDER CREATE] Location not writable', [
+ 'parent_url' => $parentUrl,
+ 'webid' => $webId,
+ ]);
+
+ // Find writable locations
+ $writableLocations = $aclService->findWritableLocations($identity, $profile);
+
+ if (!empty($writableLocations)) {
+ $suggestion = array_values($writableLocations)[0];
+ return response()->json([
+ 'success' => false,
+ 'error' => 'Cannot create folder at specified location. You do not have write permissions.',
+ 'suggestion' => "Try creating the folder at: {$suggestion}",
+ 'writable_locations' => $writableLocations,
+ ], 403);
+ } else {
+ return response()->json([
+ 'success' => false,
+ 'error' => 'No writable locations found in your pod.',
+ 'help' => 'You may need to configure ACL permissions. See: https://docs.solidproject.org/managing-permissions',
+ ], 403);
+ }
+ }
+
// Use POST with Slug header (Solid Protocol standard)
$result = $this->podService->createFolder($identity, $parentUrl, $folderName);
@@ -237,6 +266,34 @@ public function importResources(Request $request)
'resource_types' => $resourceTypes,
]);
+ // Check if pod URL is writable before importing
+ $aclService = app(\Fleetbase\Solid\Services\AclService::class);
+
+ if (!$aclService->isWritable($identity, $podUrl)) {
+ Log::warning('[IMPORT RESOURCES] Pod root not writable', [
+ 'pod_url' => $podUrl,
+ 'webid' => $webId,
+ ]);
+
+ // Find writable locations
+ $writableLocations = $aclService->findWritableLocations($identity, $profile);
+
+ if (!empty($writableLocations)) {
+ return response()->json([
+ 'success' => false,
+ 'error' => 'Cannot import resources to pod root. You do not have write permissions.',
+ 'writable_locations' => $writableLocations,
+ 'help' => 'Resources can only be imported to writable locations.',
+ ], 403);
+ } else {
+ return response()->json([
+ 'success' => false,
+ 'error' => 'No writable locations found in your pod.',
+ 'help' => 'You may need to configure ACL permissions. See: https://docs.solidproject.org/managing-permissions',
+ ], 403);
+ }
+ }
+
$result = $this->resourceSyncService->importResources($identity, $podUrl, $resourceTypes);
return response()->json([
diff --git a/server/src/Services/AclService.php b/server/src/Services/AclService.php
index f99ba80..a3ce529 100644
--- a/server/src/Services/AclService.php
+++ b/server/src/Services/AclService.php
@@ -143,4 +143,263 @@ public function ensureWritePermissions(SolidIdentity $identity, string $podUrl,
Log::info('[ACL NEEDS UPDATE]', ['pod_url' => $podUrl]);
return $this->grantWritePermissions($identity, $podUrl, $webId);
}
+
+ /**
+ * Ensure a folder has proper ACL permissions after creation.
+ *
+ * @param SolidIdentity $identity
+ * @param string $folderUrl The folder URL (must end with /)
+ * @param string $webId The WebID to grant permissions to
+ * @return bool
+ */
+ public function ensureFolderPermissions(SolidIdentity $identity, string $folderUrl, string $webId): bool
+ {
+ try {
+ // Ensure folder URL ends with /
+ $folderUrl = rtrim($folderUrl, '/') . '/';
+ $aclUrl = $folderUrl . '.acl';
+
+ Log::info('[ACL] Ensuring folder permissions', [
+ 'folder_url' => $folderUrl,
+ 'acl_url' => $aclUrl,
+ 'webid' => $webId,
+ ]);
+
+ // Check if ACL already exists and has write permissions
+ if ($this->hasFolderWritePermissions($identity, $folderUrl, $webId)) {
+ Log::info('[ACL] Folder already has write permissions', ['folder_url' => $folderUrl]);
+ return true;
+ }
+
+ // Create ACL with full permissions for the owner
+ $aclContent = $this->generateFolderAcl($folderUrl, $webId);
+
+ return $this->createFolderAcl($identity, $aclUrl, $aclContent);
+ } catch (\Throwable $e) {
+ Log::error('[ACL] Failed to ensure folder permissions', [
+ 'folder_url' => $folderUrl,
+ 'error' => $e->getMessage(),
+ ]);
+ return false;
+ }
+ }
+
+ /**
+ * Check if a folder has write permissions.
+ *
+ * @param SolidIdentity $identity
+ * @param string $folderUrl
+ * @param string $webId
+ * @return bool
+ */
+ protected function hasFolderWritePermissions(SolidIdentity $identity, string $folderUrl, string $webId): bool
+ {
+ try {
+ $response = $identity->request('head', $folderUrl);
+
+ if (!$response->successful()) {
+ return false;
+ }
+
+ // Check WAC-Allow header
+ $wacAllow = $response->header('WAC-Allow');
+
+ if ($wacAllow) {
+ Log::debug('[ACL] WAC-Allow header', [
+ 'folder_url' => $folderUrl,
+ 'wac_allow' => $wacAllow,
+ ]);
+
+ // Parse WAC-Allow header: user="read write", public="read"
+ if (preg_match('/user="([^"]*)"/i', $wacAllow, $matches)) {
+ $userModes = strtolower($matches[1]);
+ return str_contains($userModes, 'write') || str_contains($userModes, 'append');
+ }
+ }
+
+ return false;
+ } catch (\Throwable $e) {
+ Log::debug('[ACL] Error checking folder permissions', [
+ 'folder_url' => $folderUrl,
+ 'error' => $e->getMessage(),
+ ]);
+ return false;
+ }
+ }
+
+ /**
+ * Create an ACL file for a folder.
+ *
+ * @param SolidIdentity $identity
+ * @param string $aclUrl
+ * @param string $aclContent
+ * @return bool
+ */
+ protected function createFolderAcl(SolidIdentity $identity, string $aclUrl, string $aclContent): bool
+ {
+ try {
+ $response = $identity->request('put', $aclUrl, $aclContent, [
+ 'headers' => [
+ 'Content-Type' => 'text/turtle',
+ ],
+ ]);
+
+ if ($response->successful()) {
+ Log::info('[ACL] Folder ACL created successfully', [
+ 'acl_url' => $aclUrl,
+ 'status' => $response->status(),
+ ]);
+ return true;
+ }
+
+ Log::error('[ACL] Failed to create folder ACL', [
+ 'acl_url' => $aclUrl,
+ 'status' => $response->status(),
+ 'body' => $response->body(),
+ ]);
+
+ return false;
+ } catch (\Throwable $e) {
+ Log::error('[ACL] Error creating folder ACL', [
+ 'acl_url' => $aclUrl,
+ 'error' => $e->getMessage(),
+ ]);
+ return false;
+ }
+ }
+
+ /**
+ * Generate ACL content for a folder with full owner permissions.
+ *
+ * @param string $folderUrl The folder URL
+ * @param string $webId The WebID to grant permissions to
+ * @return string
+ */
+ protected function generateFolderAcl(string $folderUrl, string $webId): string
+ {
+ return <<.
+
+<#owner>
+ a acl:Authorization;
+ acl:agent <{$webId}>;
+ acl:accessTo <./>;
+ acl:default <./>;
+ acl:mode acl:Read, acl:Write, acl:Control.
+TURTLE;
+ }
+
+ /**
+ * Check if a specific URL is writable (has write or append permissions).
+ *
+ * @param SolidIdentity $identity
+ * @param string $url
+ * @return bool
+ */
+ public function isWritable(SolidIdentity $identity, string $url): bool
+ {
+ try {
+ $response = $identity->request('head', $url);
+
+ if (!$response->successful()) {
+ return false;
+ }
+
+ $wacAllow = $response->header('WAC-Allow');
+
+ if ($wacAllow && preg_match('/user="([^"]*)"/i', $wacAllow, $matches)) {
+ $modes = strtolower($matches[1]);
+ $isWritable = str_contains($modes, 'write') || str_contains($modes, 'append');
+
+ Log::debug('[ACL] Writable check', [
+ 'url' => $url,
+ 'wac_allow' => $wacAllow,
+ 'is_writable' => $isWritable,
+ ]);
+
+ return $isWritable;
+ }
+
+ return false;
+ } catch (\Throwable $e) {
+ Log::debug('[ACL] Writable check failed', [
+ 'url' => $url,
+ 'error' => $e->getMessage(),
+ ]);
+ return false;
+ }
+ }
+
+ /**
+ * Find writable storage locations from user profile.
+ *
+ * @param SolidIdentity $identity
+ * @param array $profile
+ * @return array
+ */
+ public function findWritableLocations(SolidIdentity $identity, array $profile): array
+ {
+ $writableLocations = [];
+ $webId = $profile['webid'] ?? null;
+
+ if (!$webId) {
+ return $writableLocations;
+ }
+
+ // Get pod URL from WebID
+ $podUrl = $this->podService->getPodUrlFromWebId($webId);
+
+ // Check common storage locations
+ $commonLocations = [
+ 'public' => rtrim($podUrl, '/') . '/public/',
+ 'private' => rtrim($podUrl, '/') . '/private/',
+ 'inbox' => rtrim($podUrl, '/') . '/inbox/',
+ ];
+
+ foreach ($commonLocations as $name => $url) {
+ if ($this->isWritable($identity, $url)) {
+ $writableLocations[$name] = $url;
+ }
+ }
+
+ // Check storage locations from profile
+ foreach ($profile['storage_locations'] ?? [] as $storage) {
+ $storageUrl = $this->resolveStorageUrl($storage, $webId, $podUrl);
+ if ($storageUrl && $this->isWritable($identity, $storageUrl)) {
+ $writableLocations['storage_' . count($writableLocations)] = $storageUrl;
+ }
+ }
+
+ Log::info('[ACL] Found writable locations', [
+ 'count' => count($writableLocations),
+ 'locations' => $writableLocations,
+ ]);
+
+ return $writableLocations;
+ }
+
+ /**
+ * Resolve a storage URL from profile data.
+ *
+ * @param string $storage
+ * @param string $webId
+ * @param string $podUrl
+ * @return string|null
+ */
+ protected function resolveStorageUrl(string $storage, string $webId, string $podUrl): ?string
+ {
+ // Handle relative URLs
+ if ($storage === '../' || $storage === './') {
+ return $podUrl;
+ }
+
+ // Handle absolute URLs
+ if (str_starts_with($storage, 'http://') || str_starts_with($storage, 'https://')) {
+ return $storage;
+ }
+
+ // Handle relative paths
+ $webIdBase = dirname($webId);
+ return rtrim($webIdBase, '/') . '/' . ltrim($storage, '/');
+ }
}
diff --git a/server/src/Services/PodService.php b/server/src/Services/PodService.php
index b07690d..13357da 100644
--- a/server/src/Services/PodService.php
+++ b/server/src/Services/PodService.php
@@ -712,20 +712,58 @@ private function parseContainerContents(string $content): array
{
$items = [];
- // Parse contained resources
+ // Parse contained resources with ldp:contains
if (preg_match_all('/ldp:contains\s+<([^>]+)>/', $content, $matches)) {
foreach ($matches[1] as $resourceUrl) {
- $items[] = [
+ $item = [
'url' => $resourceUrl,
'name' => $this->extractPodName($resourceUrl),
'type' => substr($resourceUrl, -1) === '/' ? 'container' : 'resource',
];
+
+ // Try to extract additional metadata for this resource
+ $item = array_merge($item, $this->extractResourceMetadata($content, $resourceUrl));
+
+ $items[] = $item;
}
}
return $items;
}
+ /**
+ * Extract metadata for a specific resource from Turtle content.
+ */
+ private function extractResourceMetadata(string $content, string $resourceUrl): array
+ {
+ $metadata = [];
+
+ // Escape special regex characters in URL
+ $escapedUrl = preg_quote($resourceUrl, '/');
+
+ // Extract resource type (e.g., ldp:BasicContainer, foaf:Document)
+ if (preg_match('/<' . $escapedUrl . '>\s+a\s+([^;\s]+)/', $content, $matches)) {
+ $metadata['rdf_type'] = trim($matches[1]);
+ }
+
+ // Extract dc:title
+ if (preg_match('/<' . $escapedUrl . '>.*?dc:title\s+"([^"]+)"/', $content, $matches)) {
+ $metadata['title'] = $matches[1];
+ }
+
+ // Extract dc:modified or posix:mtime
+ if (preg_match('/<' . $escapedUrl . '>.*?(?:dc:modified|posix:mtime)\s+(\d+)/', $content, $matches)) {
+ $metadata['modified'] = (int)$matches[1];
+ }
+
+ // Extract posix:size
+ if (preg_match('/<' . $escapedUrl . '>.*?posix:size\s+(\d+)/', $content, $matches)) {
+ $metadata['size'] = (int)$matches[1];
+ }
+
+ return $metadata;
+ }
+
/**
* Generate pod metadata in Turtle format.
*/
@@ -804,6 +842,15 @@ public function createFolder(SolidIdentity $identity, string $parentUrl, string
'folder_url' => $createdUrl,
'status' => $response->status(),
]);
+
+ // Ensure the folder has proper ACL permissions
+ $aclService = app(AclService::class);
+ $webId = $identity->webid;
+
+ if ($webId) {
+ $aclService->ensureFolderPermissions($identity, $createdUrl, $webId);
+ }
+
return true;
}
diff --git a/server/src/Services/ResourceSyncService.php b/server/src/Services/ResourceSyncService.php
index d854d19..d37e771 100644
--- a/server/src/Services/ResourceSyncService.php
+++ b/server/src/Services/ResourceSyncService.php
@@ -299,6 +299,14 @@ protected function createContainer(SolidIdentity $identity, string $containerUrl
'url' => $containerUrl,
'status' => $response->status(),
]);
+
+ // Ensure the container has proper ACL permissions
+ $aclService = app(AclService::class);
+ $webId = $identity->webid;
+
+ if ($webId) {
+ $aclService->ensureFolderPermissions($identity, $containerUrl, $webId);
+ }
} catch (\Throwable $e) {
// Container might already exist, that's okay
Log::debug('[CONTAINER CREATION SKIPPED]', [