├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── bin └── build.js ├── composer.json ├── config └── filament-edit-profile.php ├── database ├── factories │ └── ModelFactory.php └── migrations │ ├── add_avatar_url_to_users_table.php.stub │ └── add_custom_fields_to_users_table.php.stub ├── package-lock.json ├── postcss.config.cjs ├── resources ├── css │ └── index.css ├── dist │ ├── .gitkeep │ ├── filament-edit-profile.css │ └── filament-edit-profile.js ├── js │ └── index.js ├── lang │ ├── ar │ │ └── default.php │ ├── cs │ │ └── default.php │ ├── de │ │ └── default.php │ ├── en │ │ └── default.php │ ├── es │ │ └── default.php │ ├── fa │ │ └── default.php │ ├── fr │ │ └── default.php │ ├── hu │ │ └── default.php │ ├── id │ │ └── default.php │ ├── it │ │ └── default.php │ ├── ja │ │ └── default.php │ ├── nl │ │ └── default.php │ ├── pl │ │ └── default.php │ ├── pt_BR │ │ └── default.php │ ├── pt_PT │ │ └── default.php │ ├── sk │ │ └── default.php │ └── tr │ │ └── default.php └── views │ ├── .gitkeep │ ├── filament │ └── pages │ │ └── edit-profile-page.blade.php │ ├── forms │ └── components │ │ ├── browser-sessions.blade.php │ │ └── delete-account-description.blade.php │ └── livewire │ ├── browser-sessions-form.blade.php │ ├── custom-fields-form.blade.php │ ├── delete-account-form.blade.php │ ├── edit-password-form.blade.php │ ├── edit-profile-form.blade.php │ └── sanctum-tokens.blade.php ├── src ├── Commands │ └── FilamentEditProfileCommand.php ├── Concerns │ ├── HasSort.php │ └── HasUser.php ├── Facades │ └── FilamentEditProfile.php ├── FilamentEditProfile.php ├── FilamentEditProfilePlugin.php ├── FilamentEditProfileServiceProvider.php ├── Livewire │ ├── BaseProfileForm.php │ ├── BrowserSessionsForm.php │ ├── CustomFieldsForm.php │ ├── DeleteAccountForm.php │ ├── EditPasswordForm.php │ ├── EditProfileForm.php │ └── SanctumTokens.php ├── Pages │ └── EditProfilePage.php └── Testing │ └── TestsFilamentEditProfile.php └── stubs ├── .gitkeep ├── EditForm.stub └── FormView.stub /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to `filament-edit-profile` will be documented in this file. 4 | 5 | ## v1.0.43 - 2025-05-21 6 | 7 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.42...v1.0.43 8 | 9 | ## v1.0.42 - 2025-05-20 10 | 11 | ### What's Changed 12 | 13 | * fix(profile): correct input field to use 'email' instead of auth identifier by @jeffersongoncalves in https://github.com/joaopaulolndev/filament-edit-profile/pull/90 14 | * fix(profile): handle missing Sanctum class in token visibility logic by @jeffersongoncalves in https://github.com/joaopaulolndev/filament-edit-profile/pull/91 15 | 16 | ### New Contributors 17 | 18 | * @jeffersongoncalves made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/90 19 | 20 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.41...v1.0.42 21 | 22 | ## v1.0.41 - 2025-05-19 23 | 24 | ### What's Changed 25 | 26 | * feat(profile): add email form visibility toggle by @andrefelipe18 in https://github.com/joaopaulolndev/filament-edit-profile/pull/88 27 | 28 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.40...v1.0.41 29 | 30 | ## v1.0.40 - 2025-05-19 31 | 32 | ### What's Changed 33 | 34 | * Call to a member function getSlug() on null by @bigraja in https://github.com/joaopaulolndev/filament-edit-profile/pull/82 35 | * Bump dependabot/fetch-metadata from 2.3.0 to 2.4.0 by @dependabot in https://github.com/joaopaulolndev/filament-edit-profile/pull/85 36 | * Use `getAuthIdentifierName()` instead of hardcoded `email` in profile… by @leandrogehlen in https://github.com/joaopaulolndev/filament-edit-profile/pull/83 37 | * Fix null plugin access in EditProfilePage when panel context is unavailable by @MiguelAngelMP10 in https://github.com/joaopaulolndev/filament-edit-profile/pull/84 38 | * Update CustomFieldsForm.php by @Emotard1991 in https://github.com/joaopaulolndev/filament-edit-profile/pull/87 39 | 40 | ### New Contributors 41 | 42 | * @bigraja made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/82 43 | * @leandrogehlen made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/83 44 | * @MiguelAngelMP10 made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/84 45 | * @Emotard1991 made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/87 46 | 47 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.39...v1.0.40 48 | 49 | ## v1.0.39 - 2025-04-22 50 | 51 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.38...v1.0.39 52 | 53 | ## v1.0.38 - 2025-04-16 54 | 55 | ### What's Changed 56 | 57 | * Simplify slug retrieval logic by @andrefelipe18 in https://github.com/joaopaulolndev/filament-edit-profile/pull/80 58 | 59 | ### New Contributors 60 | 61 | * @andrefelipe18 made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/80 62 | 63 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.37...v1.0.38 64 | 65 | ## v1.0.37 - 2025-03-27 66 | 67 | ### What's Changed 68 | 69 | * Support Laravel 12 by @patriciomartinns in https://github.com/joaopaulolndev/filament-edit-profile/pull/73 70 | * Add Japanese Language Support by @staffkojinpro in https://github.com/joaopaulolndev/filament-edit-profile/pull/77 71 | * [Bug} compatibily with Model::shouldBeStrict() by @gpibarra in https://github.com/joaopaulolndev/filament-edit-profile/pull/75 72 | 73 | ### New Contributors 74 | 75 | * @patriciomartinns made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/73 76 | * @staffkojinpro made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/77 77 | 78 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.36...v1.0.37 79 | 80 | ## v1.0.36 - 2025-02-19 81 | 82 | ### What's Changed 83 | 84 | * feat localization : add Turkish lang by @AzizEmir in https://github.com/joaopaulolndev/filament-edit-profile/pull/72 85 | 86 | ### New Contributors 87 | 88 | * @AzizEmir made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/72 89 | 90 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.35...v1.0.36 91 | 92 | ## v1.0.35 - 2025-02-12 93 | 94 | ### What's Changed 95 | 96 | * Add id to custom fields by @Ercogx in https://github.com/joaopaulolndev/filament-edit-profile/pull/68 97 | 98 | ### New Contributors 99 | 100 | * @Ercogx made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/68 101 | 102 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.34...v1.0.35 103 | 104 | ## v1.0.34 - 2025-02-07 105 | 106 | ### What's Changed 107 | 108 | * Bump dependabot/fetch-metadata from 2.2.0 to 2.3.0 by @dependabot in https://github.com/joaopaulolndev/filament-edit-profile/pull/65 109 | * Bump aglipanci/laravel-pint-action from 2.4 to 2.5 by @dependabot in https://github.com/joaopaulolndev/filament-edit-profile/pull/67 110 | * Feat: Add more property support to custom fields by @gigili in https://github.com/joaopaulolndev/filament-edit-profile/pull/64 111 | 112 | ### New Contributors 113 | 114 | * @gigili made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/64 115 | 116 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.33...v1.0.34 117 | 118 | ## v1.0.33 - 2024-12-05 119 | 120 | ### What's Changed 121 | 122 | * Refactor Configuration for Filament Profile Editing and Avatar Handling by @ludndev in https://github.com/joaopaulolndev/filament-edit-profile/pull/59 123 | 124 | ### New Contributors 125 | 126 | * @ludndev made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/59 127 | 128 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.32...v1.0.33 129 | 130 | ## v1.0.32 - 2024-11-02 131 | 132 | ### What's Changed 133 | 134 | * Add disk and visibility configuration for avatars by @rpsimao in https://github.com/joaopaulolndev/filament-edit-profile/pull/51 135 | * Fix `json_decode` type error by @mkeremcansev in https://github.com/joaopaulolndev/filament-edit-profile/pull/55 136 | * Added a method to dynamicly resolve a field from the field type by @pvdptje in https://github.com/joaopaulolndev/filament-edit-profile/pull/53 137 | 138 | ### New Contributors 139 | 140 | * @rpsimao made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/51 141 | * @mkeremcansev made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/55 142 | * @pvdptje made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/53 143 | 144 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.31...v1.0.32 145 | 146 | ## v1.0.31 - 2024-10-28 147 | 148 | ### What's Changed 149 | 150 | * feat: Czech translation by @su-din0 in https://github.com/joaopaulolndev/filament-edit-profile/pull/52 151 | 152 | ### New Contributors 153 | 154 | * @su-din0 made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/52 155 | 156 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.30...v1.0.31 157 | 158 | ## v1.0.30 - 2024-09-19 159 | 160 | ### What's Changed 161 | 162 | * Updated italian translation by @0chak in https://github.com/joaopaulolndev/filament-edit-profile/pull/48 163 | 164 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.29...v1.0.30 165 | 166 | ## v1.0.29 - 2024-09-16 167 | 168 | ### What's Changed 169 | 170 | * Add Slovak translation by @Grolicek in https://github.com/joaopaulolndev/filament-edit-profile/pull/47 171 | 172 | ### New Contributors 173 | 174 | * @Grolicek made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/47 175 | 176 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.28...v1.0.29 177 | 178 | ## v1.0.28 - 2024-09-09 179 | 180 | ### What's Changed 181 | 182 | * Add Indonesian translation by @yandearta in https://github.com/joaopaulolndev/filament-edit-profile/pull/44 183 | 184 | ### New Contributors 185 | 186 | * @yandearta made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/44 187 | 188 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.27...v1.0.28 189 | 190 | ## v1.0.27 - 2024-09-05 191 | 192 | ### What's Changed 193 | 194 | * fix: rename Portuguese language folder to pt_PT by @kidiatoliny in https://github.com/joaopaulolndev/filament-edit-profile/pull/42 195 | * fix: correct method calls in conditional checks by @kidiatoliny in https://github.com/joaopaulolndev/filament-edit-profile/pull/43 196 | 197 | ### New Contributors 198 | 199 | * @kidiatoliny made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/42 200 | 201 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.26...v1.0.27 202 | 203 | ## v1.0.26 - 2024-08-19 204 | 205 | ### What's Changed 206 | 207 | * Changed extension for migration files to test on to .php.stub by @ejjaquet in https://github.com/joaopaulolndev/filament-edit-profile/pull/40 208 | 209 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.25...v1.0.26 210 | 211 | ## v1.0.25 - 2024-08-19 212 | 213 | ### What's Changed 214 | 215 | * Added a Input of type password to the CustomFormField possibilities by @ejjaquet in https://github.com/joaopaulolndev/filament-edit-profile/pull/37 216 | * Add success notification for browser sessions logout by @carlopaa in https://github.com/joaopaulolndev/filament-edit-profile/pull/39 217 | 218 | ### New Contributors 219 | 220 | * @ejjaquet made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/37 221 | * @carlopaa made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/39 222 | 223 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.24...v1.0.25 224 | 225 | ## v1.0.24 - 2024-08-09 226 | 227 | ### What's Changed 228 | 229 | * Add Polish language / translation by @Konradx3 in https://github.com/joaopaulolndev/filament-edit-profile/pull/35 230 | 231 | ### New Contributors 232 | 233 | * @Konradx3 made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/35 234 | 235 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.23...v1.0.24 236 | 237 | ## v1.0.23 - 2024-08-01 238 | 239 | ### What's Changed 240 | 241 | * Bump dependabot/fetch-metadata from 2.1.0 to 2.2.0 by @dependabot in https://github.com/joaopaulolndev/filament-edit-profile/pull/31 242 | * fix some caps typos in German translation by @buddhaCode in https://github.com/joaopaulolndev/filament-edit-profile/pull/34 243 | 244 | ### New Contributors 245 | 246 | * @buddhaCode made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/34 247 | 248 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.22...v1.0.23 249 | 250 | ## v1.0.22 - 2024-07-13 251 | 252 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.21...v1.0.22 253 | 254 | ## v1.0.21 - 2024-07-11 255 | 256 | ### What's Changed 257 | 258 | * Add persian (farsi) language by @AryanpAzadeh in https://github.com/joaopaulolndev/filament-edit-profile/pull/25 259 | * Update CustomFieldsForm.php by @pntrivedy in https://github.com/joaopaulolndev/filament-edit-profile/pull/24 260 | 261 | ### New Contributors 262 | 263 | * @AryanpAzadeh made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/25 264 | * @pntrivedy made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/24 265 | 266 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.20...v1.0.21 267 | 268 | ## v1.0.20 - 2024-07-01 269 | 270 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.19...v1.0.20 271 | 272 | ## v1.0.19 - 2024-06-26 273 | 274 | ### What's Changed 275 | 276 | * Add Hungarian translation by @kovkor in https://github.com/joaopaulolndev/filament-edit-profile/pull/22 277 | 278 | ### New Contributors 279 | 280 | * @kovkor made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/22 281 | 282 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.18...v1.0.19 283 | 284 | ## v1.0.18 - 2024-06-26 285 | 286 | - Fixed issue when deleting account found by @PovilasKorop 287 | 288 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.17...v1.0.18 289 | 290 | ## v1.0.17 - 2024-06-25 291 | 292 | - Add pt language 293 | 294 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.16...v1.0.17 295 | 296 | ## v1.0.16 - 2024-06-23 297 | 298 | ### What's Changed 299 | 300 | * Add france and arabic languages by @ibrahimBougaoua in https://github.com/joaopaulolndev/filament-edit-profile/pull/21 301 | 302 | ### New Contributors 303 | 304 | * @ibrahimBougaoua made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/21 305 | 306 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.15...v1.0.16 307 | 308 | ## v1.0.15 - 2024-06-19 309 | 310 | ### What's Changed 311 | 312 | * Dutch and German translations by @timwassenburg in https://github.com/joaopaulolndev/filament-edit-profile/pull/19 313 | 314 | ### New Contributors 315 | 316 | * @timwassenburg made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/19 317 | 318 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.14...v1.0.15 319 | 320 | ## v1.0.14 - 2024-06-18 321 | 322 | ### What's Changed 323 | 324 | * github actions l11 and php8.3 by @gpibarra in https://github.com/joaopaulolndev/filament-edit-profile/pull/15 325 | * add method slug profile by @gpibarra in https://github.com/joaopaulolndev/filament-edit-profile/pull/18 326 | 327 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.13...v1.0.14 328 | 329 | ## v1.0.13 - 2024-06-14 330 | 331 | ### What's Changed 332 | 333 | * fix lang es by @gpibarra in https://github.com/joaopaulolndev/filament-edit-profile/pull/13 334 | * Add feature custom components by @rmsramos in https://github.com/joaopaulolndev/filament-edit-profile/pull/14 335 | 336 | ### New Contributors 337 | 338 | * @gpibarra made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/13 339 | 340 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.12...v1.0.13 341 | 342 | ## v1.0.12 - 2024-06-07 343 | 344 | ### What's Changed 345 | 346 | * Add profile avatar functionality by @alifdarsim in https://github.com/joaopaulolndev/filament-edit-profile/pull/12 347 | * Fix issue reported by @ronssij 348 | 349 | ### New Contributors 350 | 351 | * @alifdarsim made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/12 352 | 353 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.11...v1.0.12 354 | 355 | ## v1.0.11 - 2024-06-06 356 | 357 | Fix the issue reported by @alifdarsim 358 | 359 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.10...v1.0.11 360 | 361 | ## v1.0.10 - 2024-05-31 362 | 363 | - Fix issue reported by @guiireal 364 | 365 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.9...v1.0.10 366 | 367 | ## v1.0.9 - 2024-05-27 368 | 369 | ### What's Changed 370 | 371 | * Update of Spanish translations by @edeoliv in https://github.com/joaopaulolndev/filament-edit-profile/pull/8 372 | 373 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.8...v1.0.9 374 | 375 | ## v1.0.8 - 2024-05-25 376 | 377 | ### What's Changed 378 | 379 | * Add feature browser sessions by @rmsramos in https://github.com/joaopaulolndev/filament-edit-profile/pull/7 380 | 381 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.7...v1.0.8 382 | 383 | ## v1.0.7 - 2024-05-25 384 | 385 | - Fixed bug when saving custom fields reported by @billmn 386 | 387 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.6...v1.0.7 388 | 389 | ## v1.0.6 - 2024-05-25 390 | 391 | - Fixed issue https://github.com/joaopaulolndev/filament-edit-profile/issues/6 reported by @billmn 392 | 393 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.5...v1.0.6 394 | 395 | ## v1.0.5 - 2024-05-24 396 | 397 | ### What's Changed 398 | 399 | * Add Spanish translation by @edeoliv in https://github.com/joaopaulolndev/filament-edit-profile/pull/5 400 | 401 | ### New Contributors 402 | 403 | * @edeoliv made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/5 404 | 405 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.4...v1.0.5 406 | 407 | ## v1.0.4 - 2024-05-24 408 | 409 | ### What's Changed 410 | 411 | * Add italian translation by @0chak in https://github.com/joaopaulolndev/filament-edit-profile/pull/4 412 | 413 | ### New Contributors 414 | 415 | * @0chak made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/4 416 | 417 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.3...v1.0.4 418 | 419 | ## v1.0.3 - 2024-05-23 420 | 421 | - Add Sanctum Personal Access Token - Developed by @rmsramos 422 | 423 | ### What's Changed 424 | 425 | * Develop by @rmsramos in https://github.com/joaopaulolndev/filament-edit-profile/pull/3 426 | 427 | ### New Contributors 428 | 429 | * @rmsramos made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/3 430 | 431 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.2...v1.0.3 432 | 433 | ## v1.0.2 - 2024-05-22 434 | 435 | - Add Custom Fields Feature 436 | 437 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.1...v1.0.2 438 | 439 | ## v1.0.1 - 2024-05-20 440 | 441 | - Add shouldShowDeleteAccountForm feature 442 | 443 | ### What's Changed 444 | 445 | * Bump dependabot/fetch-metadata from 1.6.0 to 2.1.0 by @dependabot in https://github.com/joaopaulolndev/filament-edit-profile/pull/1 446 | * Add shouldShowDeleteAccountForm functionality by @kdrmlhcn in https://github.com/joaopaulolndev/filament-edit-profile/pull/2 447 | 448 | ### New Contributors 449 | 450 | * @dependabot made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/1 451 | * @kdrmlhcn made their first contribution in https://github.com/joaopaulolndev/filament-edit-profile/pull/2 452 | 453 | **Full Changelog**: https://github.com/joaopaulolndev/filament-edit-profile/compare/v1.0.0...v1.0.1 454 | 455 | ## 1.0.0 - 202X-XX-XX 456 | 457 | - initial release 458 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) joaopaulolndev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Filament package to edit profile 2 | 3 | [![Latest Version on Packagist](https://img.shields.io/packagist/v/joaopaulolndev/filament-edit-profile.svg?style=flat-square)](https://packagist.org/packages/joaopaulolndev/filament-edit-profile) 4 | [![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/joaopaulolndev/filament-edit-profile/run-tests.yml?branch=main&label=tests&style=flat-square)](https://github.com/joaopaulolndev/filament-edit-profile/actions?query=workflow%3Arun-tests+branch%3Amain) 5 | [![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/joaopaulolndev/filament-edit-profile/fix-php-code-style-issues.yml?branch=main&label=code%20style&style=flat-square)](https://github.com/joaopaulolndev/filament-edit-profile/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain) 6 | [![Total Downloads](https://img.shields.io/packagist/dt/joaopaulolndev/filament-edit-profile.svg?style=flat-square)](https://packagist.org/packages/joaopaulolndev/filament-edit-profile) 7 | 8 | The Filament library is a user-friendly tool that simplifies profile editing, offering an intuitive interface and robust features to easily customize and manage user information. 9 |
10 | 11 | ![Screenshot of Application Feature](https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/main/art/joaopaulolndev-filament-edit-profile.jpg) 12 | 13 |
14 | 15 | ## Features & Screenshots 16 | 17 | - **Edit Information:** Manage your information such as email, and password. 18 | - **Change Password:** Change your password. 19 | - **Profile Photo:** Upload and manage your profile photo. 20 | - **Delete Account:** Manage your account, such as delete account. 21 | - **Sanctum Personal Access tokens:** Manage your personal access tokens. 22 | - **Browser Sessions** Manage and log out your active sessions on other browsers and devices. 23 | - **Custom Fields:** Add custom fields to the form. 24 | - **Custom Components:** Add custom component to the page. 25 | - **Support**: [Laravel 11](https://laravel.com) and [Filament 3.x](https://filamentphp.com) 26 | 27 | ## Installation 28 | 29 | You can install the package via composer: 30 | 31 | ```bash 32 | composer require joaopaulolndev/filament-edit-profile 33 | ``` 34 | 35 | You can publish and run the migrations with: 36 | 37 | Optionally, you can publish the views using 38 | 39 | ```bash 40 | php artisan vendor:publish --tag="filament-edit-profile-views" 41 | ``` 42 | 43 | Optionally, you can publish the translations using 44 | 45 | ```bash 46 | php artisan vendor:publish --tag="filament-edit-profile-translations" 47 | ``` 48 | 49 | You can publish and run all the migrations with: 50 | 51 | ```bash 52 | php artisan vendor:publish --tag="filament-edit-profile-migrations" 53 | php artisan migrate 54 | ``` 55 | 56 | You can publish the config file with: 57 | 58 | ```bash 59 | php artisan vendor:publish --tag="filament-edit-profile-config" 60 | ``` 61 | 62 | ## Usage 63 | 64 | Add in AdminPanelProvider.php 65 | 66 | ```php 67 | use Joaopaulolndev\FilamentEditProfile\FilamentEditProfilePlugin; 68 | 69 | ->plugins([ 70 | FilamentEditProfilePlugin::make() 71 | ]) 72 | ``` 73 | 74 | if you want to show for specific parameters to sort, icon, title, navigation group, navigation label and can access, you can use the following example: 75 | 76 | ```php 77 | use Joaopaulolndev\FilamentEditProfile\FilamentEditProfilePlugin; 78 | 79 | ->plugins([ 80 | FilamentEditProfilePlugin::make() 81 | ->slug('my-profile') 82 | ->setTitle('My Profile') 83 | ->setNavigationLabel('My Profile') 84 | ->setNavigationGroup('Group Profile') 85 | ->setIcon('heroicon-o-user') 86 | ->setSort(10) 87 | ->canAccess(fn () => auth()->user()->id === 1) 88 | ->shouldRegisterNavigation(false) 89 | ->shouldShowEmailForm() 90 | ->shouldShowDeleteAccountForm(false) 91 | ->shouldShowSanctumTokens() 92 | ->shouldShowBrowserSessionsForm() 93 | ->shouldShowAvatarForm() 94 | ->customProfileComponents([ 95 | \App\Livewire\CustomProfileComponent::class, 96 | ]) 97 | ]) 98 | ``` 99 | 100 | Optionally, you can add a user menu item to the user menu in the navigation bar: 101 | 102 | ```php 103 | use Filament\Navigation\MenuItem; 104 | use Joaopaulolndev\FilamentEditProfile\Pages\EditProfilePage; 105 | 106 | ->userMenuItems([ 107 | 'profile' => MenuItem::make() 108 | ->label(fn() => auth()->user()->name) 109 | ->url(fn (): string => EditProfilePage::getUrl()) 110 | ->icon('heroicon-m-user-circle') 111 | //If you are using tenancy need to check with the visible method where ->company() is the relation between the user and tenancy model as you called 112 | ->visible(function (): bool { 113 | return auth()->user()->company()->exists(); 114 | }), 115 | ]) 116 | ``` 117 | 118 | If needed you can define the disk and visibility of the avatar image. In the config file add the following: 119 | 120 | [config/filament-edit-profile.php](config/filament-edit-profile.php) 121 | 122 | ```php 123 | return [ 124 | 'disk' => env('FILESYSTEM_DISK', 'public'), 125 | 'visibility' => 'public', // or replace by filesystem disk visibility with fallback value 126 | ]; 127 | ``` 128 | 129 | 130 | ## Profile Avatar 131 | 132 | ![Screenshot of avatar Feature](https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/main/art/profile-avatar.png) 133 | Show the user avatar form using `shouldShowAvatarForm()`. This package follows the [Filament user avatar](https://filamentphp.com/docs/3.x/panels/users#setting-up-user-avatars) to manage the avatar. 134 | 135 | To show the avatar form, you need the following steps: 136 | 137 | 1. Publish the migration file to add the avatar_url field to the users table: 138 | 139 | ```bash 140 | php artisan vendor:publish --tag="filament-edit-profile-avatar-migration" 141 | php artisan migrate 142 | ``` 143 | 144 | 2. Add in your User model the avatar_url field in the fillable array: 145 | 146 | ```php 147 | protected $fillable = [ 148 | 'name', 149 | 'email', 150 | 'password', 151 | 'avatar_url', // or column name according to config('filament-edit-profile.avatar_column', 'avatar_url') 152 | ]; 153 | ``` 154 | 155 | 3. Set the getFilamentAvatarUrlAttribute method in your User model: 156 | 157 | ```php 158 | use Filament\Models\Contracts\HasAvatar; 159 | use Illuminate\Support\Facades\Storage; 160 | 161 | class User extends Authenticatable implements HasAvatar 162 | { 163 | // ... 164 | public function getFilamentAvatarUrl(): ?string 165 | { 166 | $avatarColumn = config('filament-edit-profile.avatar_column', 'avatar_url'); 167 | return $this->$avatarColumn ? Storage::url($this->$avatarColumn) : null; 168 | } 169 | } 170 | ``` 171 | 172 | 4. Optionally, you can specify the image directory path and file upload rules. : 173 | 174 | ```php 175 | ->shouldShowAvatarForm( 176 | value: true, 177 | directory: 'avatars', // image will be stored in 'storage/app/public/avatars 178 | rules: 'mimes:jpeg,png|max:1024' //only accept jpeg and png files with a maximum size of 1MB 179 | ) 180 | ``` 181 | 182 | 5. Don't forget to run the command `php artisan storage:link` 183 | 184 | ## Sanctum Personal Access tokens 185 | 186 | Show the Sanctum token management component: 187 | 188 | Please review [Laravel Sanctum Docs](https://laravel.com/docs/11.x/sanctum) 189 | 190 | You may install Laravel Sanctum via the `install:api` Artisan command: 191 | 192 | ```bash 193 | php artisan install:api 194 | ``` 195 | 196 | Sanctum allows you to issue API tokens / personal access tokens that may be used to authenticate API requests to your application. When making requests using API tokens, the token should be included in the Authorization header as a Bearer token. 197 | 198 | ```php 199 | use Laravel\Sanctum\HasApiTokens; 200 | 201 | class User extends Authenticatable 202 | { 203 | use HasApiTokens, HasFactory, Notifiable; 204 | } 205 | ``` 206 | 207 | ![Screenshot of Application Feature](https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/main/art/sanctum_tokens.png) 208 | 209 | If you want to control access, you can use `condition`, passing Closure or Boolean 210 | 211 | Sanctum allows you to assign "abilities" to tokens. by default we have ['create', 'view', 'update', 'delete'] use `permissions` to customize 212 | 213 | ```php 214 | ->plugins([ 215 | FilamentEditProfilePlugin::make() 216 | ->shouldShowSanctumTokens( 217 | condition: fn() => auth()->user()->id === 1, //optional 218 | permissions: ['custom', 'abilities', 'permissions'] //optional 219 | ) 220 | ]) 221 | ``` 222 | 223 | ## Browser Sessions 224 | 225 | ![Screenshot of Application Feature](https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/main/art/browser-sessions.png) 226 | 227 | To utilize browser session, ensure that your session configuration's driver (or SESSION_DRIVER environment variable) is set to `database`. 228 | 229 | ```env 230 | SESSION_DRIVER=database 231 | ``` 232 | 233 | If you want to control access or disable browser sessions, you can pass a Closure or Boolean 234 | 235 | ```php 236 | ->plugins([ 237 | FilamentEditProfilePlugin::make() 238 | ->shouldShowBrowserSessionsForm( 239 | fn() => auth()->user()->id === 1, //optional 240 | //OR 241 | false //optional 242 | ) 243 | ]) 244 | ``` 245 | 246 | ## Custom Fields 247 | 248 | ![Screenshot of Application Feature](https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/main/art/custom_fields.png) 249 | Optionally, you can add custom fields to the form. 250 | To create custom fields you need to follow the steps below: 251 | 252 | 1. Publish the migration file to add the custom fields to the users table: 253 | 254 | ```bash 255 | php artisan vendor:publish --tag="filament-edit-profile-custom-field-migration" 256 | php artisan migrate 257 | ``` 258 | 259 | 2. Add in your User model the custom field in the fillable array: 260 | 261 | ```php 262 | protected $fillable = [ 263 | 'name', 264 | 'email', 265 | 'password', 266 | 'custom_fields', 267 | ]; 268 | ``` 269 | 270 | 3. Add in your User model the custom field in the casts array: 271 | 272 | ```php 273 | protected function casts(): array 274 | { 275 | return [ 276 | 'email_verified_at' => 'datetime', 277 | 'password' => 'hashed', 278 | 'custom_fields' => 'array' 279 | ]; 280 | } 281 | ``` 282 | 283 | 5. Publish the config file using this command: 284 | 285 | ```bash 286 | php artisan vendor:publish --tag="filament-edit-profile-config" 287 | ``` 288 | 289 | 6. Edit the config file `config/filament-edit-profile.php` to add the custom fields to the form as example below: 290 | 291 | ```php 292 | true, 296 | 'custom_fields' => [ 297 | 'custom_field_1' => [ 298 | 'type' => 'text', // required 299 | 'label' => 'Custom Textfield 1', // required 300 | 'placeholder' => 'Custom Field 1', // optional 301 | 'id' => 'custom-field-1', // optional 302 | 'required' => true, // optional 303 | 'rules' => [], // optional 304 | 'hint_icon' => '', // optional 305 | 'hint' => '', // optional 306 | 'suffix_icon' => '', // optional 307 | 'prefix_icon' => '', // optional 308 | 'default' => '', // optional 309 | 'column_span' => 'full', // optional 310 | 'autocomplete' => false, // optional 311 | ], 312 | 'custom_field_2' => [ 313 | 'type' => 'password', // required 314 | 'label' => 'Custom Password field 2', // required 315 | 'placeholder' => 'Custom Password Field 2', // optional 316 | 'id' => 'custom-field-2', // optional 317 | 'required' => true, // optional 318 | 'rules' => [], // optional 319 | 'hint_icon' => '', // optional 320 | 'hint' => '', // optional 321 | 'default' => '', // optional 322 | 'column_span' => 'full', 323 | 'revealable' => true, // optional 324 | 'autocomplete' => true, // optional 325 | ], 326 | 'custom_field_3' => [ 327 | 'type' => 'select', // required 328 | 'label' => 'Custom Select 3', // required 329 | 'placeholder' => 'Select', // optional 330 | 'id' => 'custom-field-3', // optional 331 | 'required' => true, // optional 332 | 'options' => [ 333 | 'option_1' => 'Option 1', 334 | 'option_2' => 'Option 2', 335 | 'option_3' => 'Option 3', 336 | ], // optional 337 | 'selectable_placeholder' => true // optional 338 | 'native' => true // optional 339 | 'preload' => true // optional 340 | 'suffix_icon' => '', // optional 341 | 'default' => '', // optional 342 | 'searchable' => true, // optional 343 | 'column_span' => 'full', // optional 344 | 'rules' => [], // optional 345 | 'hint_icon' => '', // optional 346 | 'hint' => '', // optional 347 | ], 348 | 'custom_field_4' => [ 349 | 'type' =>'textarea', // required 350 | 'label' => 'Custom Textarea 4', // required 351 | 'placeholder' => 'Textarea', // optional 352 | 'id' => 'custom-field-4', // optional 353 | 'rows' => '3', // optional 354 | 'required' => true, // optional 355 | 'hint_icon' => '', // optional 356 | 'hint' => '', // optional 357 | 'default' => '', // optional 358 | 'rules' => [], // optional 359 | 'column_span' => 'full', // optional 360 | ], 361 | 'custom_field_5' => [ 362 | 'type' => 'datetime', // required 363 | 'label' => 'Custom Datetime 5', // required 364 | 'placeholder' => 'Datetime', // optional 365 | 'id' => 'custom-field-5', // optional 366 | 'seconds' => false, // optional 367 | 'required' => true, // optional 368 | 'hint_icon' => '', // optional 369 | 'hint' => '', // optional 370 | 'default' => '', // optional 371 | 'suffix_icon' => '', // optional 372 | 'prefix_icon' => '', // optional 373 | 'rules' => [], // optional 374 | 'format' => 'Y-m-d H:i:s', // optional 375 | 'time' => true, // optional 376 | 'native' => true, // optional 377 | 'column_span' => 'full', // optional 378 | ], 379 | 'custom_field_6' => [ 380 | 'type' => 'boolean', // required 381 | 'label' => 'Custom Boolean 6', // required 382 | 'placeholder' => 'Boolean', // optional 383 | 'id' => 'custom-field-6', // optional 384 | 'hint_icon' => '', // optional 385 | 'hint' => '', // optional 386 | 'default' => '', // optional 387 | 'rules' => [], // optional 388 | 'column_span' => 'full', // optional 389 | ], 390 | ] 391 | ]; 392 | ``` 393 | 394 | ## Custom Components 395 | 396 | If you need more control over your profile edit fields, you can create a custom component. To make this process easier, just use the artisan command. 397 | 398 | > [!NOTE] 399 | > If you are not confident in using custom components, please review [Filament Docs](https://filamentphp.com/docs/3.x/forms/adding-a-form-to-a-livewire-component) 400 | 401 | ```bash 402 | php artisan make:edit-profile-form CustomProfileComponent 403 | ``` 404 | 405 | This will generate a new `app/Livewire/CustomProfileComponent.php` component and a new `resources/views/livewire/custom-profile-component.blade.php` view which you can customize. 406 | 407 | Now in your `Panel Provider`, register the new component. 408 | 409 | ```php 410 | ->plugins([ 411 | FilamentEditProfilePlugin::make() 412 | ->customProfileComponents([ 413 | \App\Livewire\CustomProfileComponent::class, 414 | ]); 415 | ]) 416 | ``` 417 | 418 | ## Testing 419 | 420 | ```bash 421 | composer test 422 | ``` 423 | 424 | ## Changelog 425 | 426 | Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently. 427 | 428 | ## Contributing 429 | 430 | Please see [CONTRIBUTING](.github/CONTRIBUTING.md) for details. 431 | 432 | ## Security Vulnerabilities 433 | 434 | Please review [our security policy](../../security/policy) on how to report security vulnerabilities. 435 | 436 | ## Credits 437 | 438 | - [João Paulo Leite Nascimento](https://github.com/joaopaulolndev) 439 | - [All Contributors](../../contributors) 440 | 441 | ## License 442 | 443 | The MIT License (MIT). Please see [License File](LICENSE.md) for more information. 444 | -------------------------------------------------------------------------------- /bin/build.js: -------------------------------------------------------------------------------- 1 | import esbuild from 'esbuild' 2 | 3 | const isDev = process.argv.includes('--dev') 4 | 5 | async function compile(options) { 6 | const context = await esbuild.context(options) 7 | 8 | if (isDev) { 9 | await context.watch() 10 | } else { 11 | await context.rebuild() 12 | await context.dispose() 13 | } 14 | } 15 | 16 | const defaultOptions = { 17 | define: { 18 | 'process.env.NODE_ENV': isDev ? `'development'` : `'production'`, 19 | }, 20 | bundle: true, 21 | mainFields: ['module', 'main'], 22 | platform: 'neutral', 23 | sourcemap: isDev ? 'inline' : false, 24 | sourcesContent: isDev, 25 | treeShaking: true, 26 | target: ['es2020'], 27 | minify: !isDev, 28 | plugins: [{ 29 | name: 'watchPlugin', 30 | setup: function (build) { 31 | build.onStart(() => { 32 | console.log(`Build started at ${new Date(Date.now()).toLocaleTimeString()}: ${build.initialOptions.outfile}`) 33 | }) 34 | 35 | build.onEnd((result) => { 36 | if (result.errors.length > 0) { 37 | console.log(`Build failed at ${new Date(Date.now()).toLocaleTimeString()}: ${build.initialOptions.outfile}`, result.errors) 38 | } else { 39 | console.log(`Build finished at ${new Date(Date.now()).toLocaleTimeString()}: ${build.initialOptions.outfile}`) 40 | } 41 | }) 42 | } 43 | }], 44 | } 45 | 46 | compile({ 47 | ...defaultOptions, 48 | entryPoints: ['./resources/js/index.js'], 49 | outfile: './resources/dist/filament-edit-profile.js', 50 | }) 51 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "joaopaulolndev/filament-edit-profile", 3 | "description": "Filament package to edit profile", 4 | "keywords": [ 5 | "joaopaulolndev", 6 | "laravel", 7 | "filament-edit-profile" 8 | ], 9 | "homepage": "https://github.com/joaopaulolndev/filament-edit-profile", 10 | "support": { 11 | "issues": "https://github.com/joaopaulolndev/filament-edit-profile/issues", 12 | "source": "https://github.com/joaopaulolndev/filament-edit-profile" 13 | }, 14 | "license": "MIT", 15 | "authors": [ 16 | { 17 | "name": "João Paulo Leite Nascimento", 18 | "email": "joaopauloln7@gmail.com", 19 | "role": "Developer" 20 | } 21 | ], 22 | "require": { 23 | "php": "^8.1", 24 | "filament/filament": "^3.0", 25 | "jenssegers/agent": "^2.6", 26 | "spatie/laravel-package-tools": "^1.15.0" 27 | }, 28 | "require-dev": { 29 | "laradumps/laradumps": "^3.1", 30 | "laravel/pint": "^1.0", 31 | "nunomaduro/collision": "^7.9|^8.6", 32 | "orchestra/testbench": "^8.0|^9.0|^10.0", 33 | "pestphp/pest": "^2.1|^3.4.7", 34 | "pestphp/pest-plugin-arch": "^2.0|^3.0", 35 | "pestphp/pest-plugin-laravel": "^2.0|^3.1.0" 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "Joaopaulolndev\\FilamentEditProfile\\": "src/", 40 | "Joaopaulolndev\\FilamentEditProfile\\Database\\Factories\\": "database/factories/" 41 | } 42 | }, 43 | "autoload-dev": { 44 | "psr-4": { 45 | "Joaopaulolndev\\FilamentEditProfile\\Tests\\": "tests/" 46 | } 47 | }, 48 | "scripts": { 49 | "post-autoload-dump": "@php ./vendor/bin/testbench package:discover --ansi", 50 | "test": "vendor/bin/pest", 51 | "test-coverage": "vendor/bin/pest --coverage", 52 | "format": "vendor/bin/pint" 53 | }, 54 | "config": { 55 | "sort-packages": true, 56 | "allow-plugins": { 57 | "pestphp/pest-plugin": true, 58 | "phpstan/extension-installer": true 59 | } 60 | }, 61 | "extra": { 62 | "laravel": { 63 | "providers": [ 64 | "Joaopaulolndev\\FilamentEditProfile\\FilamentEditProfileServiceProvider" 65 | ], 66 | "aliases": { 67 | "FilamentEditProfile": "Joaopaulolndev\\FilamentEditProfile\\Facades\\FilamentEditProfile" 68 | } 69 | } 70 | }, 71 | "minimum-stability": "dev", 72 | "prefer-stable": true 73 | } 74 | -------------------------------------------------------------------------------- /config/filament-edit-profile.php: -------------------------------------------------------------------------------- 1 | 'avatar_url', 5 | 'disk' => env('FILESYSTEM_DISK', 'public'), 6 | 'visibility' => 'public', // or replace by filesystem disk visibility with fallback value 7 | ]; 8 | -------------------------------------------------------------------------------- /database/factories/ModelFactory.php: -------------------------------------------------------------------------------- 1 | string(config('filament-edit-profile.avatar_column', 'avatar_url'))->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('users', function (Blueprint $table) { 25 | $table->dropColumn(config('filament-edit-profile.avatar_column', 'avatar_url')); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /database/migrations/add_custom_fields_to_users_table.php.stub: -------------------------------------------------------------------------------- 1 | json('custom_fields')->nullable(); 16 | }); 17 | } 18 | 19 | /** 20 | * Reverse the migrations. 21 | */ 22 | public function down(): void 23 | { 24 | Schema::table('users', function (Blueprint $table) { 25 | $table->dropColumn('custom_fields'); 26 | }); 27 | } 28 | }; 29 | -------------------------------------------------------------------------------- /postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | "postcss-import": {}, 4 | "tailwindcss/nesting": {}, 5 | tailwindcss: {}, 6 | autoprefixer: {}, 7 | }, 8 | } 9 | -------------------------------------------------------------------------------- /resources/css/index.css: -------------------------------------------------------------------------------- 1 | @import '../../vendor/filament/filament/resources/css/theme.css'; 2 | -------------------------------------------------------------------------------- /resources/dist/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/418f6e202fc6927222e6744f0ac82a744c23443e/resources/dist/.gitkeep -------------------------------------------------------------------------------- /resources/dist/filament-edit-profile.css: -------------------------------------------------------------------------------- 1 | /*! tailwindcss v3.4.3 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[data-field-wrapper]{scroll-margin-top:8rem}*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.ms-3{margin-inline-start:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.w-1\/3{width:33.333333%}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity))}@media (prefers-color-scheme:dark){.dark\:text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}} -------------------------------------------------------------------------------- /resources/dist/filament-edit-profile.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/418f6e202fc6927222e6744f0ac82a744c23443e/resources/dist/filament-edit-profile.js -------------------------------------------------------------------------------- /resources/js/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/418f6e202fc6927222e6744f0ac82a744c23443e/resources/js/index.js -------------------------------------------------------------------------------- /resources/lang/ar/default.php: -------------------------------------------------------------------------------- 1 | 'تحرير الملف الشخصي', 5 | 'profile_information' => 'معلومات الملف الشخصي', 6 | 'profile_information_description' => 'قم بتحديث معلومات الملف الشخصي لحسابك وعنوان بريدك الإلكتروني.', 7 | 'name' => 'الاسم', 8 | 'email' => 'البريد الإلكتروني', 9 | 'avatar' => 'صورة', 10 | 'password' => 'كلمة المرور', 11 | 'update_password' => 'تحديث كلمة المرور', 12 | 'current_password' => 'كلمة المرور الحالية', 13 | 'new_password' => 'كلمة المرور الجديدة', 14 | 'confirm_password' => 'تأكيد كلمة المرور', 15 | 'ensure_your_password' => 'تأكد من أن حسابك يستخدم كلمة مرور طويلة وعشوائية ليظل آمنًا.', 16 | 'delete_account' => 'حذف الحساب', 17 | 'delete_account_description' => 'احذف حسابك نهائيًا.', 18 | 'yes_delete_it' => 'نعم، احذفه!', 19 | 'are_you_sure' => 'هل أنت متأكد من رغبتك في حذف حسابك؟ هذا لا يمكن التراجع عنها!', 20 | 'incorrect_password' => 'كلمة المرور التي أدخلتها غير صحيحة. حاول مرة اخرى.', 21 | 'user_load_error' => 'يجب أن يكون كائن المستخدم المصادق عليه نموذج Eloquent للسماح لصفحة الملف الشخصي بتحديثه.', 22 | 'delete_account_card_description' => 'بمجرد حذف حسابك، سيتم مسح جميع مواردك وبياناتك نهائيًا. قبل حذف حسابك، يرجى تنزيل أي بيانات أو معلومات ترغب في الاحتفاظ بها.', 23 | 'saved_successously' => 'تم حفظ معلومات ملفك الشخصي بنجاح.', 24 | 'custom_fields' => 'حقول مخصصة', 25 | 'custom_fields_description' => 'قم بتحديث حقولك المخصصة.', 26 | 'save' => 'حفظ', 27 | 'token_name' => 'اسم الرمز المميز', 28 | 'token_abilities' => 'القدرات', 29 | 'token_created_at' => 'تم الإنشاء في', 30 | 'token_expires_at' => 'تنتهي صلاحيته عند', 31 | 'token_section_title' => 'رموز واجهة برمجة التطبيقات', 32 | 'token_section_description' => 'إدارة الرموز المميزة لواجهة برمجة التطبيقات التي تسمح لخدمات الجهات الخارجية بالوصول إلى هذا التطبيق نيابة عنك.', 33 | 'token_action_label' => 'إنشاء رمز مميز', 34 | 'token_modal_heading' => 'إنشاء', 35 | 'token_create_notification' => 'تم إنشاء الرمز المميز بنجاح!', 36 | 'token_helper_text' => 'يظهر رمزك المميز مرة واحدة فقط عند الإنشاء. إذا فقدت الرمز المميز الخاص بك، فسوف تحتاج إلى حذفه وإنشاء رمز جديد.', 37 | 'token_modal_heading_2' => 'نسخ رمز الوصول الشخصي', 38 | 'token_empty_state_heading' => 'إنشاء الرمز المميز الأول الخاص بك', 39 | 'token_empty_state_description' => 'أنشئ رمز وصول شخصي للبدء.', 40 | 'browser_section_title' => 'جلسات المتصفح', 41 | 'browser_section_description' => 'إدارة جلساتك النشطة وتسجيل الخروج منها على المتصفحات والأجهزة الأخرى.', 42 | 'browser_sessions_content' => 'إذا لزم الأمر، يمكنك تسجيل الخروج من جميع جلسات المتصفح الأخرى عبر جميع أجهزتك. بعض جلساتك الأخيرة مذكورة أدناه؛ ومع ذلك، قد لا تكون هذه القائمة شاملة. إذا شعرت أن حسابك قد تم اختراقه، فيجب عليك أيضًا تحديث كلمة المرور الخاصة بك.', 43 | 'browser_sessions_device' => 'هذا الجهاز', 44 | 'browser_sessions_last_active' => 'آخر نشاط', 45 | 'browser_sessions_log_out' => 'تسجيل الخروج من جلسات المتصفح الأخرى', 46 | 'browser_sessions_confirm_pass' => 'يُرجى إدخال كلمة المرور الخاصة بك لتأكيد رغبتك في تسجيل الخروج من جلسات المتصفح الأخرى عبر جميع أجهزتك.', 47 | 'browser_sessions_logout_success_notification' => 'تم تسجيل الخروج من جميع جلسات المتصفح الأخرى بنجاح.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/cs/default.php: -------------------------------------------------------------------------------- 1 | 'Upravit profil', 5 | 'profile_information' => 'Základní informace', 6 | 'profile_information_description' => 'Upravte informace o svém profilu a e-mailovou adresu.', 7 | 'name' => 'Jméno', 8 | 'email' => 'E-mail', 9 | 'avatar' => 'Fotografie', 10 | 'password' => 'Heslo', 11 | 'update_password' => 'Aktualizovat heslo', 12 | 'current_password' => 'Současné heslo', 13 | 'new_password' => 'Nové heslo', 14 | 'confirm_password' => 'Potvrďte nové heslo', 15 | 'ensure_your_password' => 'Zajistěte, aby váš účet používal dlouhé a náhodné heslo, a zůstaňte tak v bezpečí.', 16 | 'delete_account' => 'Odstranit účet', 17 | 'delete_account_description' => 'Trvale vymazat účet.', 18 | 'yes_delete_it' => 'Ano, vymazat účet!', 19 | 'are_you_sure' => 'Opravdu chcete svůj účet smazat? Tato akce je nevratná.', 20 | 'incorrect_password' => 'Zadané heslo bylo nesprávné. Zkuste to prosím znovu.', 21 | 'user_load_error' => 'Uživatele musí být modelem Eloquent, aby jej stránka profilu mohla aktualizovat.', 22 | 'delete_account_card_description' => 'Po smazání účtu budou všechny vaše prostředky a data trvale vymazány. Před odstraněním účtu si stáhněte všechna data nebo informace, které si přejete zachovat.', 23 | 'saved_successfully' => 'Informace o vašem profilu byly úspěšně uloženy.', 24 | 'custom_fields' => 'Vlastní pole', 25 | 'custom_fields_description' => 'Upravit vlastní pole.', 26 | 'save' => 'Uložit', 27 | 'token_name' => 'Název tokenu', 28 | 'token_abilities' => 'Oprávnění', 29 | 'token_created_at' => 'Vytvořen', 30 | 'token_expires_at' => 'Vyprší', 31 | 'token_section_title' => 'API Tokeny', 32 | 'token_section_description' => 'Spravujte tokeny API, které umožňují službám třetích stran přistupovat k této aplikaci vašim jménem.', 33 | 'token_action_label' => 'Vytvořit token', 34 | 'token_modal_heading' => 'Vytvořit', 35 | 'token_create_notification' => 'Token byl úspěšně vytvořen!', 36 | 'token_helper_text' => 'Token je možné zobrazit pouze jednou. Pokud svůj token ztratíte, musíte jej smazat a vytvořit nový.', 37 | 'token_modal_heading_2' => 'Zkopírovat osobní přístupový token', 38 | 'token_empty_state_heading' => 'Vytvořit první token', 39 | 'token_empty_state_description' => 'Vytvořte si osobní přístupový token a začněte.', 40 | 'browser_section_title' => 'Relace prohlížeče', 41 | 'browser_section_description' => 'Spravujte a odhlašujte své aktivní relace v jiných prohlížečích a zařízeních.', 42 | 'browser_sessions_content' => 'V případě potřeby se můžete odhlásit ze všech ostatních relací na všech svých zařízeních. Některé z vašich posledních relací jsou uvedeny níže; tento seznam však nemusí být úplný. Pokud máte pocit, že byl váš účet kompromitován, měli byste také aktualizovat své heslo.', 43 | 'browser_sessions_device' => 'Toto zařízení', 44 | 'browser_sessions_last_active' => 'Naposledy aktivní', 45 | 'browser_sessions_log_out' => 'Odhlášení ostatních relací', 46 | 'browser_sessions_confirm_pass' => 'Zadejte své heslo a potvrďte, že se chcete odhlásit z ostatních relací ve všech zařízeních.', 47 | 'browser_sessions_logout_success_notification' => 'Všechny ostatní relace byly úspěšně odhlášeny.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/de/default.php: -------------------------------------------------------------------------------- 1 | 'Profil bearbeiten', 5 | 'profile_information' => 'Profilinformationen', 6 | 'profile_information_description' => 'Aktualisieren Sie Ihre Kontoprofilinformationen und E-Mail-Adresse.', 7 | 'name' => 'Name', 8 | 'email' => 'E-Mail', 9 | 'avatar' => 'Foto', 10 | 'password' => 'Passwort', 11 | 'update_password' => 'Passwort aktualisieren', 12 | 'current_password' => 'Aktuelles Passwort', 13 | 'new_password' => 'Neues Passwort', 14 | 'confirm_password' => 'Passwort bestätigen', 15 | 'ensure_your_password' => 'Stellen Sie sicher, dass Ihr Konto ein langes, zufälliges Passwort verwendet, um sicher zu bleiben.', 16 | 'delete_account' => 'Konto löschen', 17 | 'delete_account_description' => 'Löschen Sie Ihr Konto dauerhaft.', 18 | 'yes_delete_it' => 'Ja, löschen!', 19 | 'are_you_sure' => 'Sind Sie sicher, dass Sie Ihr Konto löschen möchten? Dies kann nicht rückgängig gemacht werden!', 20 | 'incorrect_password' => 'Das eingegebene Passwort ist falsch. Bitte versuchen Sie es erneut.', 21 | 'user_load_error' => 'Das authentifizierte Benutzerobjekt muss ein Eloquent-Modell sein, um die Profilseite aktualisieren zu können.', 22 | 'delete_account_card_description' => 'Sobald Ihr Konto gelöscht ist, werden alle Ihre Ressourcen und Daten dauerhaft gelöscht. Laden Sie vor dem Löschen Ihres Kontos alle Daten oder Informationen herunter, die Sie behalten möchten.', 23 | 'saved_successfully' => 'Ihre Profilinformationen wurden erfolgreich gespeichert.', 24 | 'custom_fields' => 'Benutzerdefinierte Felder', 25 | 'custom_fields_description' => 'Aktualisieren Sie Ihre benutzerdefinierten Felder.', 26 | 'save' => 'Speichern', 27 | 'token_name' => 'Token-Name', 28 | 'token_abilities' => 'Fähigkeiten', 29 | 'token_created_at' => 'Erstellt am', 30 | 'token_expires_at' => 'Läuft ab am', 31 | 'token_section_title' => 'API-Tokens', 32 | 'token_section_description' => 'Verwalten Sie API-Tokens, die Drittanbietern den Zugriff auf diese Anwendung in Ihrem Namen ermöglichen.', 33 | 'token_action_label' => 'Token erstellen', 34 | 'token_modal_heading' => 'Erstellen', 35 | 'token_create_notification' => 'Token erfolgreich erstellt!', 36 | 'token_helper_text' => 'Ihr Token wird nur einmal bei der Erstellung angezeigt. Wenn Sie Ihren Token verlieren, müssen Sie ihn löschen und einen neuen erstellen.', 37 | 'token_modal_heading_2' => 'Persönlichen Zugriffstoken Kopieren', 38 | 'token_empty_state_heading' => 'Erstellen Sie Ihren ersten Token', 39 | 'token_empty_state_description' => 'Erstellen Sie einen persönlichen Zugriffstoken, um zu beginnen.', 40 | 'browser_section_title' => 'Browsersitzungen', 41 | 'browser_section_description' => 'Verwalten und melden Sie sich von Ihren aktiven Sitzungen auf anderen Browsern und Geräten ab.', 42 | 'browser_sessions_content' => 'Bei Bedarf können Sie sich von all Ihren anderen Browsersitzungen auf all Ihren Geräten abmelden. Einige Ihrer letzten Sitzungen sind unten aufgeführt; diese Liste ist jedoch möglicherweise nicht vollständig. Wenn Sie glauben, dass Ihr Konto kompromittiert wurde, sollten Sie auch Ihr Passwort aktualisieren.', 43 | 'browser_sessions_device' => 'Dieses Gerät', 44 | 'browser_sessions_last_active' => 'Zuletzt aktiv', 45 | 'browser_sessions_log_out' => 'Von anderen Browsersitzungen abmelden', 46 | 'browser_sessions_confirm_pass' => 'Bitte geben Sie Ihr Passwort ein, um zu bestätigen, dass Sie sich von Ihren anderen Browsersitzungen auf all Ihren Geräten abmelden möchten.', 47 | 'browser_sessions_logout_success_notification' => 'Alle anderen Browsersitzungen wurden erfolgreich abgemeldet.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/en/default.php: -------------------------------------------------------------------------------- 1 | 'Edit Profile', 5 | 'profile_information' => 'Profile Information', 6 | 'profile_information_description' => 'Update your account profile information and email address.', 7 | 'name' => 'Name', 8 | 'email' => 'Email', 9 | 'avatar' => 'Photo', 10 | 'password' => 'Password', 11 | 'update_password' => 'Update Password', 12 | 'current_password' => 'Current Password', 13 | 'new_password' => 'New Password', 14 | 'confirm_password' => 'Confirm Password', 15 | 'ensure_your_password' => 'Ensure your account is using long, random password to stay secure.', 16 | 'delete_account' => 'Delete Account', 17 | 'delete_account_description' => 'Permanently delete your account.', 18 | 'yes_delete_it' => 'Yes, delete it!', 19 | 'are_you_sure' => 'Are you sure you would like to delete your account? This cannot be undone!', 20 | 'incorrect_password' => 'The password you entered was incorrect. Please try again.', 21 | 'user_load_error' => 'The authenticated user object must be an Eloquent model to allow the profile page to update it.', 22 | 'delete_account_card_description' => 'Once your account is deleted, all of your resources and data will be permanently erased. Before deleting your account, please download any data or information you wish to keep.', 23 | 'saved_successfully' => 'Your profile information has been saved successfully.', 24 | 'custom_fields' => 'Custom Fields', 25 | 'custom_fields_description' => 'Update your custom fields.', 26 | 'save' => 'Save', 27 | 'token_name' => 'Token name', 28 | 'token_abilities' => 'Abilities', 29 | 'token_created_at' => 'Created at', 30 | 'token_expires_at' => 'Expires at', 31 | 'token_section_title' => 'API Tokens', 32 | 'token_section_description' => 'Manage API tokens that allow third-party services to access this application on your behalf.', 33 | 'token_action_label' => 'Create Token', 34 | 'token_modal_heading' => 'Create', 35 | 'token_create_notification' => 'Token created successfully!', 36 | 'token_helper_text' => 'Your token is only shown once upon creation. If you lose your token, you will need to delete it and create a new one.', 37 | 'token_modal_heading_2' => 'Copy Personal Access Token', 38 | 'token_empty_state_heading' => 'Create your first token', 39 | 'token_empty_state_description' => 'Create a personal access token to get started.', 40 | 'browser_section_title' => 'Browser Sessions', 41 | 'browser_section_description' => 'Manage and log out your active sessions on other browsers and devices.', 42 | 'browser_sessions_content' => 'If necessary, you may log out of all of your other browser sessions across all of your devices. Some of your recent sessions are listed below; however, this list may not be exhaustive. If you feel your account has been compromised, you should also update your password.', 43 | 'browser_sessions_device' => 'This device', 44 | 'browser_sessions_last_active' => 'Last active', 45 | 'browser_sessions_log_out' => 'Log Out Other Browser Sessions', 46 | 'browser_sessions_confirm_pass' => 'Please enter your password to confirm you would like to log out of your other browser sessions across all of your devices.', 47 | 'browser_sessions_logout_success_notification' => 'All other browser sessions have been logged out successfully.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/es/default.php: -------------------------------------------------------------------------------- 1 | 'Editar perfil', 5 | 'profile_information' => 'Información del perfil', 6 | 'profile_information_description' => 'Actualiza la información del perfil de tu cuenta y tu dirección de correo electrónico', 7 | 'name' => 'Nombre', 8 | 'email' => 'Correo Electrónico', 9 | 'avatar' => 'Foto', 10 | 'password' => 'Contraseña', 11 | 'update_password' => 'Actualizar Contraseña', 12 | 'current_password' => 'Contraseña actual', 13 | 'new_password' => 'Nueva Contraseña', 14 | 'confirm_password' => 'Confirmar Contraseña', 15 | 'ensure_your_password' => 'Asegúrate de que tu cuenta utiliza una contraseña larga y aleatoria para estar seguro', 16 | 'delete_account' => 'Eliminar cuenta', 17 | 'delete_account_description' => 'Elimina permanentemente tu cuenta', 18 | 'yes_delete_it' => '¡Sí, elimínala!', 19 | 'are_you_sure' => '¿Estás seguro de que deseas eliminar tu cuenta? Esto no se puede deshacer', 20 | 'incorrect_password' => 'La contraseña introducida es incorrecta. Por favor, inténtalo de nuevo', 21 | 'user_load_error' => 'El objeto de usuario autenticado debe ser un modelo Eloquent para permitir que la página de perfil lo actualice', 22 | 'delete_account_card_description' => 'Una vez eliminada tu cuenta, todos tus recursos y datos serán borrados permanentemente. Antes de borrar tu cuenta, por favor descarga cualquier dato o información que desees conservar.', 23 | 'saved_successfully' => 'La información de tu perfil se ha guardado correctamente', 24 | 'custom_fields' => 'Campos personalizados', 25 | 'custom_fields_description' => 'Actualiza tus campos personalizados', 26 | 'save' => 'Guardar', 27 | 'token_name' => 'Nombre del Token', 28 | 'token_abilities' => 'Habilidades', 29 | 'token_created_at' => 'Creado en', 30 | 'token_expires_at' => 'Caduca a las', 31 | 'token_section_title' => 'Tokens de API', 32 | 'token_section_description' => 'Administrar tokens de API que permiten a servicios de terceros acceder a esta aplicación en su nombre', 33 | 'token_action_label' => 'Crear token', 34 | 'token_modal_heading' => 'Crear', 35 | 'token_create_notification' => 'Token creado con éxito', 36 | 'token_helper_text' => 'Tu token sólo se muestra una vez al crearlo. Si pierdes tu token, tendrás que borrarlo y crear uno nuevo', 37 | 'token_modal_heading_2' => 'Copiar clave de acceso personal', 38 | 'token_empty_state_heading' => 'Crea tu primer token', 39 | 'token_empty_state_description' => 'Crea un token de acceso personal para empezar', 40 | 'browser_section_title' => 'Sesiones del navegador', 41 | 'browser_section_description' => 'Gestiona y cierra tus sesiones activas en otros navegadores y dispositivos', 42 | 'browser_sessions_content' => 'Si es necesario, puedes cerrar todas tus sesiones de navegación en todos tus dispositivos. Algunas de sus sesiones recientes se enumeran a continuación; sin embargo, esta lista puede no ser exhaustiva. Si cree que su cuenta ha sido comprometida, también debería actualizar su contraseña', 43 | 'browser_sessions_device' => 'Este dispositivo', 44 | 'browser_sessions_last_active' => 'Última activa', 45 | 'browser_sessions_log_out' => 'Cerrar otras sesiones del navegador', 46 | 'browser_sessions_confirm_pass' => 'Por favor, introduzca su contraseña para confirmar que desea salir de sus otras sesiones de navegación en todos sus dispositivos', 47 | 'browser_sessions_logout_success_notification' => 'Se han cerrado todas las demás sesiones del navegador con éxito.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/fa/default.php: -------------------------------------------------------------------------------- 1 | 'ویرایش پروفایل', 5 | 'profile_information' => 'اطلاعات پروفایل', 6 | 'profile_information_description' => 'اطلاعات پروفایل و آدرس ایمیل خود را به روز کنید.', 7 | 'name' => 'نام', 8 | 'email' => 'ایمیل', 9 | 'avatar' => 'آواتار', 10 | 'password' => 'رمز عبور', 11 | 'update_password' => 'بروزرسانی رمز عبور', 12 | 'current_password' => 'رمز عبور فعلی', 13 | 'new_password' => 'رمز عبور جدید', 14 | 'confirm_password' => 'تایید رمز عبور', 15 | 'ensure_your_password' => 'اطمینان حاصل کنید که حساب شما از رمز عبور طولانی و تصادفی برای حفظ امنیت استفاده می کند.', 16 | 'delete_account' => 'حذف حساب کاربری', 17 | 'delete_account_description' => 'اکانت خود را برای همیشه حذف کنید', 18 | 'yes_delete_it' => 'بله؛ حذف کن', 19 | 'are_you_sure' => 'آیا مطمئن هستید که می خواهید حساب خود را حذف کنید؟ این قابل بازگشت نیست!', 20 | 'incorrect_password' => 'رمز عبور ای که وارد کردید نادرست بود. لطفا دوباره تلاش کنید.', 21 | 'user_load_error' => ' کاربر تأیید شده باید یک مدل Eloquent باشد تا به صفحه پروفایل اجازه به روز رسانی آن را بدهد.', 22 | 'delete_account_card_description' => 'پس از حذف حساب شما، تمام منابع و داده های شما برای همیشه پاک می شوند. قبل از حذف حساب خود، لطفاً هر داده یا اطلاعاتی را که می‌خواهید نگه دارید دانلود کنید.', 23 | 'saved_successfully' => 'اطلاعات پروفایل شما با موفقیت ذخیره شد.', 24 | 'custom_fields' => 'فیلدهای سفارشی', 25 | 'custom_fields_description' => 'فیلدهای سفارشی خود را به روز کنید.', 26 | 'save' => 'ذخیره', 27 | 'token_name' => 'نام توکن', 28 | 'token_abilities' => 'توانایی ها', 29 | 'token_created_at' => 'ساخته شده در', 30 | 'token_expires_at' => 'منقضی در', 31 | 'token_section_title' => 'توکن API', 32 | 'token_section_description' => 'توکن‌های API را مدیریت کنید که به سرویس‌های شخص ثالث اجازه می‌دهند از طرف شما به این برنامه دسترسی داشته باشند.', 33 | 'token_action_label' => 'ساخت توکن', 34 | 'token_modal_heading' => 'ايجاد كردن', 35 | 'token_create_notification' => 'توکن با موفقیت ساخته شد', 36 | 'token_helper_text' => 'توکن شما تنها یک بار پس از ایجاد نشان داده می شود. اگر توکن خود را گم کردید، باید آن را حذف کرده و یک توکن جدید ایجاد کنید.', 37 | 'token_modal_heading_2' => 'توکن دسترسی شخصی را کپی کنید', 38 | 'token_empty_state_heading' => 'ایجاد اولین توکن شما', 39 | 'token_empty_state_description' => 'برای شروع یک نشانه دسترسی شخصی ایجاد کنید.', 40 | 'browser_section_title' => 'سشن های مرورگر', 41 | 'browser_section_description' => 'سشن های فعال خود را در سایر مرورگرها و دستگاه ها مدیریت کرده و از سیستم خارج شوید.', 42 | 'browser_sessions_content' => 'در صورت لزوم، می توانید از تمام سشن های مرورگر دیگر خود در همه دستگاه های خود خارج شوید. برخی از سشن های اخیر شما در زیر فهرست شده است. با این حال، این فهرست ممکن است جامع نباشد. اگر احساس می کنید حساب شما به خطر افتاده است، باید رمز عبور خود را نیز به روز کنید.', 43 | 'browser_sessions_device' => 'این دستگاه', 44 | 'browser_sessions_last_active' => 'آخرین فعالیت', 45 | 'browser_sessions_log_out' => 'از سایر سشن های مرورگر خارج شوید', 46 | 'browser_sessions_confirm_pass' => 'لطفاً رمز عبور خود را وارد کنید تا تأیید کنید که می خواهید از سایر سشن های مرورگر خود در همه دستگاه های خود خارج شوید.', 47 | 'browser_sessions_logout_success_notification' => 'تمامی جلسات دیگر مرورگر با موفقیت خارج شدند.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/fr/default.php: -------------------------------------------------------------------------------- 1 | 'Modifier le profil', 5 | 'profile_information' => 'Informations de profil', 6 | 'profile_information_description' => 'Mettez à jour les informations de votre profil de compte et votre adresse e-mail.', 7 | 'name' => 'Nom', 8 | 'email' => 'E-mail', 9 | 'avatar' => 'Photo', 10 | 'password' => 'Mot de passe', 11 | 'update_password' => 'Mettre à jour le mot de passe', 12 | 'current_password' => 'Mot de passe actuel', 13 | 'new_password' => 'Nouveau mot de passe', 14 | 'confirm_password' => 'Confirmer le mot de passe', 15 | 'ensure_your_password' => 'Assurez-vous que votre compte utilise un mot de passe long et aléatoire pour rester en sécurité.', 16 | 'delete_account' => 'Supprimer le compte', 17 | 'delete_account_description' => 'Supprimer définitivement votre compte.', 18 | 'yes_delete_it' => 'Oui, supprimez-le !', 19 | 'are_you_sure' => 'Êtes-vous sûr de vouloir supprimer votre compte ? Ça ne peut pas être annulé!', 20 | 'incorrect_password' => 'Le mot de passe que vous avez entré était incorrect. Veuillez réessayer.', 21 | 'user_load_error' => 'L\'objet utilisateur authentifié doit être un modèle Eloquent pour permettre à la page de profil de le mettre à jour.', 22 | 'delete_account_card_description' => 'Une fois votre compte supprimé, toutes vos ressources et données seront définitivement effacées. Avant de supprimer votre compte, veuillez télécharger toutes les données ou informations que vous souhaitez conserver.', 23 | 'saved_successfully' => 'Les informations de votre profil ont été enregistrées avec succès.', 24 | 'custom_fields' => 'Champs personnalisés', 25 | 'custom_fields_description' => 'Mettez à jour vos champs personnalisés.', 26 | 'save' => 'Enregistrer', 27 | 'token_name' => 'Nom du jeton', 28 | 'token_abilities' => 'Capacités', 29 | 'token_created_at' => 'Créé à', 30 | 'token_expires_at' => 'Expire à', 31 | 'token_section_title' => 'Jetons API', 32 | 'token_section_description' => 'Gérer les jetons API qui permettent aux services tiers d\'accéder à cette application en votre nom.', 33 | 'token_action_label' => 'Créer un jeton', 34 | 'token_modal_heading' => 'Créer', 35 | 'token_create_notification' => 'Jeton créé avec succès !', 36 | 'token_helper_text' => 'Votre token n\'est affiché qu\'une seule fois lors de sa création. Si vous perdez votre token, vous devrez le supprimer et en créer un nouveau.', 37 | 'token_modal_heading_2' => 'Copier le jeton d\'accès personnel', 38 | 'token_empty_state_heading' => 'Créez votre premier jeton', 39 | 'token_empty_state_description' => 'Créez un jeton d\'accès personnel pour commencer.', 40 | 'browser_section_title' => 'Sessions du navigateur', 41 | 'browser_section_description' => 'Gérez et déconnectez-vous de vos sessions actives sur d\'autres navigateurs et appareils.', 42 | 'browser_sessions_content' => 'Si nécessaire, vous pouvez vous déconnecter de toutes vos autres sessions de navigateur sur tous vos appareils. Certaines de vos sessions récentes sont répertoriées ci-dessous ; cependant, cette liste n\'est peut-être pas exhaustive. Si vous pensez que votre compte a été compromis, vous devez également mettre à jour votre mot de passe.', 43 | 'browser_sessions_device' => 'Cet appareil', 44 | 'browser_sessions_last_active' => 'Dernier actif', 45 | 'browser_sessions_log_out' => 'Déconnexion des autres sessions du navigateur', 46 | 'browser_sessions_confirm_pass' => 'Veuillez saisir votre mot de passe pour confirmer que vous souhaitez vous déconnecter de vos autres sessions de navigateur sur tous vos appareils.', 47 | 'browser_sessions_logout_success_notification' => 'Toutes les autres sessions de navigateur ont été déconnectées avec succès.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/hu/default.php: -------------------------------------------------------------------------------- 1 | 'Profil szerkesztése', 5 | 'profile_information' => 'Profil információk', 6 | 'profile_information_description' => 'Frissítsd a fiókod profilinformációit és e-mail címed.', 7 | 'name' => 'Név', 8 | 'email' => 'E-mail', 9 | 'avatar' => 'Fotó', 10 | 'password' => 'Jelszó', 11 | 'update_password' => 'Jelszó frissítése', 12 | 'current_password' => 'Jelenlegi jelszó', 13 | 'new_password' => 'Új jelszó', 14 | 'confirm_password' => 'Jelszó megerősítése', 15 | 'ensure_your_password' => 'Győződj meg róla, hogy a fiókod hosszú, véletlenszerű jelszót használ a biztonság érdekében.', 16 | 'delete_account' => 'Fiók törlése', 17 | 'delete_account_description' => 'Véglegesen töröld a fiókodat.', 18 | 'yes_delete_it' => 'Igen, töröld!', 19 | 'are_you_sure' => 'Biztosan törölni szeretnéd a fiókodat? Ez nem visszavonható!', 20 | 'incorrect_password' => 'A megadott jelszó helytelen volt. Kérjük, próbáld újra.', 21 | 'user_load_error' => 'A hitelesített felhasználó objektumnak egy Eloquent modellnek kell lennie, hogy lehetővé tegye a profiloldal frissítését.', 22 | 'delete_account_card_description' => 'Miután a fiókod törlődik, az összes erőforrásod és adatod véglegesen törlődik. Mielőtt törölnéd a fiókodat, kérjük, töltsd le azokat az adatokat vagy információkat, amelyeket meg szeretnél tartani.', 23 | 'saved_successfully' => 'Profilinformációid sikeresen elmentve.', 24 | 'custom_fields' => 'Egyedi mezők', 25 | 'custom_fields_description' => 'Frissítsd az egyedi mezőket.', 26 | 'save' => 'Mentés', 27 | 'token_name' => 'Token neve', 28 | 'token_abilities' => 'Képességek', 29 | 'token_created_at' => 'Létrehozva', 30 | 'token_expires_at' => 'Lejárati dátum', 31 | 'token_section_title' => 'API Tokenek', 32 | 'token_section_description' => 'Kezeld az API tokeneket, amelyek lehetővé teszik harmadik féltől származó szolgáltatások számára, hogy hozzáférjenek ehhez az alkalmazáshoz a nevedben.', 33 | 'token_action_label' => 'Token létrehozása', 34 | 'token_modal_heading' => 'Létrehozás', 35 | 'token_create_notification' => 'Token sikeresen létrehozva!', 36 | 'token_helper_text' => 'A tokent csak egyszer mutatjuk meg létrehozáskor. Ha elveszíted a tokent, törölnöd kell, és újat kell létrehoznod.', 37 | 'token_modal_heading_2' => 'Személyes hozzáférési token másolása', 38 | 'token_empty_state_heading' => 'Hozd létre az első tokent', 39 | 'token_empty_state_description' => 'Hozz létre egy személyes hozzáférési tokent a kezdéshez.', 40 | 'browser_section_title' => 'Böngésző munkamenetek', 41 | 'browser_section_description' => 'Kezeld és jelentkezz ki az aktív munkameneteidből más böngészőkben és eszközökön.', 42 | 'browser_sessions_content' => 'Szükség esetén kijelentkezhetsz az összes többi böngésző munkamenetéből az összes eszközödön. Az alábbiakban néhány aktuális munkamenet látható; azonban ez a lista nem feltétlenül teljes. Ha úgy érzed, hogy a fiókodat feltörték, frissítsd jelszavad is.', 43 | 'browser_sessions_device' => 'Ez az eszköz', 44 | 'browser_sessions_last_active' => 'Legutóbbi aktivitás', 45 | 'browser_sessions_log_out' => 'Kijelentkezés más böngésző munkamenetekből', 46 | 'browser_sessions_confirm_pass' => 'Kérjük, add meg a jelszavad, hogy megerősítsd, ki szeretnél jelentkezni az összes többi böngésző munkamenetből az összes eszközödön.', 47 | 'browser_sessions_logout_success_notification' => 'Az összes többi böngésző munkamenet sikeresen kijelentkezett.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/id/default.php: -------------------------------------------------------------------------------- 1 | 'Edit Profil', 5 | 'profile_information' => 'Informasi Profil', 6 | 'profile_information_description' => 'Perbarui informasi profil dan alamat email Anda.', 7 | 'name' => 'Nama', 8 | 'email' => 'Email', 9 | 'avatar' => 'Foto', 10 | 'password' => 'Kata Sandi', 11 | 'update_password' => 'Perbarui Kata Sandi', 12 | 'current_password' => 'Kata Sandi Saat Ini', 13 | 'new_password' => 'Kata Sandi Baru', 14 | 'confirm_password' => 'Konfirmasi Kata Sandi', 15 | 'ensure_your_password' => 'Pastikan akun Anda menggunakan kata sandi yang panjang dan acak untuk keamanan.', 16 | 'delete_account' => 'Hapus Akun', 17 | 'delete_account_description' => 'Hapus akun Anda secara permanen.', 18 | 'yes_delete_it' => 'Ya, hapus!', 19 | 'are_you_sure' => 'Apakah Anda yakin ingin menghapus akun Anda? Ini tidak dapat dibatalkan!', 20 | 'incorrect_password' => 'Kata sandi yang Anda masukkan salah. Silakan coba lagi.', 21 | 'user_load_error' => 'Objek pengguna yang terautentikasi harus merupakan model Eloquent agar halaman profil dapat memperbaruinya.', 22 | 'delete_account_card_description' => 'Setelah akun Anda dihapus, semua data dan sumber daya Anda akan dihapus secara permanen. Sebelum menghapus akun, unduh data atau informasi yang ingin Anda simpan.', 23 | 'saved_successfully' => 'Informasi profil Anda telah berhasil disimpan.', 24 | 'custom_fields' => 'Bidang Kustom', 25 | 'custom_fields_description' => 'Perbarui bidang kustom Anda.', 26 | 'save' => 'Simpan', 27 | 'token_name' => 'Nama Token', 28 | 'token_abilities' => 'Kemampuan', 29 | 'token_created_at' => 'Dibuat pada', 30 | 'token_expires_at' => 'Berlaku hingga', 31 | 'token_section_title' => 'Token API', 32 | 'token_section_description' => 'Kelola token API yang memungkinkan layanan pihak ketiga mengakses aplikasi ini atas nama Anda.', 33 | 'token_action_label' => 'Buat Token', 34 | 'token_modal_heading' => 'Buat', 35 | 'token_create_notification' => 'Token berhasil dibuat!', 36 | 'token_helper_text' => 'Token Anda hanya ditampilkan sekali saat pembuatan. Jika Anda kehilangan token, Anda perlu menghapusnya dan membuat yang baru.', 37 | 'token_modal_heading_2' => 'Salin Token Akses Pribadi', 38 | 'token_empty_state_heading' => 'Buat token pertama Anda', 39 | 'token_empty_state_description' => 'Buat token akses pribadi untuk memulai.', 40 | 'browser_section_title' => 'Sesi Browser', 41 | 'browser_section_description' => 'Kelola dan keluar dari sesi aktif Anda di browser dan perangkat lain.', 42 | 'browser_sessions_content' => 'Jika perlu, Anda dapat keluar dari semua sesi browser Anda di semua perangkat. Beberapa sesi terbaru Anda terdaftar di bawah; daftar ini mungkin tidak lengkap. Jika Anda merasa akun Anda telah dikompromikan, perbarui kata sandi Anda.', 43 | 'browser_sessions_device' => 'Perangkat ini', 44 | 'browser_sessions_last_active' => 'Terakhir aktif', 45 | 'browser_sessions_log_out' => 'Keluar dari Sesi Browser Lain', 46 | 'browser_sessions_confirm_pass' => 'Masukkan kata sandi Anda untuk mengonfirmasi bahwa Anda ingin keluar dari sesi browser lain di semua perangkat.', 47 | 'browser_sessions_logout_success_notification' => 'Semua sesi browser lainnya telah berhasil keluar.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/it/default.php: -------------------------------------------------------------------------------- 1 | 'Modifica Profilo', 5 | 'profile_information' => 'Informazioni del Profilo', 6 | 'profile_information_description' => "Aggiorna le informazioni del tuo profilo e l'indirizzo email del tuo account.", 7 | 'name' => 'Nome', 8 | 'email' => 'Email', 9 | 'password' => 'Password', 10 | 'avatar' => 'Avatar', 11 | 'update_password' => 'Aggiorna Password', 12 | 'current_password' => 'Password Attuale', 13 | 'new_password' => 'Nuova Password', 14 | 'confirm_password' => 'Conferma Password', 15 | 'ensure_your_password' => 'Assicurati che il tuo account utilizzi una password lunga e casuale per rimanere sicuro.', 16 | 'delete_account' => 'Elimina Account', 17 | 'delete_account_description' => 'Elimina permanentemente il tuo account.', 18 | 'yes_delete_it' => 'Sì, eliminalo!', 19 | 'are_you_sure' => 'Sei sicuro di voler eliminare il tuo account? Questa operazione non può essere annullata!', 20 | 'incorrect_password' => 'La password inserita è errata. Per favore riprova.', 21 | 'user_load_error' => "L'oggetto utente autenticato deve essere un modello Eloquent per consentire alla pagina del profilo di aggiornarlo.", 22 | 'delete_account_card_description' => 'Una volta eliminato il tuo account, tutte le tue risorse e dati saranno cancellati permanentemente. Prima di eliminare il tuo account, scarica eventuali dati o informazioni che desideri conservare.', 23 | 'saved_successfully' => 'Le informazioni del tuo profilo sono state salvate con successo.', 24 | 'custom_fields' => 'Campi Personalizzati', 25 | 'custom_fields_description' => 'Aggiorna i tuoi campi personalizzati.', 26 | 'save' => 'Salva', 27 | 'token_name' => 'Nome del Token', 28 | 'token_abilities' => 'Permessi', 29 | 'token_created_at' => 'Creato il', 30 | 'token_expires_at' => 'Scade il', 31 | 'token_section_title' => 'Token API', 32 | 'token_section_description' => 'Gestisci i token API che consentono ai servizi di terze parti di accedere a questa applicazione per tuo conto.', 33 | 'token_action_label' => 'Crea Token', 34 | 'token_modal_heading' => 'Crea', 35 | 'token_create_notification' => 'Token creato con successo!', 36 | 'token_helper_text' => 'Il tuo token viene mostrato solo una volta alla creazione. Se perdi il tuo token, dovrai eliminarlo e crearne uno nuovo.', 37 | 'token_modal_heading_2' => 'Copia il Token di Accesso Personale', 38 | 'token_empty_state_heading' => 'Crea il tuo primo token', 39 | 'token_empty_state_description' => 'Crea un token di accesso personale per iniziare.', 40 | 'browser_section_title' => 'Sessioni del Browser', 41 | 'browser_section_description' => 'Gestisci e disconnetti le tue sessioni attive su altri browser e dispositivi.', 42 | 'browser_sessions_content' => 'Se necessario, puoi disconnetterti da tutte le tue altre sessioni del browser su tutti i tuoi dispositivi. Alcune delle tue sessioni recenti sono elencate di seguito; tuttavia, questo elenco potrebbe non essere esaustivo. Se ritieni che il tuo account sia stato compromesso, dovresti anche aggiornare la tua password.', 43 | 'browser_sessions_device' => 'Questo dispositivo', 44 | 'browser_sessions_last_active' => 'Ultima attività', 45 | 'browser_sessions_log_out' => 'Disconnetti altre sessioni del browser', 46 | 'browser_sessions_confirm_pass' => 'Inserisci la tua password per confermare che desideri disconnettere le altre sessioni del browser su tutti i tuoi dispositivi.', 47 | 'browser_sessions_logout_success_notification' => 'Tutte le altre sessioni del browser sono state disconnesse con successo.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/ja/default.php: -------------------------------------------------------------------------------- 1 | 'プロフィール編集', 5 | 'profile_information' => 'プロフィール情報', 6 | 'profile_information_description' => 'アカウントのプロフィール情報とメールアドレスを更新してください。', 7 | 'name' => '名前', 8 | 'email' => 'メールアドレス', 9 | 'avatar' => '写真', 10 | 'password' => 'パスワード', 11 | 'update_password' => 'パスワード更新', 12 | 'current_password' => '現在のパスワード', 13 | 'new_password' => '新しいパスワード', 14 | 'confirm_password' => 'パスワード確認', 15 | 'ensure_your_password' => 'アカウントのセキュリティを保つために、長くランダムなパスワードを使用していることを確認してください。', 16 | 'delete_account' => 'アカウント削除', 17 | 'delete_account_description' => 'アカウントを永久に削除します。', 18 | 'yes_delete_it' => 'はい、削除します!', 19 | 'are_you_sure' => '本当にアカウントを削除してもよろしいですか? この操作は元に戻せません!', 20 | 'incorrect_password' => '入力されたパスワードが正しくありません。もう一度お試しください。', 21 | 'user_load_error' => 'プロフィールページが更新できるように、認証されたユーザーオブジェクトは Eloquent モデルである必要があります。', 22 | 'delete_account_card_description' => 'アカウントを削除すると、すべてのリソースとデータが永久に消去されます。アカウントを削除する前に、保存しておきたいデータや情報をダウンロードしてください。', 23 | 'saved_successfully' => 'プロフィール情報が正常に保存されました。', 24 | 'custom_fields' => 'カスタムフィールド', 25 | 'custom_fields_description' => 'カスタムフィールドを更新してください。', 26 | 'save' => '保存', 27 | 'token_name' => 'トークン名', 28 | 'token_abilities' => '権限', 29 | 'token_created_at' => '作成日時', 30 | 'token_expires_at' => '有効期限', 31 | 'token_section_title' => 'APIトークン', 32 | 'token_section_description' => 'サードパーティのサービスがあなたに代わってこのアプリケーションにアクセスできるようにするAPIトークンを管理します。', 33 | 'token_action_label' => 'トークン作成', 34 | 'token_modal_heading' => '作成', 35 | 'token_create_notification' => 'トークンが正常に作成されました!', 36 | 'token_helper_text' => 'トークンは作成時に一度だけ表示されます。紛失した場合は、削除して新しいトークンを作成する必要があります。', 37 | 'token_modal_heading_2' => 'パーソナルアクセストークンをコピー', 38 | 'token_empty_state_heading' => '最初のトークンを作成', 39 | 'token_empty_state_description' => 'パーソナルアクセストークンを作成して始めましょう。', 40 | 'browser_section_title' => 'ブラウザセッション', 41 | 'browser_section_description' => '他のブラウザやデバイスでのアクティブなセッションを管理し、ログアウトします。', 42 | 'browser_sessions_content' => '必要に応じて、すべてのデバイスでの他のブラウザセッションからログアウトすることができます。最近のセッションの一部が下に表示されていますが、すべてが表示されるわけではありません。アカウントが不正アクセスされた場合は、パスワードも更新してください。', 43 | 'browser_sessions_device' => 'このデバイス', 44 | 'browser_sessions_last_active' => '最終アクティブ時刻', 45 | 'browser_sessions_log_out' => '他のブラウザセッションからログアウト', 46 | 'browser_sessions_confirm_pass' => 'すべてのデバイスで他のブラウザセッションからログアウトすることを確認するために、パスワードを入力してください。', 47 | 'browser_sessions_logout_success_notification' => '他のすべてのブラウザセッションから正常にログアウトしました。', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/nl/default.php: -------------------------------------------------------------------------------- 1 | 'Profiel Bewerken', 5 | 'profile_information' => 'Profielinformatie', 6 | 'profile_information_description' => 'Werk uw accountprofielinformatie en e-mailadres bij.', 7 | 'name' => 'Naam', 8 | 'email' => 'E-mail', 9 | 'avatar' => 'Foto', 10 | 'password' => 'Wachtwoord', 11 | 'update_password' => 'Wachtwoord Bijwerken', 12 | 'current_password' => 'Huidig Wachtwoord', 13 | 'new_password' => 'Nieuw Wachtwoord', 14 | 'confirm_password' => 'Bevestig Wachtwoord', 15 | 'ensure_your_password' => 'Zorg ervoor dat uw account een lang, willekeurig wachtwoord gebruikt om veilig te blijven.', 16 | 'delete_account' => 'Account Verwijderen', 17 | 'delete_account_description' => 'Verwijder uw account permanent.', 18 | 'yes_delete_it' => 'Ja, verwijder het!', 19 | 'are_you_sure' => 'Weet u zeker dat u uw account wilt verwijderen? Dit kan niet ongedaan worden gemaakt!', 20 | 'incorrect_password' => 'Het ingevoerde wachtwoord is onjuist. Probeer het opnieuw.', 21 | 'user_load_error' => 'Het geauthenticeerde gebruikersobject moet een Eloquent-model zijn om de profielpagina te kunnen bijwerken.', 22 | 'delete_account_card_description' => 'Zodra uw account is verwijderd, worden al uw bronnen en gegevens permanent gewist. Download voor het verwijderen van uw account alle gegevens of informatie die u wilt bewaren.', 23 | 'saved_successfully' => 'Uw profielinformatie is succesvol opgeslagen.', 24 | 'custom_fields' => 'Aangepaste Velden', 25 | 'custom_fields_description' => 'Werk uw aangepaste velden bij.', 26 | 'save' => 'Opslaan', 27 | 'token_name' => 'Tokennaam', 28 | 'token_abilities' => 'Mogelijkheden', 29 | 'token_created_at' => 'Aangemaakt op', 30 | 'token_expires_at' => 'Verloopt op', 31 | 'token_section_title' => 'API Tokens', 32 | 'token_section_description' => 'Beheer API-tokens die derden toestaan toegang te krijgen tot deze applicatie namens u.', 33 | 'token_action_label' => 'Token Aanmaken', 34 | 'token_modal_heading' => 'Aanmaken', 35 | 'token_create_notification' => 'Token succesvol aangemaakt!', 36 | 'token_helper_text' => 'Uw token wordt slechts één keer weergegeven bij het aanmaken. Als u uw token verliest, moet u deze verwijderen en een nieuwe aanmaken.', 37 | 'token_modal_heading_2' => 'Persoonlijke Toegangstoken Kopiëren', 38 | 'token_empty_state_heading' => 'Maak uw eerste token aan', 39 | 'token_empty_state_description' => 'Maak een persoonlijke toegangstoken om te beginnen.', 40 | 'browser_section_title' => 'Browsersessies', 41 | 'browser_section_description' => 'Beheer en log uit uw actieve sessies op andere browsers en apparaten.', 42 | 'browser_sessions_content' => 'Indien nodig kunt u uitloggen bij al uw andere browsersessies op al uw apparaten. Sommige van uw recente sessies worden hieronder vermeld; deze lijst is echter mogelijk niet uitputtend. Als u vermoedt dat uw account is gecompromitteerd, moet u ook uw wachtwoord bijwerken.', 43 | 'browser_sessions_device' => 'Dit apparaat', 44 | 'browser_sessions_last_active' => 'Laatst actief', 45 | 'browser_sessions_log_out' => 'Log Uit bij Andere Browsersessies', 46 | 'browser_sessions_confirm_pass' => 'Voer uw wachtwoord in om te bevestigen dat u wilt uitloggen bij uw andere browsersessies op al uw apparaten.', 47 | 'browser_sessions_logout_success_notification' => 'Alle andere browsersessies zijn succesvol uitgelogd.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/pl/default.php: -------------------------------------------------------------------------------- 1 | 'Mój profil', 5 | 'profile_information' => 'Podstawowe informacje', 6 | 'profile_information_description' => 'Zaktualizuj nazwę i adres e-mail swojego konta.', 7 | 'name' => 'Nazwa użytkownika', 8 | 'email' => 'E-mail', 9 | 'avatar' => 'Zdjęcie', 10 | 'password' => 'Hasło', 11 | 'update_password' => 'Zaktualizuj hasło', 12 | 'current_password' => 'Obecne hasło', 13 | 'new_password' => 'Nowe hasło', 14 | 'confirm_password' => 'Powtórz hasło', 15 | 'ensure_your_password' => 'Upewnij się, że Twoje konto używa długiego, losowego, bezpiecznego hasła, aby zachować bezpieczeństwo.', 16 | 'delete_account' => 'Usuń konto', 17 | 'delete_account_description' => 'Trwale usuń konto.', 18 | 'yes_delete_it' => 'Tak, usuń!', 19 | 'are_you_sure' => 'Czy na pewno chcesz usunąć swoje konto? Tej operacji nie można cofnąć!', 20 | 'incorrect_password' => 'Wprowadzone hasło jest nieprawidłowe. Spróbuj ponownie.', 21 | 'user_load_error' => 'Uwierzytelniony obiekt użytkownika musi być modelem Eloquent, aby umożliwić aktualizację strony profilu.', 22 | 'delete_account_card_description' => 'Po usunięciu konta wszystkie Twoje zasoby i dane zostaną trwale usunięte. Przed usunięciem konta pobierz wszelkie dane lub informacje, które chcesz zachować.', 23 | 'saved_successfully' => 'Informacje o Twoim profilu zostały pomyślnie zapisane.', 24 | 'custom_fields' => 'Pola niestandardowe', 25 | 'custom_fields_description' => 'Zaktualizuj pola niestandardowe.', 26 | 'save' => 'Zapisz', 27 | 'token_name' => 'Nazwa tokena', 28 | 'token_abilities' => 'Uprawnienia', 29 | 'token_created_at' => 'Utworzono', 30 | 'token_expires_at' => 'Wygasa', 31 | 'token_section_title' => 'Tokeny API', 32 | 'token_section_description' => 'Zarządzaj tokenami API, które umożliwiają usługom zewnętrznym dostęp do tej aplikacji w Twoim imieniu.', 33 | 'token_action_label' => 'Utwórz token', 34 | 'token_modal_heading' => 'Utwórz', 35 | 'token_create_notification' => 'Token został pomyślnie utworzony!', 36 | 'token_helper_text' => 'Twój token jest wyświetlany tylko raz podczas tworzenia. Jeśli zgubisz token, będziesz musiał go usunąć i utworzyć nowy.', 37 | 'token_modal_heading_2' => 'Skopiuj osobisty token dostępu', 38 | 'token_empty_state_heading' => 'Utwórz swój pierwszy token', 39 | 'token_empty_state_description' => 'Utwórz osobisty token dostępu, aby rozpocząć.', 40 | 'browser_section_title' => 'Sesje przeglądarki', 41 | 'browser_section_description' => 'Zarządzaj i wyloguj swoje aktywne sesje na innych przeglądarkach i urządzeniach.', 42 | 'browser_sessions_content' => 'Jeśli to konieczne, możesz wylogować się ze wszystkich innych sesji przeglądarki na wszystkich swoich urządzeniach. Poniżej wymieniono niektóre z Twoich ostatnich sesji, jednak lista ta może nie być pełna. Jeśli uważasz, że Twoje konto zostało naruszone, powinieneś również zaktualizować hasło.', 43 | 'browser_sessions_device' => 'To urządzenie', 44 | 'browser_sessions_last_active' => 'Ostatnia aktywność', 45 | 'browser_sessions_log_out' => 'Wyloguj inne sesje przeglądarki', 46 | 'browser_sessions_confirm_pass' => 'Wprowadź swoje hasło, aby potwierdzić, że chcesz wylogować się z innych sesji przeglądarki na wszystkich swoich urządzeniach.', 47 | 'browser_sessions_logout_success_notification' => 'Wszystkie inne sesje przeglądarki zostały pomyślnie wylogowane.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/pt_BR/default.php: -------------------------------------------------------------------------------- 1 | 'Editar Perfil', 5 | 'profile_information' => 'Informação do Perfil', 6 | 'profile_information_description' => 'Atualize as informações do seu perfil e endereço de e-mail.', 7 | 'name' => 'Nome', 8 | 'email' => 'E-mail', 9 | 'password' => 'Senha', 10 | 'update_password' => 'Atualizar Senha', 11 | 'current_password' => 'Senha Atual', 12 | 'new_password' => 'Nova Senha', 13 | 'confirm_password' => 'Confirmar Senha', 14 | 'ensure_your_password' => 'Certifique-se de que sua conta está usando uma senha longa e aleatória para se manter segura.', 15 | 'delete_account' => 'Excluir Conta', 16 | 'delete_account_description' => 'Excluir permanentemente sua conta.', 17 | 'yes_delete_it' => 'Sim, exclua!', 18 | 'are_you_sure' => 'Tem certeza de que deseja excluir sua conta? Isso não pode ser desfeito!', 19 | 'incorrect_password' => 'A senha que você digitou estava incorreta. Por favor, tente novamente.', 20 | 'user_load_error' => 'O objeto de usuário autenticado deve ser um modelo Eloquent para permitir que a página de perfil o atualize.', 21 | 'delete_account_card_description' => 'Depois que sua conta for excluída, todos os seus recursos e dados serão apagados permanentemente. Antes de excluir sua conta, faça o download de quaisquer dados ou informações que deseja manter.', 22 | 'saved_successfully' => 'Suas informações de perfil foram salvas com sucesso.', 23 | 'custom_fields' => 'Campos Personalizados', 24 | 'custom_fields_description' => 'Atualize seus campos personalizados.', 25 | 'save' => 'Salvar', 26 | 'token_name' => 'Nome do Token', 27 | 'token_abilities' => 'Permissões', 28 | 'token_created_at' => 'Criado em', 29 | 'token_expires_at' => 'Expira em', 30 | 'token_section_title' => 'API Tokens', 31 | 'token_section_description' => 'Gerencie tokens de API que permitem que serviços de terceiros acessem este aplicativo em seu nome.', 32 | 'token_action_label' => 'Criar Token', 33 | 'token_modal_heading' => 'Criar', 34 | 'token_create_notification' => 'Seu Token foi criado com sucesso!', 35 | 'token_helper_text' => 'O token só é mostrado uma vez após a criação. Se você perder o token, precisará excluí-lo e criar um novo', 36 | 'token_modal_heading_2' => 'Copiar Toke de Acesso', 37 | 'token_empty_state_heading' => 'Crie seu primeiro token', 38 | 'token_empty_state_description' => 'Crie um personal access token para começar.', 39 | 'browser_section_title' => 'Sessões do navegador', 40 | 'browser_section_description' => 'Gerencie e efetue logout de suas sessões ativas em outros navegadores e dispositivos.', 41 | 'browser_sessions_content' => 'Se necessário, você pode sair de todas as outras sessões do navegador em todos os seus dispositivos. Algumas de suas sessões recentes estão listadas abaixo; no entanto, esta lista pode não ser exaustiva. Se você acha que sua conta foi comprometida, você também deve atualizar sua senha.', 42 | 'browser_sessions_device' => 'Este dispositivo', 43 | 'browser_sessions_last_active' => 'Ultima Atividade', 44 | 'browser_sessions_log_out' => 'Sair de outras sessões do navegador', 45 | 'browser_sessions_confirm_pass' => 'Digite sua senha para confirmar que deseja sair das outras sessões do navegador em todos os seus dispositivos.', 46 | 'browser_sessions_logout_success_notification' => 'Todas as outras sessões do navegador foram desconectadas com sucesso.', 47 | ]; 48 | -------------------------------------------------------------------------------- /resources/lang/pt_PT/default.php: -------------------------------------------------------------------------------- 1 | 'Editar Perfil', 5 | 'profile_information' => 'Informação do Perfil', 6 | 'profile_information_description' => 'Atualize as informações do seu perfil e endereço de email.', 7 | 'name' => 'Nome', 8 | 'email' => 'Email', 9 | 'avatar' => 'Foto', 10 | 'password' => 'Palavra-passe', 11 | 'update_password' => 'Atualizar Palavra-passe', 12 | 'current_password' => 'Palavra-passe Atual', 13 | 'new_password' => 'Nova Palavra-passe', 14 | 'confirm_password' => 'Confirmar Palavra-passe', 15 | 'ensure_your_password' => 'Garanta que a sua conta está a usar uma palavra-passe longa e aleatória para manter a segurança.', 16 | 'delete_account' => 'Eliminar Conta', 17 | 'delete_account_description' => 'Eliminar permanentemente a sua conta.', 18 | 'yes_delete_it' => 'Sim, eliminar!', 19 | 'are_you_sure' => 'Tem a certeza de que deseja eliminar a sua conta? Esta ação não pode ser desfeita!', 20 | 'incorrect_password' => 'A palavra-passe que introduziu está incorreta. Por favor, tente novamente.', 21 | 'user_load_error' => 'O objeto de utilizador autenticado deve ser um modelo Eloquent para permitir que a página do perfil o atualize.', 22 | 'delete_account_card_description' => 'Uma vez eliminada a sua conta, todos os seus recursos e dados serão permanentemente apagados. Antes de eliminar a sua conta, por favor, descarregue quaisquer dados ou informações que deseje manter.', 23 | 'saved_successfully' => 'As informações do seu perfil foram guardadas com sucesso.', 24 | 'custom_fields' => 'Campos Personalizados', 25 | 'custom_fields_description' => 'Atualize os seus campos personalizados.', 26 | 'save' => 'Guardar', 27 | 'token_name' => 'Nome do Token', 28 | 'token_abilities' => 'Habilidades', 29 | 'token_created_at' => 'Criado em', 30 | 'token_expires_at' => 'Expira em', 31 | 'token_section_title' => 'Tokens de API', 32 | 'token_section_description' => 'Gerir tokens de API que permitem que serviços de terceiros acedam a esta aplicação em seu nome.', 33 | 'token_action_label' => 'Criar Token', 34 | 'token_modal_heading' => 'Criar', 35 | 'token_create_notification' => 'Token criado com sucesso!', 36 | 'token_helper_text' => 'O seu token é mostrado apenas uma vez aquando da criação. Se perder o seu token, terá de o eliminar e criar um novo.', 37 | 'token_modal_heading_2' => 'Copiar Token de Acesso Pessoal', 38 | 'token_empty_state_heading' => 'Crie o seu primeiro token', 39 | 'token_empty_state_description' => 'Crie um token de acesso pessoal para começar.', 40 | 'browser_section_title' => 'Sessões do Navegador', 41 | 'browser_section_description' => 'Gerir e terminar as suas sessões ativas em outros navegadores e dispositivos.', 42 | 'browser_sessions_content' => 'Se necessário, pode terminar todas as suas outras sessões de navegador em todos os seus dispositivos. Algumas das suas sessões recentes estão listadas abaixo; no entanto, esta lista pode não ser exaustiva. Se sentir que a sua conta foi comprometida, deve também atualizar a sua palavra-passe.', 43 | 'browser_sessions_device' => 'Este dispositivo', 44 | 'browser_sessions_last_active' => 'Última atividade', 45 | 'browser_sessions_log_out' => 'Terminar Sessões de Outros Navegadores', 46 | 'browser_sessions_confirm_pass' => 'Por favor, introduza a sua palavra-passe para confirmar que deseja terminar as sessões de outros navegadores em todos os seus dispositivos.', 47 | 'browser_sessions_logout_success_notification' => 'Todas as outras sessões do navegador foram desconectadas com êxito.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/sk/default.php: -------------------------------------------------------------------------------- 1 | 'Upraviť profil', 5 | 'profile_information' => 'Základné informácie', 6 | 'profile_information_description' => 'Upravte základné informácie a e-mailovú adresu profilu.', 7 | 'name' => 'Meno', 8 | 'email' => 'E-mail', 9 | 'avatar' => 'Fotografia', 10 | 'password' => 'Heslo', 11 | 'update_password' => 'Aktualizuj heslo', 12 | 'current_password' => 'Aktuálne heslo', 13 | 'new_password' => 'Nové heslo', 14 | 'confirm_password' => 'Potvrďte nové heslo', 15 | 'ensure_your_password' => 'Uistite sa že používate dlhé a bezpečné heslo s náhodnými znakmi, aby ste zostali v bezpečí.', 16 | 'delete_account' => 'Odstrániť účet', 17 | 'delete_account_description' => 'Odstrániť účet natrvalo.', 18 | 'yes_delete_it' => 'Áno, odstrániť účet!', 19 | 'are_you_sure' => 'Ste si istý, že chcete svoj účet odstrániť natrvalo? Túto akciu nemožno vrátiť späť!', 20 | 'incorrect_password' => 'Chybné heslo. Skúste to prosím znova.', 21 | 'user_load_error' => 'Autentifikovaný užívateľský účet musí byť modelom Eloquent, aby ho profilová stránka mohla aktualizovať.', 22 | 'delete_account_card_description' => 'Po odstránení účtu budú všetky vaše súbory a údaje natrvalo vymazané. Pred odstránením účtu si stiahnite všetky veci, ktoré si chcete ponechať.', 23 | 'saved_successfully' => 'Vaše profilové infomácie boli úspešne uložené.', 24 | 'custom_fields' => 'Vlastné polia', 25 | 'custom_fields_description' => 'Upravte Vaše vlastné polia.', 26 | 'save' => 'Uložiť', 27 | 'token_name' => 'Názov tokenu', 28 | 'token_abilities' => 'Oprávnenia', 29 | 'token_created_at' => 'Vytvorený', 30 | 'token_expires_at' => 'Upravený', 31 | 'token_section_title' => 'API Tokeny', 32 | 'token_section_description' => 'Spravujte API tokeny, ktoré umožňujú službám tretích strán pristupovať k tejto aplikácii vo Vašom mene.', 33 | 'token_action_label' => 'Vytvoriť token', 34 | 'token_modal_heading' => 'Vytvoriť', 35 | 'token_create_notification' => 'Token bol úspešne vytvorený!', 36 | 'token_helper_text' => 'Váš token bude zobrazený iba raz a to pri jeho vytvorení. Ak ho stratíte, tak ho budete musieť vymazať a vytvoriť nový.', 37 | 'token_modal_heading_2' => 'Kopírovať osobný prístupový token', 38 | 'token_empty_state_heading' => 'Vytvorte svoj prvý token', 39 | 'token_empty_state_description' => 'Vytvorte si osobný prístupový token, aby ho mohli začať používať.', 40 | 'browser_section_title' => 'Vaše relácie na zariadeniach', 41 | 'browser_section_description' => 'Spravujte a odhláste sa z aplikácie na ostatných zariadeniach.', 42 | 'browser_sessions_content' => 'V prípade potreby sa môžete odhlásiť z ostatných relácií na svojich zariadeniach. Niektoré z vašich nedávnych prihlásení sú uvedené nižšie. Tento zoznam však nemusí byť úplný. Ak máte pocit, že váš účet bol odcudzený, mali by ste aktualizovať svoje heslo.', 43 | 'browser_sessions_device' => 'Vaše aktuálna relácia', 44 | 'browser_sessions_last_active' => 'Naposledy aktívna', 45 | 'browser_sessions_log_out' => 'Odhláste sa z ostatných relácií', 46 | 'browser_sessions_confirm_pass' => 'Zadajte prosím svoje heslo, aby ste potvrdili, že sa naozaj chcete odhlásiť z ostatných relácií na svojich zariadeniach.', 47 | 'browser_sessions_logout_success_notification' => 'Boli ste úspešne odhlásený z ostatných relácií na svojich zariadeniach.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/lang/tr/default.php: -------------------------------------------------------------------------------- 1 | 'Profili Düzenle', 5 | 'profile_information' => 'Profil Bilgileri', 6 | 'profile_information_description' => 'Hesap profil bilgilerinizi ve e-posta adresinizi güncelleyin.', 7 | 'name' => 'İsim', 8 | 'email' => 'E-posta', 9 | 'avatar' => 'Fotoğraf', 10 | 'password' => 'Şifre', 11 | 'update_password' => 'Şifreyi Güncelle', 12 | 'current_password' => 'Mevcut Şifre', 13 | 'new_password' => 'Yeni Şifre', 14 | 'confirm_password' => 'Şifreyi Onayla', 15 | 'ensure_your_password' => 'Hesabınızın güvenliğini sağlamak için uzun ve rastgele bir şifre kullanın.', 16 | 'delete_account' => 'Hesabı Sil', 17 | 'delete_account_description' => 'Hesabınızı kalıcı olarak silin.', 18 | 'yes_delete_it' => 'Evet, sil!', 19 | 'are_you_sure' => 'Hesabınızı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz!', 20 | 'incorrect_password' => 'Girdiğiniz şifre hatalı. Lütfen tekrar deneyin.', 21 | 'user_load_error' => 'Kimliği doğrulanmış kullanıcı nesnesi, profil sayfasının güncellenmesine izin vermek için bir Eloquent modeli olmalıdır.', 22 | 'delete_account_card_description' => 'Hesabınız silindikten sonra tüm kaynaklarınız ve verileriniz kalıcı olarak silinecektir. Hesabınızı silmeden önce saklamak istediğiniz tüm verileri indirmenizi öneririz.', 23 | 'saved_successfully' => 'Profil bilgileriniz başarıyla kaydedildi.', 24 | 'custom_fields' => 'Özel Alanlar', 25 | 'custom_fields_description' => 'Özel alanlarınızı güncelleyin.', 26 | 'save' => 'Kaydet', 27 | 'token_name' => 'Jeton Adı', 28 | 'token_abilities' => 'Yetkiler', 29 | 'token_created_at' => 'Oluşturulma Tarihi', 30 | 'token_expires_at' => 'Son Kullanma Tarihi', 31 | 'token_section_title' => 'API Jetonları', 32 | 'token_section_description' => 'Üçüncü taraf hizmetlerin bu uygulamaya sizin adınıza erişmesini sağlayan API jetonlarını yönetin.', 33 | 'token_action_label' => 'Jeton Oluştur', 34 | 'token_modal_heading' => 'Oluştur', 35 | 'token_create_notification' => 'Jeton başarıyla oluşturuldu!', 36 | 'token_helper_text' => 'Jetonunuzu yalnızca oluşturulduğunda gösterilir. Eğer jetonunuzu kaybederseniz, onu silip yeni bir tane oluşturmanız gerekir.', 37 | 'token_modal_heading_2' => 'Kişisel Erişim Jetonlarını Kopyala', 38 | 'token_empty_state_heading' => 'İlk jetonunuzu oluşturun', 39 | 'token_empty_state_description' => 'Başlamak için bir kişisel erişim jetonu oluşturun.', 40 | 'browser_section_title' => 'Tarayıcı Oturumları', 41 | 'browser_section_description' => 'Diğer tarayıcılar ve cihazlardaki aktif oturumlarınızı yönetin ve çıkış yapın.', 42 | 'browser_sessions_content' => 'Gerekirse, diğer tüm tarayıcı oturumlarınızdan çıkış yapabilirsiniz. Aşağıda bazı son oturumlarınız listelenmiştir, ancak bu liste tam kapsamlı olmayabilir. Hesabınızın güvenliğinin ihlal edildiğini düşünüyorsanız, şifrenizi de güncellemeniz gerekir.', 43 | 'browser_sessions_device' => 'Bu Cihaz', 44 | 'browser_sessions_last_active' => 'Son aktif', 45 | 'browser_sessions_log_out' => 'Diğer Tarayıcı Oturumlarından Çıkış Yap', 46 | 'browser_sessions_confirm_pass' => 'Tüm cihazlarınızdaki diğer tarayıcı oturumlarından çıkış yapmak istediğinizi onaylamak için lütfen şifrenizi girin.', 47 | 'browser_sessions_logout_success_notification' => 'Tüm diğer tarayıcı oturumlarından başarıyla çıkış yapıldı.', 48 | ]; 49 | -------------------------------------------------------------------------------- /resources/views/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joaopaulolndev/filament-edit-profile/418f6e202fc6927222e6744f0ac82a744c23443e/resources/views/.gitkeep -------------------------------------------------------------------------------- /resources/views/filament/pages/edit-profile-page.blade.php: -------------------------------------------------------------------------------- 1 | 2 | @foreach ($this->getRegisteredCustomProfileComponents() as $component) 3 | @unless(is_null($component)) 4 | @livewire($component) 5 | @endunless 6 | @endforeach 7 | 8 | -------------------------------------------------------------------------------- /resources/views/forms/components/browser-sessions.blade.php: -------------------------------------------------------------------------------- 1 | 5 |
6 |
7 |
8 |
9 | {{ __('filament-edit-profile::default.browser_sessions_content') }} 10 |
11 | @if (count($data) > 0) 12 |
13 | @foreach ($data as $session) 14 |
15 |
16 | @if ($session->device['desktop']) 17 | 21 | @else 22 | 26 | @endif 27 |
28 | 29 |
30 |
31 | {{ $session->device['platform'] ? $session->device['platform'] : __('Unknown') }} - {{ $session->device['browser'] ? $session->device['browser'] : __('Unknown') }} 32 |
33 | 34 |
35 |
36 | {{ $session->ip_address }}, 37 | 38 | @if ($session->is_current_device) 39 | {{ __('filament-edit-profile::default.browser_sessions_device') }} 40 | @else 41 | {{ __('filament-edit-profile::default.browser_sessions_last_active') }} {{ $session->last_active }} 42 | @endif 43 |
44 |
45 |
46 |
47 | @endforeach 48 |
49 | @endif 50 | 51 |
52 |
53 |
54 |
55 | -------------------------------------------------------------------------------- /resources/views/forms/components/delete-account-description.blade.php: -------------------------------------------------------------------------------- 1 | 5 |
6 |
7 |
8 | {{ __('filament-edit-profile::default.delete_account_card_description') }} 9 |
10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /resources/views/livewire/browser-sessions-form.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ $this->form }} 4 | 5 | 6 | 7 |
8 | -------------------------------------------------------------------------------- /resources/views/livewire/custom-fields-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ $this->form }} 3 | 4 |
5 |
6 | 7 | {{ __('filament-edit-profile::default.save') }} 8 | 9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /resources/views/livewire/delete-account-form.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ $this->form }} 4 | 5 | 6 | 7 |
8 | -------------------------------------------------------------------------------- /resources/views/livewire/edit-password-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ $this->form }} 3 | 4 |
5 |
6 | 7 | {{ __('filament-edit-profile::default.save') }} 8 | 9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /resources/views/livewire/edit-profile-form.blade.php: -------------------------------------------------------------------------------- 1 | 2 | {{ $this->form }} 3 | 4 |
5 |
6 | 7 | {{ __('filament-edit-profile::default.save') }} 8 | 9 |
10 |
11 |
12 | -------------------------------------------------------------------------------- /resources/views/livewire/sanctum-tokens.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | {{ __('filament-edit-profile::default.token_section_title') }} 4 | 5 | 6 | {{ __('filament-edit-profile::default.token_section_description') }} 7 | 8 | 9 | {{ $this->table }} 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/Commands/FilamentEditProfileCommand.php: -------------------------------------------------------------------------------- 1 | argument('name') ?? text( 24 | label: 'What is the form name?', 25 | placeholder: 'CustomEditProfileForm', 26 | required: true, 27 | )) 28 | ->trim('/') 29 | ->trim('\\') 30 | ->trim(' ') 31 | ->replace('/', '\\'); 32 | $componentClass = (string) str($component)->afterLast('\\'); 33 | $componentNamespace = str($component)->contains('\\') ? 34 | (string) str($component)->beforeLast('\\') : 35 | ''; 36 | 37 | $view = str($component) 38 | ->replace('\\', '/') 39 | ->prepend('Livewire/') 40 | ->explode('/') 41 | ->map(fn ($segment) => Str::lower(Str::kebab($segment))) 42 | ->implode('.'); 43 | 44 | $path = (string) str($component) 45 | ->prepend('/') 46 | ->prepend(app_path('Livewire/')) 47 | ->replace('\\', '/') 48 | ->replace('//', '/') 49 | ->append('.php'); 50 | 51 | $viewPath = resource_path( 52 | (string) str($view) 53 | ->replace('.', '/') 54 | ->prepend('views/') 55 | ->append('.blade.php'), 56 | ); 57 | 58 | $this->copyStubToApp('EditForm', $path, [ 59 | 'class' => $componentClass, 60 | 'namespace' => 'App\\Livewire' . ($componentNamespace !== '' ? "\\{$componentNamespace}" : ''), 61 | 'view' => $view, 62 | ]); 63 | 64 | $this->copyStubToApp('FormView', $viewPath); 65 | 66 | $this->components->info("Filament Edit Profile form [{$path}] created successfully."); 67 | 68 | return static::SUCCESS; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/Concerns/HasSort.php: -------------------------------------------------------------------------------- 1 | user(); 17 | 18 | if (! $user instanceof Model) { 19 | throw new Exception(__('filament-edit-profile::default.user_load_error')); 20 | } 21 | 22 | return $user; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/Facades/FilamentEditProfile.php: -------------------------------------------------------------------------------- 1 | pages($this->preparePages()); 69 | } 70 | 71 | protected function preparePages(): array 72 | { 73 | 74 | return [ 75 | EditProfilePage::class, 76 | ]; 77 | } 78 | 79 | public function boot(Panel $panel): void 80 | { 81 | $this->registerLivewireComponents(); 82 | } 83 | 84 | public static function make(): static 85 | { 86 | return app(static::class); 87 | } 88 | 89 | public static function get(): static 90 | { 91 | /** @var static $plugin */ 92 | $plugin = filament(app(static::class)->getId()); 93 | 94 | return $plugin; 95 | } 96 | 97 | public function setTitle(Closure | string $value = ''): static 98 | { 99 | $this->title = $value; 100 | 101 | return $this; 102 | } 103 | 104 | public function getTitle(): ?string 105 | { 106 | return ! empty($this->title) ? $this->evaluate($this->title) : null; 107 | } 108 | 109 | public function slug(Closure | string $value = 'edit-profile'): static 110 | { 111 | $this->slug = $value; 112 | 113 | return $this; 114 | } 115 | 116 | public function getSlug(): string 117 | { 118 | return $this->evaluate($this->slug); 119 | } 120 | 121 | public function setNavigationLabel(Closure | string $value = ''): static 122 | { 123 | $this->navigationLabel = $value; 124 | 125 | return $this; 126 | } 127 | 128 | public function getNavigationLabel(): ?string 129 | { 130 | return ! empty($this->navigationLabel) ? $this->evaluate($this->navigationLabel) : null; 131 | } 132 | 133 | public function setNavigationGroup(Closure | string $value = ''): static 134 | { 135 | $this->navigationGroup = $value; 136 | 137 | return $this; 138 | } 139 | 140 | public function getNavigationGroup(): ?string 141 | { 142 | return ! empty($this->navigationGroup) ? $this->evaluate($this->navigationGroup) : null; 143 | } 144 | 145 | public function setIcon(Closure | string $value = ''): static 146 | { 147 | $this->icon = $value; 148 | 149 | return $this; 150 | } 151 | 152 | public function getIcon(): ?string 153 | { 154 | return ! empty($this->icon) ? $this->evaluate($this->icon) : null; 155 | } 156 | 157 | public function setSort(Closure | int $value = 100): static 158 | { 159 | $this->sort = $value; 160 | 161 | return $this; 162 | } 163 | 164 | public function getSort(): int 165 | { 166 | return $this->evaluate($this->sort); 167 | } 168 | 169 | public function canAccess(Closure | bool $value = true): static 170 | { 171 | $this->access = $value; 172 | 173 | return $this; 174 | } 175 | 176 | public function getCanAccess(): bool 177 | { 178 | return $this->evaluate($this->access); 179 | } 180 | 181 | public function shouldRegisterNavigation(Closure | bool $value = true): static 182 | { 183 | $this->shouldRegisterNavigation = $value; 184 | 185 | return $this; 186 | } 187 | 188 | public function getShouldRegisterNavigation(): bool 189 | { 190 | return $this->evaluate($this->shouldRegisterNavigation); 191 | } 192 | 193 | public function shouldShowEditProfileForm(bool $value = true): static 194 | { 195 | $this->shouldShowEditProfileForm = $value; 196 | 197 | return $this; 198 | } 199 | 200 | public function getShouldShowEditProfileForm(): bool 201 | { 202 | return $this->evaluate($this->shouldShowEditProfileForm); 203 | } 204 | 205 | public function shouldShowEditPasswordForm(bool $value = true): static 206 | { 207 | $this->shouldShowEditPasswordForm = $value; 208 | 209 | return $this; 210 | } 211 | 212 | public function getShouldShowEditePasswordForm(): bool 213 | { 214 | return $this->evaluate($this->shouldShowEditPasswordForm); 215 | } 216 | 217 | public function shouldShowDeleteAccountForm(Closure | bool $value = true): static 218 | { 219 | $this->shouldShowDeleteAccountForm = $value; 220 | 221 | return $this; 222 | } 223 | 224 | public function getShouldShowDeleteAccountForm(): bool 225 | { 226 | return $this->evaluate($this->shouldShowDeleteAccountForm); 227 | } 228 | 229 | public function shouldShowBrowserSessionsForm(Closure | bool $value = true): static 230 | { 231 | $this->shouldShowBrowserSessionsForm = $value; 232 | 233 | if (config('session.driver') !== 'database') { 234 | $this->shouldShowBrowserSessionsForm = false; 235 | } 236 | 237 | return $this; 238 | } 239 | 240 | public function getShouldShowBrowserSessionsForm(): bool 241 | { 242 | if (config('session.driver') !== 'database') { 243 | $this->shouldShowBrowserSessionsForm = false; 244 | } 245 | 246 | return $this->evaluate($this->shouldShowBrowserSessionsForm); 247 | } 248 | 249 | public function getShouldShowSanctumTokens(): bool 250 | { 251 | if (! class_exists('Laravel\Sanctum\Sanctum')) { 252 | $this->sanctumTokens = false; 253 | } 254 | 255 | return $this->evaluate($this->sanctumTokens); 256 | } 257 | 258 | public function shouldShowSanctumTokens(Closure | bool $condition = true, ?array $permissions = null) 259 | { 260 | $this->sanctumTokens = $condition; 261 | 262 | if (! is_null($permissions)) { 263 | $this->sanctumPermissions = $permissions; 264 | } 265 | 266 | return $this; 267 | } 268 | 269 | public function getSanctumPermissions(): array 270 | { 271 | return collect($this->sanctumPermissions)->mapWithKeys(function ($item, $key) { 272 | $key = is_string($key) ? $key : strtolower($item); 273 | 274 | return [$key => $item]; 275 | })->toArray(); 276 | } 277 | 278 | public function shouldShowAvatarForm(Closure | bool $value = true, ?string $directory = null, string | array | null $rules = null): static 279 | { 280 | $this->shouldShowAvatarForm = $value; 281 | 282 | if (! is_null($directory)) { 283 | $this->avatarDirectory = $directory; 284 | } 285 | 286 | if (! is_null($rules)) { 287 | $this->avatarRules = $rules; 288 | } 289 | 290 | return $this; 291 | } 292 | 293 | public function shouldShowEmailForm(Closure | bool $value = true): static 294 | { 295 | $this->shouldShowEmailForm = $value; 296 | 297 | return $this; 298 | } 299 | 300 | public function getShouldShowEmailForm(): bool 301 | { 302 | return $this->evaluate($this->shouldShowEmailForm); 303 | } 304 | 305 | public function getShouldShowAvatarForm(): bool 306 | { 307 | return $this->evaluate($this->shouldShowAvatarForm); 308 | } 309 | 310 | public function getAvatarDirectory(): string 311 | { 312 | return $this->avatarDirectory; 313 | } 314 | 315 | public function getAvatarRules(): array | string 316 | { 317 | return $this->avatarRules; 318 | } 319 | 320 | private function registerLivewireComponents(): void 321 | { 322 | $components = collect(); 323 | 324 | if ($this->shouldShowEditProfileForm) { 325 | $components->put('edit_profile_form', EditProfileForm::class); 326 | } 327 | 328 | if ($this->shouldShowEditPasswordForm) { 329 | $components->put('edit_password_form', EditPasswordForm::class); 330 | } 331 | 332 | if ($this->getShouldShowDeleteAccountForm()) { 333 | $components->put('delete_account_form', DeleteAccountForm::class); 334 | } 335 | 336 | if ($this->getShouldShowSanctumTokens()) { 337 | $components->put('sanctum_tokens', SanctumTokens::class); 338 | } 339 | 340 | if ($this->getShouldShowBrowserSessionsForm()) { 341 | $components->put('browser_sessions_form', BrowserSessionsForm::class); 342 | } 343 | 344 | if (config('filament-edit-profile.show_custom_fields') && ! empty(config('filament-edit-profile.custom_fields'))) { 345 | $components->put('custom_fields_form', CustomFieldsForm::class); 346 | } 347 | 348 | $components->each(function ($class, $name) { 349 | Livewire::component($name, $class); 350 | }); 351 | 352 | $this->customProfileComponents($components->toArray()); 353 | } 354 | 355 | public function customProfileComponents(array $components): self 356 | { 357 | $this->registeredCustomProfileComponents = array_merge( 358 | $this->registeredCustomProfileComponents, 359 | $components 360 | ); 361 | 362 | return $this; 363 | } 364 | 365 | public function getRegisteredCustomProfileComponents(): array 366 | { 367 | return collect($this->registeredCustomProfileComponents) 368 | ->sortBy(fn (string $component) => $component::getSort()) 369 | ->all(); 370 | } 371 | } 372 | -------------------------------------------------------------------------------- /src/FilamentEditProfileServiceProvider.php: -------------------------------------------------------------------------------- 1 | name(static::$name) 32 | ->hasCommands($this->getCommands()) 33 | ->hasInstallCommand(function (InstallCommand $command) { 34 | $command 35 | ->publishConfigFile() 36 | ->publishMigrations() 37 | ->askToRunMigrations() 38 | ->askToStarRepoOnGitHub('joaopaulolndev/filament-edit-profile'); 39 | }); 40 | 41 | $configFileName = $package->shortName(); 42 | 43 | if (file_exists($package->basePath("/../config/{$configFileName}.php"))) { 44 | $package->hasConfigFile(); 45 | } 46 | 47 | if (file_exists($package->basePath('/../database/migrations'))) { 48 | $package->hasMigrations($this->getMigrations()); 49 | } 50 | 51 | if (file_exists($package->basePath('/../resources/lang'))) { 52 | $package->hasTranslations(); 53 | } 54 | 55 | if (file_exists($package->basePath('/../resources/views'))) { 56 | $package->hasViews(static::$viewNamespace); 57 | } 58 | } 59 | 60 | public function packageRegistered(): void {} 61 | 62 | public function packageBooted(): void 63 | { 64 | // Asset Registration 65 | FilamentAsset::register( 66 | $this->getAssets(), 67 | $this->getAssetPackageName() 68 | ); 69 | 70 | // FilamentAsset::registerScriptData( 71 | // $this->getScriptData(), 72 | // $this->getAssetPackageName() 73 | // ); 74 | 75 | // Icon Registration 76 | FilamentIcon::register($this->getIcons()); 77 | 78 | // Handle Stubs 79 | if (app()->runningInConsole()) { 80 | $publishMigration = function ($migrationFileName, $publishTag) { 81 | if (! $this->migrationFileExists($migrationFileName)) { 82 | $this->publishes([ 83 | __DIR__ . "/../database/migrations/{$migrationFileName}.stub" => database_path('migrations/' . date('Y_m_d_His', time()) . '_' . $migrationFileName), 84 | ], $publishTag); 85 | } 86 | }; 87 | $publishMigration('add_avatar_url_to_users_table.php', 'filament-edit-profile-avatar-migration'); 88 | $publishMigration('add_custom_fields_to_users_table.php', 'filament-edit-profile-custom-field-migration'); 89 | } 90 | 91 | // Testing 92 | Testable::mixin(new TestsFilamentEditProfile); 93 | } 94 | 95 | protected function getAssetPackageName(): ?string 96 | { 97 | return 'Joaopaulolndev/filament-edit-profile'; 98 | } 99 | 100 | /** 101 | * @return array 102 | */ 103 | protected function getAssets(): array 104 | { 105 | return [ 106 | // AlpineComponent::make('filament-edit-profile', __DIR__ . '/../resources/dist/components/filament-edit-profile.js'), 107 | Css::make('filament-edit-profile-styles', __DIR__ . '/../resources/dist/filament-edit-profile.css'), 108 | // Js::make('filament-edit-profile-scripts', __DIR__ . '/../resources/dist/filament-edit-profile.js'), 109 | ]; 110 | } 111 | 112 | /** 113 | * @return array 114 | */ 115 | protected function getCommands(): array 116 | { 117 | return [ 118 | FilamentEditProfileCommand::class, 119 | ]; 120 | } 121 | 122 | /** 123 | * @return array 124 | */ 125 | protected function getIcons(): array 126 | { 127 | return []; 128 | } 129 | 130 | /** 131 | * @return array 132 | */ 133 | protected function getRoutes(): array 134 | { 135 | return []; 136 | } 137 | 138 | /** 139 | * @return array 140 | */ 141 | protected function getScriptData(): array 142 | { 143 | return []; 144 | } 145 | 146 | /** 147 | * @return array 148 | */ 149 | protected function getMigrations(): array 150 | { 151 | return [ 152 | 'add_custom_fields_to_users_table', 153 | 'add_avatar_url_to_users_table', 154 | ]; 155 | } 156 | 157 | public static function migrationFileExists(string $migrationFileName): bool 158 | { 159 | $len = strlen($migrationFileName); 160 | foreach (glob(database_path('migrations/*.php.stub')) as $filename) { 161 | if ((substr($filename, -$len) === $migrationFileName)) { 162 | return true; 163 | } 164 | } 165 | 166 | return false; 167 | } 168 | } 169 | -------------------------------------------------------------------------------- /src/Livewire/BaseProfileForm.php: -------------------------------------------------------------------------------- 1 | afterLast('\\')->snake(); 25 | } 26 | 27 | public function render(): View 28 | { 29 | return view($this->view); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/Livewire/BrowserSessionsForm.php: -------------------------------------------------------------------------------- 1 | schema([ 25 | Forms\Components\Section::make(__('filament-edit-profile::default.browser_section_title')) 26 | ->description(__('filament-edit-profile::default.browser_section_description')) 27 | ->aside() 28 | ->schema([ 29 | Forms\Components\ViewField::make('browserSessions') 30 | ->label(__(__('filament-edit-profile::default.browser_section_title'))) 31 | ->hiddenLabel() 32 | ->view('filament-edit-profile::forms.components.browser-sessions') 33 | ->viewData(['data' => self::getSessions()]), 34 | Actions::make([ 35 | Actions\Action::make('deleteBrowserSessions') 36 | ->label(__('filament-edit-profile::default.browser_sessions_log_out')) 37 | ->requiresConfirmation() 38 | ->modalHeading(__('filament-edit-profile::default.browser_sessions_log_out')) 39 | ->modalDescription(__('filament-edit-profile::default.browser_sessions_confirm_pass')) 40 | ->modalSubmitActionLabel(__('filament-edit-profile::default.browser_sessions_log_out')) 41 | ->form([ 42 | Forms\Components\TextInput::make('password') 43 | ->password() 44 | ->revealable() 45 | ->label(__('filament-edit-profile::default.password')) 46 | ->required(), 47 | ]) 48 | ->action(function (array $data) { 49 | self::logoutOtherBrowserSessions($data['password']); 50 | }) 51 | ->modalWidth('2xl'), 52 | ]), 53 | 54 | ]), 55 | ]); 56 | } 57 | 58 | public static function getSessions(): array 59 | { 60 | if (config(key: 'session.driver') !== 'database') { 61 | return []; 62 | } 63 | 64 | return collect( 65 | value: DB::connection(config(key: 'session.connection'))->table(table: config(key: 'session.table', default: 'sessions')) 66 | ->where(column: 'user_id', operator: Auth::user()->getAuthIdentifier()) 67 | ->latest(column: 'last_activity') 68 | ->get() 69 | )->map(callback: function ($session): object { 70 | $agent = self::createAgent($session); 71 | 72 | return (object) [ 73 | 'device' => [ 74 | 'browser' => $agent->browser(), 75 | 'desktop' => $agent->isDesktop(), 76 | 'mobile' => $agent->isMobile(), 77 | 'tablet' => $agent->isTablet(), 78 | 'platform' => $agent->platform(), 79 | ], 80 | 'ip_address' => $session->ip_address, 81 | 'is_current_device' => $session->id === request()->session()->getId(), 82 | 'last_active' => Carbon::createFromTimestamp($session->last_activity)->diffForHumans(), 83 | ]; 84 | })->toArray(); 85 | } 86 | 87 | protected static function createAgent(mixed $session) 88 | { 89 | return tap( 90 | value: new Agent, 91 | callback: fn ($agent) => $agent->setUserAgent(userAgent: $session->user_agent) 92 | ); 93 | } 94 | 95 | public static function logoutOtherBrowserSessions($password): void 96 | { 97 | if (! Hash::check($password, Auth::user()->password)) { 98 | Notification::make() 99 | ->danger() 100 | ->title(__('filament-edit-profile::default.incorrect_password')) 101 | ->send(); 102 | 103 | return; 104 | } 105 | 106 | Auth::guard()->logoutOtherDevices($password); 107 | 108 | request()->session()->put([ 109 | 'password_hash_' . Auth::getDefaultDriver() => Auth::user()->getAuthPassword(), 110 | ]); 111 | 112 | self::deleteOtherSessionRecords(); 113 | 114 | Notification::make() 115 | ->success() 116 | ->title(__('filament-edit-profile::default.browser_sessions_logout_success_notification')) 117 | ->send(); 118 | } 119 | 120 | protected static function deleteOtherSessionRecords() 121 | { 122 | if (config('session.driver') !== 'database') { 123 | return; 124 | } 125 | 126 | DB::connection(config('session.connection'))->table(config('session.table', 'sessions')) 127 | ->where('user_id', Auth::user()->getAuthIdentifier()) 128 | ->where('id', '!=', request()->session()->getId()) 129 | ->delete(); 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /src/Livewire/CustomFieldsForm.php: -------------------------------------------------------------------------------- 1 | user = $this->getUser(); 32 | 33 | $data = $this->getUser()->attributesToArray(); 34 | 35 | $this->customFields = config('filament-edit-profile.custom_fields'); 36 | 37 | $this->form->fill($data['custom_fields'] ?? []); 38 | } 39 | 40 | public function form(Form $form): Form 41 | { 42 | $fields = array_map( 43 | [self::class, 'createField'], 44 | array_keys($this->customFields), 45 | $this->customFields 46 | ); 47 | 48 | return $form 49 | ->schema([ 50 | Forms\Components\Section::make(__('filament-edit-profile::default.custom_fields')) 51 | ->aside() 52 | ->description(__('filament-edit-profile::default.custom_fields_description')) 53 | ->columns() 54 | ->schema($fields), 55 | ]) 56 | ->model($this->getUser()) 57 | ->statePath('data'); 58 | } 59 | 60 | private static function createField(string $fieldKey, array | Closure $field): ?Forms\Components\Component 61 | { 62 | switch ($field['type']) { 63 | case 'text': 64 | return self::createTextInput($fieldKey, $field); 65 | case 'password': 66 | return self::createPasswordInput($fieldKey, $field); 67 | case 'boolean': 68 | return self::createCheckbox($fieldKey, $field); 69 | case 'select': 70 | return self::createSelect($fieldKey, $field); 71 | case 'textarea': 72 | return self::createTextarea($fieldKey, $field); 73 | case 'datetime': 74 | return self::createDateTimePicker($fieldKey, $field); 75 | case 'image': 76 | return self::createImageUpload($fieldKey, $field); 77 | default: 78 | return self::createFieldFromString($fieldKey, $field); 79 | } 80 | } 81 | 82 | private static function createFieldFromString(string $fieldKey, array $field): ?Forms\Components\Component 83 | { 84 | try { 85 | 86 | $class = \Illuminate\Support\Str::camel($field['type']); 87 | $class = "Filament\Forms\Components\\{$class}"; 88 | 89 | return $class::make($fieldKey) 90 | ->label(__($field['label'])) 91 | ->placeholder(__($field['placeholder'] ?? null)) 92 | ->required($field['required'] ?? false) 93 | ->columnSpan($field['column_span'] ?? 'full') 94 | ->rules($field['rules'] ?? []); 95 | 96 | } catch (Throwable $exception) { 97 | } 98 | } 99 | 100 | private static function createTextInput(string $fieldKey, array $field): TextInput 101 | { 102 | return TextInput::make($fieldKey) 103 | ->label(__($field['label'])) 104 | ->placeholder(__($field['placeholder'] ?? null)) 105 | ->id($field['id'] ?? null) 106 | ->required($field['required'] ?? false) 107 | ->hintIcon($field['hint_icon'] ?? null) 108 | ->hint(__($field['hint'] ?? null)) 109 | ->suffixIcon($field['suffix_icon'] ?? null) 110 | ->prefixIcon($field['prefix_icon'] ?? null) 111 | ->default($field['default'] ?? null) 112 | ->rules($field['rules'] ?? []) 113 | ->autocomplete($field['autocomplete'] ?? false) 114 | ->columnSpan($field['column_span'] ?? 'full'); 115 | } 116 | 117 | private static function createPasswordInput(string $fieldKey, array $field): TextInput 118 | { 119 | return TextInput::make($fieldKey) 120 | ->label(__($field['label'])) 121 | ->placeholder(__($field['placeholder'] ?? null)) 122 | ->id($field['id'] ?? null) 123 | ->hintIcon($field['hint_icon'] ?? null) 124 | ->hint(__($field['hint'] ?? null)) 125 | ->required($field['required'] ?? false) 126 | ->revealable($field['revealable'] ?? true) 127 | ->autocomplete($field['autocomplete'] ?? true) 128 | ->password() 129 | ->default($field['default'] ?? null) 130 | ->rules($field['rules'] ?? []) 131 | ->columnSpan($field['column_span'] ?? 'full'); 132 | } 133 | 134 | private static function createCheckbox(string $fieldKey, array $field): Checkbox 135 | { 136 | return Checkbox::make($fieldKey) 137 | ->label(__($field['label'])) 138 | ->id($field['id'] ?? null) 139 | ->required($field['required'] ?? false) 140 | ->hintIcon($field['hint_icon'] ?? null) 141 | ->hint(__($field['hint'] ?? null)) 142 | ->default($field['default'] ?? null) 143 | ->rules($field['rules'] ?? []) 144 | ->columnSpan($field['column_span'] ?? 'full'); 145 | } 146 | 147 | private static function createSelect(string $fieldKey, array $field): Select 148 | { 149 | return Select::make($fieldKey) 150 | ->label(__($field['label'])) 151 | ->placeholder(__($field['placeholder'] ?? null)) 152 | ->id($field['id'] ?? null) 153 | ->options($field['options'] ?? []) 154 | ->required($field['required'] ?? false) 155 | ->selectablePlaceholder($field['selectable_placeholder'] ?? true) 156 | ->native($field['native'] ?? true) 157 | ->preload($field['preload'] ?? true) 158 | ->suffixIcon($field['suffix_icon'] ?? null) 159 | ->default($field['default'] ?? null) 160 | ->searchable($field['searchable'] ?? true) 161 | ->columnSpan($field['column_span'] ?? 'full') 162 | ->hint($field['hint'] ?? null) 163 | ->hintIcon($field['hint_icon'] ?? null) 164 | ->rules($field['rules'] ?? []); 165 | } 166 | 167 | private static function createTextarea(string $fieldKey, array $field): Textarea 168 | { 169 | return Textarea::make($fieldKey) 170 | ->label(__($field['label'])) 171 | ->placeholder(__($field['placeholder'] ?? null)) 172 | ->id($field['id'] ?? null) 173 | ->required($field['required'] ?? false) 174 | ->hintIcon($field['hint_icon'] ?? null) 175 | ->hint(__($field['hint'] ?? null)) 176 | ->default($field['default'] ?? null) 177 | ->rules($field['rules'] ?? []) 178 | ->rows($field['rows'] ?? 3) 179 | ->columnSpan($field['column_span'] ?? 'full'); 180 | } 181 | 182 | private static function createDateTimePicker(string $fieldKey, array $field): DateTimePicker 183 | { 184 | return DateTimePicker::make($fieldKey) 185 | ->label(__($field['label'])) 186 | ->placeholder(__($field['placeholder'] ?? null)) 187 | ->required($field['required'] ?? false) 188 | ->id($field['id'] ?? null) 189 | ->hintIcon($field['hint_icon'] ?? null) 190 | ->hint(__($field['hint'] ?? null)) 191 | ->suffixIcon($field['suffix_icon'] ?? null) 192 | ->prefixIcon($field['prefix_icon'] ?? null) 193 | ->default($field['default'] ?? null) 194 | ->rules($field['rules'] ?? []) 195 | ->format($field['format'] ?? 'Y-m-d H:i:s') 196 | ->time($field['time'] ?? true) 197 | ->native($field['native'] ?? true) 198 | ->columnSpan($field['column_span'] ?? 'full') 199 | ->seconds($field['seconds'] ?? true); 200 | } 201 | 202 | private static function createImageUpload(string $fieldKey, array $field): FileUpload 203 | { 204 | return FileUpload::make($fieldKey) 205 | ->label(__($field['label'])) 206 | ->required($field['required']) 207 | ->image() 208 | ->directory($field['directory'] ?? 'uploads') 209 | ->rules($field['rules']); 210 | } 211 | 212 | public function updateCustomFields(): void 213 | { 214 | try { 215 | $data = $this->form->getState(); 216 | 217 | $data['custom_fields'] = $data ?? []; 218 | $customFields['custom_fields'] = $data['custom_fields']; 219 | 220 | $this->user->update($customFields); 221 | } catch (Halt $exception) { 222 | return; 223 | } 224 | 225 | Notification::make() 226 | ->success() 227 | ->title(__('filament-edit-profile::default.saved_successfully')) 228 | ->send(); 229 | } 230 | } 231 | -------------------------------------------------------------------------------- /src/Livewire/DeleteAccountForm.php: -------------------------------------------------------------------------------- 1 | schema([ 23 | Section::make(__('filament-edit-profile::default.delete_account')) 24 | ->description(__('filament-edit-profile::default.delete_account_description')) 25 | ->aside() 26 | ->schema([ 27 | Forms\Components\ViewField::make('deleteAccount') 28 | ->label(__('Delete Account')) 29 | ->hiddenLabel() 30 | ->view('filament-edit-profile::forms.components.delete-account-description'), 31 | Actions::make([ 32 | Actions\Action::make('deleteAccount') 33 | ->label(__('filament-edit-profile::default.delete_account')) 34 | ->icon('heroicon-m-trash') 35 | ->color('danger') 36 | ->requiresConfirmation() 37 | ->modalHeading(__('filament-edit-profile::default.delete_account')) 38 | ->modalDescription(__('filament-edit-profile::default.are_you_sure')) 39 | ->modalSubmitActionLabel(__('filament-edit-profile::default.yes_delete_it')) 40 | ->form([ 41 | Forms\Components\TextInput::make('password') 42 | ->password() 43 | ->revealable() 44 | ->label(__('filament-edit-profile::default.password')) 45 | ->required(), 46 | ]) 47 | ->action(function (array $data) { 48 | 49 | if (! Hash::check($data['password'], Auth::user()->password)) { 50 | $this->sendErrorDeleteAccount(__('filament-edit-profile::default.incorrect_password')); 51 | 52 | return; 53 | } 54 | 55 | auth()->user()?->delete(); 56 | }), 57 | ]), 58 | ]), 59 | ]); 60 | } 61 | 62 | public function sendErrorDeleteAccount(string $message): void 63 | { 64 | Notification::make() 65 | ->danger() 66 | ->title($message) 67 | ->send(); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/Livewire/EditPasswordForm.php: -------------------------------------------------------------------------------- 1 | user = $this->getUser(); 28 | 29 | $this->form->fill(); 30 | } 31 | 32 | public function form(Form $form): Form 33 | { 34 | return $form 35 | ->schema([ 36 | Section::make(__('filament-edit-profile::default.update_password')) 37 | ->aside() 38 | ->description(__('filament-edit-profile::default.ensure_your_password')) 39 | ->schema([ 40 | TextInput::make('Current password') 41 | ->label(__('filament-edit-profile::default.current_password')) 42 | ->password() 43 | ->required() 44 | ->currentPassword() 45 | ->revealable(), 46 | TextInput::make('password') 47 | ->label(__('filament-edit-profile::default.new_password')) 48 | ->password() 49 | ->required() 50 | ->rule(Password::default()) 51 | ->autocomplete('new-password') 52 | ->dehydrateStateUsing(fn ($state): string => Hash::make($state)) 53 | ->live(debounce: 500) 54 | ->same('passwordConfirmation') 55 | ->revealable(), 56 | TextInput::make('passwordConfirmation') 57 | ->label(__('filament-edit-profile::default.confirm_password')) 58 | ->password() 59 | ->required() 60 | ->dehydrated(false) 61 | ->revealable(), 62 | ]), 63 | ]) 64 | ->model($this->getUser()) 65 | ->statePath('data'); 66 | } 67 | 68 | public function updatePassword(): void 69 | { 70 | try { 71 | $data = $this->form->getState(); 72 | 73 | $newData = [ 74 | 'password' => $data['password'], 75 | ]; 76 | 77 | $this->user->update($newData); 78 | } catch (Halt $exception) { 79 | return; 80 | } 81 | 82 | if (request()->hasSession() && array_key_exists('password', $data)) { 83 | request()->session()->put([ 84 | 'password_hash_' . Filament::getAuthGuard() => $data['password'], 85 | ]); 86 | } 87 | 88 | $this->form->fill(); 89 | 90 | Notification::make() 91 | ->success() 92 | ->title(__('filament-edit-profile::default.saved_successfully')) 93 | ->send(); 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /src/Livewire/EditProfileForm.php: -------------------------------------------------------------------------------- 1 | user = $this->getUser(); 28 | 29 | $this->userClass = get_class($this->user); 30 | 31 | $fields = ['name', 'email']; 32 | 33 | if (filament('filament-edit-profile')->getShouldShowAvatarForm()) { 34 | $fields[] = config('filament-edit-profile.avatar_column', 'avatar_url'); 35 | } 36 | 37 | $this->form->fill($this->user->only($fields)); 38 | } 39 | 40 | public function form(Form $form): Form 41 | { 42 | return $form 43 | ->schema([ 44 | Section::make(__('filament-edit-profile::default.profile_information')) 45 | ->aside() 46 | ->description(__('filament-edit-profile::default.profile_information_description')) 47 | ->schema([ 48 | FileUpload::make(config('filament-edit-profile.avatar_column', 'avatar_url')) 49 | ->label(__('filament-edit-profile::default.avatar')) 50 | ->avatar() 51 | ->imageEditor() 52 | ->disk(config('filament-edit-profile.disk', 'public')) 53 | ->visibility(config('filament-edit-profile.visibility', 'public')) 54 | ->directory(filament('filament-edit-profile')->getAvatarDirectory()) 55 | ->rules(filament('filament-edit-profile')->getAvatarRules()) 56 | ->hidden(! filament('filament-edit-profile')->getShouldShowAvatarForm()), 57 | TextInput::make('name') 58 | ->label(__('filament-edit-profile::default.name')) 59 | ->required(), 60 | TextInput::make('email') 61 | ->label(__('filament-edit-profile::default.email')) 62 | ->email() 63 | ->required() 64 | ->hidden(! filament('filament-edit-profile')->getShouldShowEmailForm()) 65 | ->unique($this->userClass, ignorable: $this->user), 66 | ]), 67 | ]) 68 | ->statePath('data'); 69 | } 70 | 71 | public function updateProfile(): void 72 | { 73 | try { 74 | $data = $this->form->getState(); 75 | 76 | $this->user->update($data); 77 | } catch (Halt $exception) { 78 | return; 79 | } 80 | 81 | Notification::make() 82 | ->success() 83 | ->title(__('filament-edit-profile::default.saved_successfully')) 84 | ->send(); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/Livewire/SanctumTokens.php: -------------------------------------------------------------------------------- 1 | user = $this->getUser(); 34 | } 35 | 36 | public function table(Table $table): Table 37 | { 38 | $auth = Filament::getCurrentPanel()->auth(); 39 | 40 | return $table 41 | ->query(app(Sanctum::$personalAccessTokenModel)->where([ 42 | ['tokenable_id', '=', $auth->id()], 43 | ['tokenable_type', '=', get_class($auth->user())], 44 | ])) 45 | ->columns([ 46 | Tables\Columns\TextColumn::make('name') 47 | ->label(__('filament-edit-profile::default.token_name')), 48 | Tables\Columns\TextColumn::make('created_at') 49 | ->date() 50 | ->label(__('filament-edit-profile::default.token_created_at')) 51 | ->sortable(), 52 | Tables\Columns\TextColumn::make('expires_at') 53 | ->color(fn ($record) => now()->gt($record->expires_at) ? 'danger' : null) 54 | ->date() 55 | ->label(__('filament-edit-profile::default.token_expires_at')) 56 | ->sortable(), 57 | ]) 58 | ->actions([ 59 | Tables\Actions\DeleteAction::make(), 60 | ]) 61 | ->headerActions([ 62 | Tables\Actions\CreateAction::make() 63 | ->label(__('filament-edit-profile::default.token_action_label')) 64 | ->modalWidth('md') 65 | ->form([ 66 | TextInput::make('token_name') 67 | ->label(__('filament-edit-profile::default.token_name')) 68 | ->required(), 69 | CheckboxList::make('abilities') 70 | ->label(__('filament-edit-profile::default.token_abilities')) 71 | ->options(filament('filament-edit-profile')->getSanctumPermissions()) 72 | ->columns(2) 73 | ->required(), 74 | DatePicker::make('expires_at') 75 | ->label(__('filament-edit-profile::default.token_expires_at')), 76 | ]) 77 | ->action(function ($data) { 78 | $this->plainTextToken = $this->user->createToken( 79 | $data['token_name'], 80 | array_values($data['abilities']), 81 | $data['expires_at'] ? Carbon::createFromFormat('Y-m-d', $data['expires_at']) : null 82 | )->plainTextToken; 83 | 84 | $this->replaceMountedAction('showToken', [ 85 | 'token' => $this->plainTextToken, 86 | ]); 87 | 88 | Notification::make() 89 | ->success() 90 | ->title(__('filament-edit-profile::default.token_create_notification')) 91 | ->send(); 92 | }) 93 | ->modalHeading(__('filament-edit-profile::default.token_modal_heading')), 94 | ]) 95 | ->emptyStateHeading(__('filament-edit-profile::default.token_empty_state_heading')) 96 | ->emptyStateDescription(__('filament-edit-profile::default.token_empty_state_description')); 97 | } 98 | 99 | public function showTokenAction(): Action 100 | { 101 | return Action::make('token') 102 | ->fillForm(fn (array $arguments) => [ 103 | 'token' => $arguments['token'], 104 | ]) 105 | ->form([ 106 | TextInput::make('token') 107 | ->helperText(__('filament-edit-profile::default.token_helper_text')), 108 | ]) 109 | ->modalHeading(__('filament-edit-profile::default.token_modal_heading_2')) 110 | ->modalIcon('heroicon-o-key') 111 | ->modalAlignment(Alignment::Center) 112 | ->modalSubmitAction(false) 113 | ->modalCancelAction(false) 114 | ->closeModalByClickingAway(false); 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /src/Pages/EditProfilePage.php: -------------------------------------------------------------------------------- 1 | getPlugin('filament-edit-profile'); 17 | 18 | $slug = $plugin->getSlug(); 19 | 20 | return $slug ? $slug : self::$slug; 21 | } 22 | 23 | public static function shouldRegisterNavigation(): bool 24 | { 25 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 26 | 27 | return $plugin->getShouldRegisterNavigation(); 28 | } 29 | 30 | public static function getNavigationSort(): ?int 31 | { 32 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 33 | 34 | return $plugin->getSort(); 35 | } 36 | 37 | public static function getNavigationIcon(): ?string 38 | { 39 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 40 | 41 | return $plugin->getIcon(); 42 | } 43 | 44 | public static function getNavigationGroup(): ?string 45 | { 46 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 47 | 48 | return $plugin->getNavigationGroup(); 49 | } 50 | 51 | public function getTitle(): string 52 | { 53 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 54 | 55 | return $plugin->getTitle() ?? __('filament-edit-profile::default.title'); 56 | } 57 | 58 | public static function getNavigationLabel(): string 59 | { 60 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 61 | 62 | return $plugin->getNavigationLabel() ?? __('filament-edit-profile::default.title'); 63 | } 64 | 65 | public static function canAccess(): bool 66 | { 67 | $plugin = Filament::getCurrentPanel()?->getPlugin('filament-edit-profile'); 68 | 69 | return $plugin->getCanAccess(); 70 | } 71 | 72 | public function getRegisteredCustomProfileComponents(): array 73 | { 74 | return filament('filament-edit-profile')->getRegisteredCustomProfileComponents(); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/Testing/TestsFilamentEditProfile.php: -------------------------------------------------------------------------------- 1 | form->fill(); 26 | } 27 | 28 | public function form(Form $form): Form 29 | { 30 | return $form 31 | ->schema([ 32 | Section::make('Custom component') 33 | ->aside() 34 | ->description('Custom component description') 35 | ->schema([ 36 | // 37 | ]), 38 | ]) 39 | ->statePath('data'); 40 | } 41 | 42 | public function save(): void 43 | { 44 | $data = $this->form->getState(); 45 | } 46 | 47 | public function render(): View 48 | { 49 | return view('{{ view }}'); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /stubs/FormView.stub: -------------------------------------------------------------------------------- 1 |
2 | 3 | {{ $this->form }} 4 | 5 |
6 |
7 | 8 | {{ __('filament-edit-profile::default.save') }} 9 | 10 |
11 |
12 |
13 | 14 | 15 |
16 | --------------------------------------------------------------------------------