mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-05-13 08:45:01 +00:00
fixes part 1
This commit is contained in:
@@ -754,6 +754,7 @@ return [
|
|||||||
// v2
|
// v2
|
||||||
'member' => 'Members',
|
'member' => 'Members',
|
||||||
|
|
||||||
|
// file request
|
||||||
'request_for_upload' => '{name} is Asking You For Files',
|
'request_for_upload' => '{name} is Asking You For Files',
|
||||||
'request_for_upload_success' => 'Upload Request for {name} was Fulfilled Successfully',
|
'request_for_upload_success' => 'Upload Request for {name} was Fulfilled Successfully',
|
||||||
'request_for_upload_expired' => 'Upload Request Expired',
|
'request_for_upload_expired' => 'Upload Request Expired',
|
||||||
@@ -763,5 +764,11 @@ return [
|
|||||||
'closing_request_for_upload_warn' => "You won't be able to upload any files here once again.",
|
'closing_request_for_upload_warn' => "You won't be able to upload any files here once again.",
|
||||||
'user_leave_message' => '{name} leave you a message',
|
'user_leave_message' => '{name} leave you a message',
|
||||||
'tell_you_are_done' => 'Tell {name} you are done!',
|
'tell_you_are_done' => 'Tell {name} you are done!',
|
||||||
|
|
||||||
|
// teams
|
||||||
|
'user_invite_you_into_team_folder' => '{name} invite you to join with his team into shared team folder',
|
||||||
|
'register_with_email_and_get_folder' => 'Register account with your email {email} and get access to this Team Folder.',
|
||||||
|
'' => '',
|
||||||
|
'' => '',
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
<OptionGroup :title="$t('Create')">
|
<OptionGroup :title="$t('Create')">
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:title="$t('actions.create_folder')"
|
:title="$t('actions.create_folder')"
|
||||||
icon="folder-plus"
|
icon="folder-plus"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
<OptionGroup :title="$t('Create')">
|
<OptionGroup :title="$t('Create')">
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:class="{
|
:class="{
|
||||||
'is-inactive': canCreateFolder || isTeamFolderHomepage || isSharedWithMeHomepage,
|
'is-inactive': canCreateFolder || isTeamFolderHomepage || isSharedWithMeHomepage,
|
||||||
}"
|
}"
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
<OptionGroup :title="$t('Create')">
|
<OptionGroup :title="$t('Create')">
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:title="$t('actions.create_folder')"
|
:title="$t('actions.create_folder')"
|
||||||
icon="folder-plus"
|
icon="folder-plus"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,22 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="sticky top-14 z-[19] flex items-center overflow-x-auto whitespace-nowrap bg-white px-4 pb-3 dark:bg-dark-background lg:hidden"
|
class="sticky top-14 z-[19] overflow-x-auto whitespace-nowrap bg-white px-4 pb-3 dark:bg-dark-background lg:hidden"
|
||||||
>
|
>
|
||||||
<!--Show Buttons-->
|
<div class="flex items-center">
|
||||||
<slot v-if="!isMultiSelectMode" />
|
<!--Show Buttons-->
|
||||||
|
<slot v-if="!isMultiSelectMode" />
|
||||||
|
|
||||||
<!-- Multi select mode -->
|
<!-- Multi select mode -->
|
||||||
<div v-if="isMultiSelectMode">
|
<div v-if="isMultiSelectMode">
|
||||||
<MobileActionButton @click.native="selectAll" icon="check-square">
|
<MobileActionButton @click.native="selectAll" icon="check-square">
|
||||||
{{ $t('mobile_selecting.select_all') }}
|
{{ $t('mobile_selecting.select_all') }}
|
||||||
</MobileActionButton>
|
</MobileActionButton>
|
||||||
<MobileActionButton @click.native="deselectAll" icon="x-square">
|
<MobileActionButton @click.native="deselectAll" icon="x-square">
|
||||||
{{ $t('mobile_selecting.deselect_all') }}
|
{{ $t('mobile_selecting.deselect_all') }}
|
||||||
</MobileActionButton>
|
</MobileActionButton>
|
||||||
<MobileActionButton @click.native="disableMultiSelectMode" icon="check">
|
<MobileActionButton @click.native="disableMultiSelectMode" icon="check">
|
||||||
{{ $t('mobile_selecting.done') }}
|
{{ $t('mobile_selecting.done') }}
|
||||||
</MobileActionButton>
|
</MobileActionButton>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!--Upload Progressbar-->
|
<!--Upload Progressbar-->
|
||||||
<UploadProgress class="pt-3" />
|
<UploadProgress class="pt-3" />
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
'border-3 border-white dark:border-dark-background': isBorder,
|
'border-3 border-white dark:border-dark-background': isBorder,
|
||||||
},
|
},
|
||||||
]"
|
]"
|
||||||
class=""
|
class="object-cover"
|
||||||
/>
|
/>
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<div
|
<div
|
||||||
v-if="isVisible"
|
v-if="isVisible"
|
||||||
@click="closeMenu"
|
@click="closeMenu"
|
||||||
class="fixed left-0 right-0 top-0 bottom-0 z-20 bg-dark-background bg-opacity-[0.35] dark:bg-opacity-[0.45]"
|
class="fixed left-0 right-0 top-0 bottom-0 z-[49] bg-dark-background bg-opacity-[0.35] dark:bg-opacity-[0.45]"
|
||||||
></div>
|
></div>
|
||||||
</transition>
|
</transition>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,25 +1,31 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="relative cursor-pointer">
|
<div class="relative flex items-center justify-center cursor-pointer h-14 w-14 overflow-hidden bg-light-background rounded-xl cursor-pointer z-10">
|
||||||
<input
|
<input
|
||||||
ref="file"
|
ref="file"
|
||||||
type="file"
|
type="file"
|
||||||
@change="showImagePreview($event)"
|
@change="showImagePreview($event)"
|
||||||
class="absolute top-0 bottom-0 left-0 right-0 z-10 w-full cursor-pointer opacity-0"
|
class="absolute top-0 bottom-0 left-0 right-0 z-10 w-full cursor-pointer opacity-0"
|
||||||
/>
|
/>
|
||||||
|
<camera-icon v-if="!imagePreview" size="22" class="vue-feather text-gray-300" />
|
||||||
<img
|
<img
|
||||||
v-if="imagePreview"
|
v-if="imagePreview"
|
||||||
ref="image"
|
ref="image"
|
||||||
:src="imagePreview"
|
:src="imagePreview"
|
||||||
class="relative z-0 h-14 w-14 cursor-pointer rounded-xl object-cover shadow-lg md:h-16 md:w-16"
|
class="relative w-full h-full z-0 object-cover shadow-lg md:h-16 md:w-16"
|
||||||
alt="avatar"
|
alt="avatar"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { CameraIcon} from 'vue-feather-icons'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AvatarInput',
|
name: 'AvatarInput',
|
||||||
props: ['avatar'],
|
props: ['avatar'],
|
||||||
|
components: {
|
||||||
|
CameraIcon,
|
||||||
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
imagePreview: undefined,
|
imagePreview: undefined,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
class="relative block cursor-pointer lg:mr-2 lg:w-2 2xl:w-3"
|
class="relative block cursor-pointer lg:mr-2 lg:w-2 2xl:w-3"
|
||||||
:style="{ height: bar.percentage > 0 ? bar.percentage + '%' : '10px' }"
|
:style="{ height: bar.percentage > 0 ? bar.percentage + '%' : '8px' }"
|
||||||
@mouseover="isVisible = true"
|
@mouseover="isVisible = true"
|
||||||
@mouseleave="isVisible = false"
|
@mouseleave="isVisible = false"
|
||||||
>
|
>
|
||||||
|
|||||||
+5
-1
@@ -137,7 +137,11 @@ const mutations = {
|
|||||||
state.user.data.relationships.settings.data.attributes.last_name = name
|
state.user.data.relationships.settings.data.attributes.last_name = name
|
||||||
},
|
},
|
||||||
UPDATE_AVATAR(state, avatar) {
|
UPDATE_AVATAR(state, avatar) {
|
||||||
state.user.data.relationships.settings.data.attributes.avatar.sm = avatar
|
state.user.data.attributes.avatar = {
|
||||||
|
xs: avatar,
|
||||||
|
sm: avatar,
|
||||||
|
md: avatar,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
REMOVE_ITEM_FROM_FAVOURITES(state, item) {
|
REMOVE_ITEM_FROM_FAVOURITES(state, item) {
|
||||||
state.user.data.relationships.favourites.data = state.user.data.relationships.favourites.data.filter(
|
state.user.data.relationships.favourites.data = state.user.data.relationships.favourites.data.filter(
|
||||||
|
|||||||
@@ -56,6 +56,7 @@
|
|||||||
:description="$t('page_sign_in.subtitle')"
|
:description="$t('page_sign_in.subtitle')"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
|
v-if="checkedAccount.avatar"
|
||||||
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
||||||
:src="checkedAccount.avatar.md"
|
:src="checkedAccount.avatar.md"
|
||||||
:alt="checkedAccount.name"
|
:alt="checkedAccount.name"
|
||||||
@@ -112,6 +113,7 @@
|
|||||||
:description="$t('page_not_verified.subtitle')"
|
:description="$t('page_not_verified.subtitle')"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
|
v-if="checkedAccount.avatar"
|
||||||
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
||||||
:src="checkedAccount.avatar.md"
|
:src="checkedAccount.avatar.md"
|
||||||
:alt="checkedAccount.name"
|
:alt="checkedAccount.name"
|
||||||
@@ -134,6 +136,7 @@
|
|||||||
:description="$t('page_sign_in_2fa_subtitle')"
|
:description="$t('page_sign_in_2fa_subtitle')"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
|
v-if="checkedAccount.avatar"
|
||||||
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
||||||
:src="checkedAccount.avatar.md"
|
:src="checkedAccount.avatar.md"
|
||||||
:alt="checkedAccount.name"
|
:alt="checkedAccount.name"
|
||||||
@@ -183,6 +186,7 @@
|
|||||||
:description="$t('page_sign_in.2fa_recovery_subtitle')"
|
:description="$t('page_sign_in.2fa_recovery_subtitle')"
|
||||||
>
|
>
|
||||||
<img
|
<img
|
||||||
|
v-if="checkedAccount.avatar"
|
||||||
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
class="user-avatar mx-auto mb-6 w-28 rounded-xl shadow-xl"
|
||||||
:src="checkedAccount.avatar.md"
|
:src="checkedAccount.avatar.md"
|
||||||
:alt="checkedAccount.name"
|
:alt="checkedAccount.name"
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
</OptionGroup>
|
</OptionGroup>
|
||||||
<OptionGroup v-if="!isTeamFolderHomepage">
|
<OptionGroup v-if="!isTeamFolderHomepage">
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:title="$t('actions.create_folder')"
|
:title="$t('actions.create_folder')"
|
||||||
icon="folder-plus"
|
icon="folder-plus"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -94,7 +94,7 @@
|
|||||||
<OptionUpload :title="$t('actions.upload')" type="file" />
|
<OptionUpload :title="$t('actions.upload')" type="file" />
|
||||||
<OptionUpload :title="$t('actions.upload_folder')" type="folder" />
|
<OptionUpload :title="$t('actions.upload_folder')" type="folder" />
|
||||||
<Option
|
<Option
|
||||||
@click.stop.native="$createFolder"
|
@click.native="$createFolder"
|
||||||
:title="$t('actions.create_folder')"
|
:title="$t('actions.create_folder')"
|
||||||
icon="folder-plus"
|
icon="folder-plus"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -41,7 +41,7 @@
|
|||||||
<!--Image input for replace avatar-->
|
<!--Image input for replace avatar-->
|
||||||
<AvatarInput
|
<AvatarInput
|
||||||
v-model="avatar"
|
v-model="avatar"
|
||||||
:avatar="user.data.relationships.settings.data.attributes.avatar.md"
|
:avatar="user.data.relationships.settings.data.attributes.avatar ? user.data.relationships.settings.data.attributes.avatar.md : undefined"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!--User name & email-->
|
<!--User name & email-->
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
v-if="invitation"
|
v-if="invitation"
|
||||||
:title="$t('Invitation To Join Team Folder')"
|
:title="$t('Invitation To Join Team Folder')"
|
||||||
:description="
|
:description="
|
||||||
$t('{name} invite you to join with his team into shared team folder', {
|
$t('user_invite_you_into_team_folder', {
|
||||||
name: invitation.data.relationships.inviter.data.attributes.name,
|
name: invitation.data.relationships.inviter.data.attributes.name,
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
v-if="invitation && !invitation.data.attributes.isExistedUser"
|
v-if="invitation && !invitation.data.attributes.isExistedUser"
|
||||||
class="mx-auto mb-4 max-w-md text-sm text-gray-500"
|
class="mx-auto mb-4 max-w-md text-sm text-gray-500"
|
||||||
v-html="
|
v-html="
|
||||||
$t('Register account with your email peterpapp@makingcg.com and get access to this Team Folder.', {
|
$t('register_with_email_and_get_folder', {
|
||||||
email: invitation.data.attributes.email,
|
email: invitation.data.attributes.email,
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class UserSetting extends Model
|
|||||||
/**
|
/**
|
||||||
* Format avatar to full url
|
* Format avatar to full url
|
||||||
*/
|
*/
|
||||||
public function getAvatarAttribute(): array|string
|
public function getAvatarAttribute(): array|null
|
||||||
{
|
{
|
||||||
$link = [];
|
$link = [];
|
||||||
|
|
||||||
@@ -61,12 +61,7 @@ class UserSetting extends Model
|
|||||||
return $link;
|
return $link;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return default avatar
|
return null;
|
||||||
foreach (config('vuefilemanager.avatar_sizes') as $item) {
|
|
||||||
$link[$item['name']] = url('/assets/images/default-avatar.png');
|
|
||||||
}
|
|
||||||
|
|
||||||
return $link;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getNameAttribute(): string
|
public function getNameAttribute(): string
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Users\Resources;
|
namespace App\Users\Resources;
|
||||||
|
|
||||||
use Domain\Folders\Resources\FolderCollection;
|
use Domain\Folders\Resources\FolderCollection;
|
||||||
@@ -31,6 +32,7 @@ class UserResource extends JsonResource
|
|||||||
'id' => $this->id,
|
'id' => $this->id,
|
||||||
'type' => 'user',
|
'type' => 'user',
|
||||||
'attributes' => [
|
'attributes' => [
|
||||||
|
'color' => $this->settings->color,
|
||||||
'avatar' => $this->settings->avatar,
|
'avatar' => $this->settings->avatar,
|
||||||
'email' => is_demo() ? obfuscate_email($this->email) : $this->email,
|
'email' => is_demo() ? obfuscate_email($this->email) : $this->email,
|
||||||
'role' => $this->role,
|
'role' => $this->role,
|
||||||
@@ -44,16 +46,16 @@ class UserResource extends JsonResource
|
|||||||
'settings' => new SettingsResource($this->settings),
|
'settings' => new SettingsResource($this->settings),
|
||||||
'favourites' => new FolderCollection($this->favouriteFolders),
|
'favourites' => new FolderCollection($this->favouriteFolders),
|
||||||
'creditCards' => new CreditCardCollection($this->creditCards),
|
'creditCards' => new CreditCardCollection($this->creditCards),
|
||||||
$this->mergeWhen($this->hasSubscription(), fn () => [
|
$this->mergeWhen($this->hasSubscription(), fn() => [
|
||||||
'subscription' => new SubscriptionResource($this->subscription),
|
'subscription' => new SubscriptionResource($this->subscription),
|
||||||
]),
|
]),
|
||||||
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn () => [
|
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn() => [
|
||||||
'balance' => new BalanceResource($this->balance),
|
'balance' => new BalanceResource($this->balance),
|
||||||
]),
|
]),
|
||||||
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn () => [
|
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn() => [
|
||||||
'alert' => new BillingAlertResource($this->billingAlert),
|
'alert' => new BillingAlertResource($this->billingAlert),
|
||||||
]),
|
]),
|
||||||
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn () => [
|
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn() => [
|
||||||
'failedPayments' => new FailedPaymentsCollection($this->failedPayments),
|
'failedPayments' => new FailedPaymentsCollection($this->failedPayments),
|
||||||
]),
|
]),
|
||||||
],
|
],
|
||||||
@@ -65,13 +67,13 @@ class UserResource extends JsonResource
|
|||||||
'canCreateTeamFolder' => $this->canCreateTeamFolder(),
|
'canCreateTeamFolder' => $this->canCreateTeamFolder(),
|
||||||
'canInviteTeamMembers' => $this->canInviteTeamMembers(),
|
'canInviteTeamMembers' => $this->canInviteTeamMembers(),
|
||||||
],
|
],
|
||||||
$this->mergeWhen($isFixedSubscription, fn () => [
|
$this->mergeWhen($isFixedSubscription, fn() => [
|
||||||
'limitations' => $this->limitations->summary(),
|
'limitations' => $this->limitations->summary(),
|
||||||
]),
|
]),
|
||||||
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn () => [
|
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn() => [
|
||||||
'usages' => $this->getUsageEstimates(),
|
'usages' => $this->getUsageEstimates(),
|
||||||
]),
|
]),
|
||||||
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn () => [
|
$this->mergeWhen($isMeteredSubscription && $this->hasSubscription(), fn() => [
|
||||||
'totalDebt' => [
|
'totalDebt' => [
|
||||||
'formatted' => format_currency($this->failedPayments->sum('amount'), $this->subscription->plan->currency),
|
'formatted' => format_currency($this->failedPayments->sum('amount'), $this->subscription->plan->currency),
|
||||||
'amount' => $this->failedPayments->sum('amount'),
|
'amount' => $this->failedPayments->sum('amount'),
|
||||||
|
|||||||
@@ -84,8 +84,8 @@ class FileResource extends JsonResource
|
|||||||
'iso' => $this->exif->iso,
|
'iso' => $this->exif->iso,
|
||||||
'aperture_f_number' => $this->exif->aperture_f_number,
|
'aperture_f_number' => $this->exif->aperture_f_number,
|
||||||
'ccd_width' => $this->exif->ccd_width,
|
'ccd_width' => $this->exif->ccd_width,
|
||||||
'longitude' => format_gps_coordinates($this->exif->longitude, $this->exif->longitude_ref),
|
'longitude' => formatGPSCoordinates($this->exif->longitude, $this->exif->longitude_ref),
|
||||||
'latitude' => format_gps_coordinates($this->exif->latitude, $this->exif->latitude_ref),
|
'latitude' => formatGPSCoordinates($this->exif->latitude, $this->exif->latitude_ref),
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ class UploadRequestResource extends JsonResource
|
|||||||
'type' => 'user',
|
'type' => 'user',
|
||||||
'attributes' => [
|
'attributes' => [
|
||||||
'name' => $this->user->settings->first_name,
|
'name' => $this->user->settings->first_name,
|
||||||
|
'color' => $this->user->settings->color,
|
||||||
'avatar' => $this->user->settings->avatar,
|
'avatar' => $this->user->settings->avatar,
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||
+13
-12
@@ -1110,20 +1110,21 @@ if (! function_exists('replace_occurrence')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(! function_exists('format_gps_coordinates')) {
|
if (!function_exists('formatGPSCoordinates')) {
|
||||||
/**
|
/**
|
||||||
* Format GPS coordinates
|
* Format GPS coordinates
|
||||||
*/
|
*/
|
||||||
function format_gps_coordinates($coordinates, $ref)
|
function formatGPSCoordinates($coordinates, $ref): string|null
|
||||||
{
|
{
|
||||||
if($coordinates && $ref) {
|
if (!$coordinates && !$ref) {
|
||||||
|
return null;
|
||||||
return
|
|
||||||
explode('/',$coordinates[0])[0] . '°' .
|
|
||||||
explode('/', $coordinates[1])[0] . "'" .
|
|
||||||
substr(explode(',', $coordinates[2])[0], 0, 5) / 1000 . '"' .
|
|
||||||
$ref;
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
$degrees = explode('/', $coordinates[0])[0];
|
||||||
|
$minutes = explode('/', $coordinates[1])[0];
|
||||||
|
$seconds = intval(substr(explode(',', $coordinates[2])[0], 0, 5)) / 100;
|
||||||
|
|
||||||
|
return "{$degrees}°$minutes'$seconds\"$ref";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user