mirror of
https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal.git
synced 2025-12-11 06:46:47 +00:00
cleanup and start with nostr
This commit is contained in:
@@ -1,14 +0,0 @@
|
||||
<div class="bg-white flex flex-col h-screen justify-between py-16">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4 flex flex-col sm:flex-row">
|
||||
<div class="flex flex-col space-y-4">
|
||||
<div class="flex justify-center" wire:key="qrcode">
|
||||
<a href="{{ $this->url }}">
|
||||
<img src="{{ 'data:image/png;base64, '. $this->qrCode }}" alt="qrcode">
|
||||
</a>
|
||||
</div>
|
||||
<code class="font-mono text-black">
|
||||
{{ $this->url }}
|
||||
</code>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,216 +0,0 @@
|
||||
<x-jet-authentication-card>
|
||||
<x-slot name="logo">
|
||||
<x-jet-authentication-card-logo/>
|
||||
</x-slot>
|
||||
|
||||
<div wire:ignore>
|
||||
|
||||
<div class="flex items-center justify-end mb-4">
|
||||
<x-button icon="arrow-left" secondary class="ml-4" href="/">
|
||||
{{ __('Back to the website') }}
|
||||
</x-button>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
||||
<div class="text-center text-2xl text-gray-800 mt-6">
|
||||
Login with lightning ⚡
|
||||
</div>
|
||||
|
||||
<div class="flex justify-center" wire:key="qrcode">
|
||||
<a href="lightning:{{ $this->lnurl }}">
|
||||
<img src="{{ 'data:image/png;base64, '. $this->qrCode }}" alt="qrcode">
|
||||
</a>
|
||||
</div>
|
||||
<div class="my-2 flex justify-center font-mono break-all">
|
||||
<input class="w-full" readonly wire:key="lnurl" onClick="this.select();"
|
||||
value="lightning:{{ $this->lnurl }}"/>
|
||||
</div>
|
||||
<div class="flex justify-between w-full">
|
||||
<div
|
||||
x-data="{
|
||||
textToCopy: 'lightning:{{ $this->lnurl }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('URL copied!') }}',icon:'success'});"
|
||||
>
|
||||
<x-button
|
||||
black
|
||||
>
|
||||
<i class="fa fa-thin fa-clipboard"></i>
|
||||
{{ __('Copy') }}
|
||||
</x-button>
|
||||
</div>
|
||||
<div
|
||||
x-data="{
|
||||
textToCopy: 'lightning:{{ $this->lnurl }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('URL copied!') }}',icon:'success'});"
|
||||
>
|
||||
<x-button
|
||||
primary
|
||||
black
|
||||
:href="'lightning:'.$this->lnurl"
|
||||
>
|
||||
{{ __('Click to connect') }}
|
||||
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512"
|
||||
height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"
|
||||
d="M461.81 53.81a4.4 4.4 0 00-3.3-3.39c-54.38-13.3-180 34.09-248.13 102.17a294.9 294.9 0 00-33.09 39.08c-21-1.9-42-.3-59.88 7.5-50.49 22.2-65.18 80.18-69.28 105.07a9 9 0 009.8 10.4l81.07-8.9a180.29 180.29 0 001.1 18.3 18.15 18.15 0 005.3 11.09l31.39 31.39a18.15 18.15 0 0011.1 5.3 179.91 179.91 0 0018.19 1.1l-8.89 81a9 9 0 0010.39 9.79c24.9-4 83-18.69 105.07-69.17 7.8-17.9 9.4-38.79 7.6-59.69a293.91 293.91 0 0039.19-33.09c68.38-68 115.47-190.86 102.37-247.95zM298.66 213.67a42.7 42.7 0 1160.38 0 42.65 42.65 0 01-60.38 0z"></path>
|
||||
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"
|
||||
d="M109.64 352a45.06 45.06 0 00-26.35 12.84C65.67 382.52 64 448 64 448s65.52-1.67 83.15-19.31A44.73 44.73 0 00160 402.32"></path>
|
||||
</svg>
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(app()->environment('local'))
|
||||
<div class="flex items-center justify-end mt-4">
|
||||
|
||||
<x-button icon="login" secondary class="ml-4" href="{{ route('loginAsAdmin') }}">
|
||||
{{ __('Admin login') }}
|
||||
</x-button>
|
||||
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="pt-12">
|
||||
{{ __('Scan this code or copy & paste it to your lightning wallet. Or click to login with your wallet.') }}
|
||||
</div>
|
||||
<div class="pt-2">
|
||||
<td
|
||||
class="py-1 px-3 text-base leading-6 break-words border border-solid border-collapse border-neutral-600 text-slate-400"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://github.com/getAlby/lightning-browser-extension"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>Alby</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://github.com/alexbosworth/balanceofsatoshis"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>Balance of Satoshis</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://www.walletofsatoshi.com/"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>Wallet of Satoshi</a
|
||||
>,
|
||||
<a
|
||||
target="_blank" href="https://blixtwallet.github.io"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;">Blixt</a>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://breez.technology"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>Breez</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://bluewallet.io"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>BlueWallet</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://coinos.io"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>coinos</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://geyser.fund"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>Geyser</a
|
||||
>, <a
|
||||
target="_blank" href="https://lifpay.me"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;">LifPay</a>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://lnbits.com"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>LNbits</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://ln.tips"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>LightningTipBot</a
|
||||
>, <a
|
||||
target="_blank" href="https://phoenix.acinq.co"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;">Phoenix</a>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://seedauth.etleneum.com/"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>SeedAuth</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://github.com/pseudozach/seedauthextension"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>SeedAuthExtension</a
|
||||
>,
|
||||
<a
|
||||
target="_blank" href="https://lightning-wallet.com"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;">SimpleBitcoinWallet</a>,
|
||||
<a
|
||||
target="_blank" href="https://sparrowwallet.com/"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;">Sparrow Wallet</a>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://www.thunderhub.io"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>ThunderHub</a
|
||||
>,
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://zaphq.io/"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;"
|
||||
>Zap Desktop</a
|
||||
>, <a
|
||||
target="_blank" href="https://zeusln.app"
|
||||
rel="nofollow"
|
||||
class="leading-6 text-blue-400 bg-transparent cursor-pointer"
|
||||
style="text-decoration: none; list-style: outside;">Zeus</a>
|
||||
</td>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div wire:poll="checkAuth" wire:key="checkAuth"></div>
|
||||
</x-jet-authentication-card>
|
||||
@@ -1,52 +0,0 @@
|
||||
<x-jet-authentication-card>
|
||||
|
||||
<x-slot name="logo">
|
||||
<x-jet-authentication-card-logo/>
|
||||
</x-slot>
|
||||
|
||||
<div>
|
||||
<div
|
||||
wire:ignore
|
||||
x-data="{
|
||||
userProfile: @entangle('userProfile'),
|
||||
init() {
|
||||
const nip07signer = new window.NDKNip07Signer();
|
||||
const ndk = new window.NDK({
|
||||
explicitRelayUrls: ['wss://nostr.codingarena.de'],
|
||||
signer: nip07signer
|
||||
});
|
||||
|
||||
ndk.connect();
|
||||
},
|
||||
login() {
|
||||
nip07signer.user().then(async (user) => {
|
||||
if (!!user.npub) {
|
||||
console.log('user pub: ' + user.npub);
|
||||
const ndkUser = ndk.getUser({
|
||||
npub: user.npub,
|
||||
});
|
||||
await ndkUser.fetchProfile();
|
||||
console.log(ndkUser);
|
||||
this.userProfile = ndkUser.profile;
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
|
||||
<div class="space-y-6" x-init="init()">
|
||||
<x-button x-show="!userProfile.npub" primary label="NIP-07 Login" icon="login" @click="login()"/>
|
||||
<p x-text="userProfile.npub"></p>
|
||||
<p x-text="userProfile.about"></p>
|
||||
<img :src="userProfile.image" alt="image"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if($existingAccount)
|
||||
<div class="mt-12 text-red-500 space-y-6">
|
||||
<p>Es existiert ein Account mit dem npub {{ $userProfile['npub'] }}</p>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</x-jet-authentication-card>
|
||||
@@ -1,140 +0,0 @@
|
||||
<x-jet-authentication-card>
|
||||
<x-slot name="logo">
|
||||
<x-jet-authentication-card-logo/>
|
||||
</x-slot>
|
||||
|
||||
<div
|
||||
class="flex justify-center space-x-4"
|
||||
wire:ignore
|
||||
x-data="{
|
||||
userProfile: @entangle('userProfile'),
|
||||
ndk: null,
|
||||
nip07signer: null,
|
||||
init() {
|
||||
this.nip07signer = new window.NDKNip07Signer();
|
||||
this.ndk = new window.NDK({
|
||||
explicitRelayUrls: ['wss://nos.lol', 'wss://eden.nostr.land', 'wss://relay.damus.io', 'wss://nostr.einundzwanzig.space'],
|
||||
signer: this.nip07signer
|
||||
});
|
||||
this.ndk.connect();
|
||||
},
|
||||
login() {
|
||||
this.nip07signer.user().then(async (user) => {
|
||||
if (!!user.npub) {
|
||||
console.log('user pub: ' + user.npub);
|
||||
const ndkUser = this.ndk.getUser({
|
||||
npub: user.npub,
|
||||
});
|
||||
await ndkUser.fetchProfile();
|
||||
console.log(ndkUser);
|
||||
$wire.login(user.npub);
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
|
||||
<x-button lg primary @click="login()">
|
||||
<svg class="svg-inline--fa mr-2" fill="#ffffff" version="1.1" id="nostr" xmlns="http://www.w3.org/2000/svg"
|
||||
height="20px" viewBox="0 0 571.004 571.004"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M533.187,269.019c-1.432-1.746-2.219-3.876-1.252-5.993c1.868-4.08,0.611-7.658-0.931-11.465
|
||||
c-0.877-2.167-0.796-4.716-1.15-7.095c-0.221-1.493-0.057-3.199-0.742-4.435c-1.775-3.199-3.812-6.275-5.949-9.245
|
||||
c-2.681-3.717-5.564-7.291-8.38-10.914c-3.325-4.284-6.581-8.633-10.09-12.766c-0.706-0.833-2.604-1.42-3.607-1.085
|
||||
c-2.411,0.808-4.732,2.052-6.874,3.452c-2.771,1.812-5.435,3.317-8.928,3.713c-3.953,0.453-8.062,1.403-11.604,3.154
|
||||
c-5.189,2.562-9.747,6.401-14.924,9c-4.913,2.464-8.328,6.112-11.184,10.567c-0.783,1.22-1.705,2.371-2.685,3.444
|
||||
c-3.252,3.574-5.549,7.629-7.051,12.248c-1.154,3.554-2.378,7.226-4.373,10.322c-1.963,3.044-3.256,6.194-4.162,9.601
|
||||
c-0.285,1.065-0.44,2.167-0.656,3.251c-2.212-0.539-4.19-0.873-6.06-1.518c-1.709-0.592-3.684-1.15-4.879-2.375
|
||||
c-2.979-3.052-6.528-5.059-10.388-6.577c-3.448-1.354-6.581-3.06-9.441-5.496c-1.514-1.29-3.771-1.738-5.721-2.489
|
||||
c-1.419-0.547-3.043-0.714-4.3-1.501c-3.439-2.146-6.639-4.68-10.11-6.765c-2.256-1.359-4.737-2.542-7.271-3.166
|
||||
c-1.722-0.424-2.293-0.865-2.216-2.599c0.241-5.227-0.832-10.175-3.235-14.872c-2.855-5.582-8.723-8.625-14.777-7.589
|
||||
c-2.697,0.461-5.573,1.347-8.128,0.833c-3.329-0.669-6.516-2-10.028-1.861c-0.612,0.025-1.31-0.437-1.864-0.82
|
||||
c-4.076-2.832-8.152-5.663-12.163-8.584c-1.489-1.085-2.782-1.154-4.442-0.322c-1.221,0.612-2.705,0.955-4.08,0.967
|
||||
c-6.047,0.062-12.098-0.082-18.148-0.077c-5.173,0.004-10.498,1.815-15.377-1.399c-0.241-0.159-0.588-0.216-0.886-0.221
|
||||
c-3.023-0.028-4.488-1.632-5.096-4.524c-0.171-0.82-1.436-1.971-2.236-2c-3.986-0.143-7.984-0.041-11.971,0.139
|
||||
c-2.187,0.102-4.619,0.004-6.483,0.922c-3.941,1.942-7.556,4.533-11.355,6.773c-1.505,0.889-3.023,1.085-3.872-0.763
|
||||
c0.979-1.261,2.337-2.272,2.627-3.525c0.771-3.37-3.705-7.181-6.969-6.059c-1.498,0.514-3.003,1.208-4.272,2.138
|
||||
c-2.464,1.807-4.725,3.896-7.144,5.769c-3.011,2.33-6.055,4.655-10.449,4.737c0.983-3.753-1.718-5.104-4.108-6.597
|
||||
c-1.094-0.686-2.293-1.281-3.525-1.652c-3.276-1-6.348-0.763-8.956,1.828c-2.158,2.142-3.488,2.179-6.014,0.367
|
||||
c-3.081-2.208-3.986-2.175-7.128,0c-1.122,0.775-2.346,1.832-3.586,1.926c-4.268,0.318-6.646,3.052-8.931,6.132
|
||||
c-1.632,2.203-3.244,4.472-5.173,6.405c-4.378,4.39-8.911,8.629-13.48,12.815c-0.608,0.559-1.95,0.873-2.709,0.608
|
||||
c-3.378-1.191-5.582-3.823-6.899-7.001c-2.521-6.075-4.957-12.203-7.07-18.429c-0.816-2.399-1.11-5.165-0.865-7.687
|
||||
c0.559-5.786,1.771-11.51,2.411-17.291c1.196-10.796,3.583-21.343,7.405-31.445c6.773-17.891,13.934-35.643,21.2-53.342
|
||||
c4.619-11.249,7.817-22.852,10.167-34.75c1.644-8.319,2.477-16.63,1.901-25.137c-0.286-4.227,0.232-8.56,0.808-12.787
|
||||
c1.669-12.232-2.46-19.547-13.843-24.068c-1.403-0.559-2.766-1.228-4.149-1.844c-2.15,0-4.3,0-6.455,0
|
||||
c-2.909,0.91-5.871,1.681-8.715,2.762c-3.827,1.457-7.989,2.484-10.51,6.145c-1.701,2.472-4.088,3.5-6.916,4.06
|
||||
c-3.9,0.771-7.797,1.62-11.62,2.705c-3.378,0.959-6.369,2.709-9.135,5.872c6.863,1.652,13.211,3.305,19.617,4.692
|
||||
c7.629,1.652,14.558,4.729,20.518,9.763c2.954,2.493,5.667,5.447,6.165,9.425c0.51,4.084,0.608,8.271,0.392,12.383
|
||||
c-0.563,10.694-4.137,20.661-7.976,30.515c-2.358,6.059-5.406,11.876-7.36,18.054c-4.321,13.656-8.486,27.348-14.19,40.522
|
||||
c-3.309,7.646-6.83,15.251-8.307,23.534c-1.722,9.657-3.264,19.343-4.917,29.013c-0.845,4.958-0.877,10.049-2.864,14.819
|
||||
c-0.873,2.093-1.269,4.406-1.693,6.654c-0.975,5.182-1.832,10.379-2.733,15.573c0,7.838,0,15.675,0,23.513
|
||||
c0.632,3.905,1.363,7.801,1.877,11.722c1.481,11.232,4.773,21.955,8.825,32.489c0.816,2.121,1.322,4.378,1.783,6.613
|
||||
c0.718,3.473,1.069,7.365,4.309,9.303c2.427,1.452,2.982,3.402,3.603,5.671c1.828,6.684,1.318,13.428,0.147,20.086
|
||||
c-1.114,6.341-0.845,12.525,0.861,18.65c2.313,8.318,4.72,16.613,7.291,24.859c0.461,1.48,1.71,2.896,2.946,3.916
|
||||
c5.3,4.382,10.735,8.605,16.108,12.897c0.355,0.281,0.645,0.656,0.914,1.028c2.652,3.672,6.373,5.879,10.677,6.638
|
||||
c8.262,1.457,16.275,4.117,24.664,4.929c1.363,0.131,2.742,0.453,4.035,0.906c2.362,0.828,4.696,1.733,7.038,2.623
|
||||
c1.257,0.824,2.391,1.832,3.415,3.064c-0.698,2.239-1.901,4.234-3.199,6.164c-3.529,5.239-8.344,8.948-14.007,11.633
|
||||
c-5.818,2.754-11.975,4.442-18.242,5.744c-8.115,1.686-16.259,3.231-24.378,4.88c-6.789,1.379-13.248,3.79-19.633,6.414
|
||||
c-8.25,3.39-16.463,6.879-24.77,10.13c-6.447,2.525-13.158,4.149-20.086,4.68c-2.077,0.159-4.178,0.017-6.267,0.065
|
||||
c-0.604,0.017-1.326,0.045-1.783,0.367c-3.46,2.437-7.446,3.407-11.481,4.272c-1.607,0.347-3.203,0.742-4.802,1.117
|
||||
c-4.423,1.049-7.703,3.672-10.237,7.36c-2.481,3.619-3.827,7.691-4.762,11.914c-1.26,5.708-1.685,11.521-1.921,17.344
|
||||
c-0.306,7.405-0.526,14.814-0.828,22.22c-0.082,2.023-0.367,4.035-0.486,6.059c-0.033,0.592,0.012,1.302,0.314,1.779
|
||||
c3.525,5.654,7.299,11.126,12.276,15.643c4.251,3.859,8.993,6.769,14.819,7.557c0.171,0.024,0.326,0.175,0.485,0.265
|
||||
c1.775,0,3.55,0,5.32,0c1.032-0.253,2.085-0.444,3.097-0.767c2.216-0.702,4.415-1.461,6.663-2.212
|
||||
c-0.196-1.881-0.971-3.166-2.317-3.962c-1.236-0.734-2.595-1.301-3.958-1.771c-1.73-0.596-3.55-0.942-5.275-1.554
|
||||
c-1.114-0.396-2.208-0.968-3.174-1.648c-1.367-0.968-1.979-2.424-2.052-4.097c0.069-0.102,0.118-0.257,0.212-0.298
|
||||
c4.643-1.885,7.16-5.879,9.694-9.837c0.298-0.461,0.294-1.195,0.241-1.787c-0.445-4.696-1.775-9.184-3.354-13.599
|
||||
c-1.75-4.884-3.595-9.73-5.333-14.614c-0.551-1.547-0.836-3.183-1.326-4.749c-0.318-1.017,0.11-1.543,0.938-1.971
|
||||
c1.64-0.841,3.423-0.832,5.189-0.886c2.464-0.073,4.945,0.041,7.393-0.188c1.408-0.131,2.925-0.515,4.121-1.236
|
||||
c13.692-8.303,28.474-14.003,43.791-18.413c13.876-3.998,27.997-6.915,42.244-9.229c6.247-1.012,12.501-1.967,18.76-2.897
|
||||
c0.918-0.134,1.665-0.428,2.371-1.027c4.227-3.595,9.217-5.586,14.635-6.259c5.773-0.715,11.608-0.951,17.393-1.563
|
||||
c3.578-0.379,7.161-0.905,10.678-1.656c4.308-0.918,8.045-3.129,11.146-6.205c2.688-2.669,5.132-5.59,7.593-8.482
|
||||
c3.28-3.855,6.414-7.834,9.727-11.661c1.02-1.179,2.432-2.012,3.631-3.039c0.792-0.674,1.501-0.653,2.391-0.11
|
||||
c4.125,2.529,8.576,4.32,13.199,5.712c5.716,1.722,11.566,2.75,17.495,3.374c10.983,1.159,22,1.204,33.023,0.906
|
||||
c3.166-0.086,6.333-0.09,9.503-0.184c0.93-0.029,1.718,0.171,2.473,0.729c3.309,2.444,6.646,4.852,9.963,7.291
|
||||
c3.117,2.293,6.345,4.402,9.927,5.92c0.641,0.273,1.277,0.612,1.95,0.735c2.758,0.497,4.741,2.235,6.744,4.002
|
||||
c5.908,5.214,11.343,10.894,16.161,17.111c6.324,8.156,12.468,16.455,18.617,24.745c6.152,8.295,12.342,16.557,19.396,24.125
|
||||
c6.863,7.36,14.423,13.868,23.122,18.984c0.775,0.457,1.432,0.955,1.844,1.815c3.187,6.655,8.475,11.09,15.076,14.093
|
||||
c6.81,3.097,14.006,4.256,21.444,4.142c10.33-0.159,20.062-2.53,28.906-8.014c5.264-3.264,9.572-7.471,12.347-13.097
|
||||
c1.15-2.338,2.109-4.737,2.269-7.385c0.016-0.29,0.212-0.571,0.326-0.853c0-0.633,0-1.27,0-1.901
|
||||
c-3.488-0.6-6.802,0.208-10.045,1.362c-3.101,1.102-6.124,2.416-9.25,3.443c-2.692,0.886-5.442,1.673-8.225,2.195
|
||||
c-4.554,0.853-8.042-1.113-10.037-5.41c0.804-1.049,1.995-1.195,3.194-1.253c2.338-0.113,4.685-0.143,7.022-0.302
|
||||
c0.799-0.053,1.664-0.249,2.338-0.648c0.6-0.359,1.121-1.024,1.411-1.673c0.498-1.126,0.311-1.44-0.869-2.085
|
||||
c-3.402-1.856-6.993-3.264-10.714-4.324c-8.421-2.399-17.055-3.028-25.757-3.061c-1.836-0.008-3.677-0.004-5.513,0.082
|
||||
c-0.963,0.045-1.66-0.249-2.366-0.906c-4.843-4.5-9.094-9.53-13.166-14.721c-6.613-8.429-12.48-17.389-18.47-26.259
|
||||
c-2.836-4.198-5.786-8.319-8.769-12.411c-0.999-1.375-2.244-2.574-3.419-3.811c-0.384-0.404-0.885-0.727-1.383-0.991
|
||||
c-1.358-0.727-2.269-0.408-2.905,1.003c-0.229,0.511-0.379,1.062-0.648,1.828c-0.633-0.465-1.179-0.841-1.697-1.253
|
||||
c-5.03-4.019-8.866-9.058-11.905-14.655c-2.954-5.446-5.627-11.048-8.344-16.626c-2.607-5.353-5.092-10.767-8.438-15.712
|
||||
c-1.521-2.248-3.317-4.312-4.9-6.523c-0.783-1.094-1.709-1.229-2.949-1.094c-5.324,0.579-10.625,0.494-15.843-0.894
|
||||
c-2.591-0.689-5.035-1.718-7.1-3.488c-1.473-1.269-2.562-2.746-3.211-4.513c1.95-0.433,3.893-0.897,5.818-1.424
|
||||
c6.459-1.767,12.926-2.469,19.552-2.081c7.964,0.466,15.92,1.159,23.892,1.437c2.853,0.098,5.966-0.172,8.557-1.244
|
||||
c3.859-1.596,7.544-3.799,10.971-6.206c5.075-3.566,9.702-7.78,14.847-11.232c2.379-1.595,3.203-3.292,3.306-5.92
|
||||
c0.134-3.509,1.9-4.781,5.3-4.149c0.6,0.114,1.203,0.253,1.787,0.44c3.852,1.229,7.633,1.028,11.489-0.163
|
||||
c2.962-0.914,6.066-1.354,9.053-2.195c0.547-0.154,1.024-1.199,1.163-1.909c0.094-0.481-0.616-1.068-0.693-1.648
|
||||
c-0.127-0.922-0.384-2.402,0.057-2.705c0.854-0.575,2.154-0.656,3.265-0.636c0.881,0.016,1.733,0.62,2.627,0.729
|
||||
c2.064,0.258,3.995,0.021,5.247-1.986c1.232-1.971,1.277-3.864-0.163-5.757c-0.465-0.608-1.069-1.249-1.191-1.946
|
||||
c-0.163-0.938-0.273-2.199,0.212-2.881c1.779-2.488,3.771-4.83,5.77-7.152c1.828-2.121,4.251-3.354,6.997-3.541
|
||||
c0.967-0.065,2.158,0.742,2.966,1.465c0.633,0.562,0.686,1.729,1.261,2.407c0.674,0.795,1.628,1.347,2.465,2.007
|
||||
c0.571-0.877,1.358-1.688,1.656-2.651c0.311-0.992-0.028-2.175,0.236-3.187c0.213-0.812,0.743-1.738,1.416-2.195
|
||||
c3.591-2.439,7.442-4.524,10.861-7.177c2.574-1.991,4.508-4.786,6.944-6.98c4.182-3.771,9.526-5.097,14.789-6.472
|
||||
c3.452-0.901,4.194-1.921,3.134-5.365c-0.514-1.673-1.228-3.309-2.052-4.854c-1.062-1.987-0.531-3.362,1.297-4.402
|
||||
c0.727-0.412,1.498-0.751,2.252-1.114c2.387-1.139,4.08-2.701,4.688-5.521c0.612-2.827,1.75-5.549,2.741-8.286
|
||||
c1.339-3.692,2.432-7.65,7.34-8.144c0.147-0.017,0.294-0.061,0.441-0.094c0-1.077,0-2.15,0-3.228
|
||||
c-1.135-1.775-2.15-3.639-3.432-5.3C536.084,271.981,534.492,270.614,533.187,269.019z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
Nostr NIP-07
|
||||
</x-button>
|
||||
|
||||
<x-button
|
||||
:href="route('auth.ln')"
|
||||
lg primary>
|
||||
<i class="fa-thin fa-bolt-lightning mr-2"></i>
|
||||
LNURL-auth
|
||||
</x-button>
|
||||
|
||||
</div>
|
||||
</x-jet-authentication-card>
|
||||
@@ -1,289 +0,0 @@
|
||||
<div
|
||||
class="relative isolate flex items-center justify-center gap-x-6 overflow-hidden bg-gray-50 px-6 py-2.5 sm:px-3.5 sm:before:flex-1 -mt-4">
|
||||
<div class="absolute left-[max(-7rem,calc(50%-52rem))] top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl"
|
||||
aria-hidden="true">
|
||||
<div class="aspect-[577/310] w-[36.0625rem] bg-gradient-to-r from-[#FABE75] to-[#F7931A] opacity-30"
|
||||
style="clip-path: polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)"></div>
|
||||
</div>
|
||||
<div class="absolute left-[max(45rem,calc(50%+8rem))] top-1/2 -z-10 -translate-y-1/2 transform-gpu blur-2xl"
|
||||
aria-hidden="true">
|
||||
<div class="aspect-[577/310] w-[36.0625rem] bg-gradient-to-r from-[#FABE75] to-[#F7931A] opacity-30"
|
||||
style="clip-path: polygon(74.8% 41.9%, 97.2% 73.2%, 100% 34.9%, 92.5% 0.4%, 87.5% 0%, 75% 28.6%, 58.5% 54.6%, 50.1% 56.8%, 46.9% 44%, 48.3% 17.4%, 24.7% 53.9%, 0% 27.9%, 11.9% 74.2%, 24.9% 54.1%, 68.6% 100%, 74.8% 41.9%)"></div>
|
||||
</div>
|
||||
<div class="w-full flex flex-col sm:flex-row items-center sm:space-x-4 justify-center">
|
||||
<div x-data="{
|
||||
height: null,
|
||||
init() {
|
||||
const that = this;
|
||||
const tip = async () => {
|
||||
const {
|
||||
bitcoin: { blocks },
|
||||
} = mempoolJS();
|
||||
const blocksTipHeight = await blocks.getBlocksTipHeight();
|
||||
that.height = blocksTipHeight;
|
||||
};
|
||||
tip();
|
||||
setInterval(tip, 10000);
|
||||
}
|
||||
}">
|
||||
<span
|
||||
class="inline-flex items-center rounded-md bg-amber-100 px-2.5 py-0.5 text-sm font-medium text-amber-800">
|
||||
<i class="-ml-0.5 mr-1.5 h-2 w-2 text-amber-400"></i>
|
||||
Blockhöhe <span class="font-bold text-2xl ml-4" x-text="height && height.toLocaleString('de-DE')"></span>
|
||||
</span>
|
||||
</div>
|
||||
{{--@if(!empty($weather))
|
||||
<div class="text-md leading-6 text-gray-900 text-center max-w-screen-2xl">
|
||||
{{ $weather }} (um {{ \App\Support\Carbon::parse($changed)->asTime() }} Uhr aktualisiert - jede 4. Stunde)
|
||||
</div>
|
||||
@else
|
||||
<div class="text-md leading-6 text-gray-900 text-center max-w-screen-2xl">
|
||||
Wetterdaten werden in Kürze wieder verfügbar sein. (OpenAI Quota exceeded)
|
||||
</div>
|
||||
@endif--}}
|
||||
<div
|
||||
x-data="{
|
||||
fastestFee: null,
|
||||
halfHourFee: null,
|
||||
hourFee: null,
|
||||
economyFee: null,
|
||||
minimumFee: null,
|
||||
init() {
|
||||
const that = this;
|
||||
const init = async () => {
|
||||
const { bitcoin: { websocket } } = mempoolJS({
|
||||
hostname: 'mempool.space'
|
||||
});
|
||||
const ws = websocket.initClient({
|
||||
options: ['blocks', 'stats', 'mempool-blocks', 'live-2h-chart'],
|
||||
});
|
||||
ws.addEventListener('message', function incoming({data}) {
|
||||
const res = JSON.parse(data.toString());
|
||||
if (res.block) {
|
||||
}
|
||||
if (res.fees) {
|
||||
that.fastestFee = res.fees.fastestFee;
|
||||
that.halfHourFee = res.fees.halfHourFee;
|
||||
that.hourFee = res.fees.hourFee;
|
||||
that.economyFee = res.fees.economyFee;
|
||||
that.minimumFee = res.fees.minimumFee;
|
||||
}
|
||||
});
|
||||
};
|
||||
init();
|
||||
}
|
||||
}"
|
||||
>
|
||||
<template x-if="!minimumFee">
|
||||
<div class="text-amber-500 w-[384px]">
|
||||
<div class="h-3 w-3">
|
||||
<span
|
||||
class="animate-ping inline-flex h-full w-full rounded-full bg-amber-500 opacity-75"></span>
|
||||
</div>
|
||||
Loading fees...
|
||||
</div>
|
||||
</template>
|
||||
<template x-if="minimumFee">
|
||||
<div
|
||||
_ngcontent-serverapp-c131=""
|
||||
class="flex flex-col justify-around p-5 leading-6 text-center text-white break-words"
|
||||
style="min-height: 1px; list-style: outside;"
|
||||
>
|
||||
<app-fees-box
|
||||
_ngcontent-serverapp-c131=""
|
||||
class="block text-center break-words"
|
||||
_nghost-serverapp-c126=""
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="text-white"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="flex break-words"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="flex flex-row mb-3 w-1/4 h-5 bg-lime-700"
|
||||
style="background: rgb(93, 125, 1); --darkreader-inline-bgcolor: #4a6401; --darkreader-inline-bgimage: none; transition: background-color 1s ease 0s; list-style: outside;"
|
||||
data-darkreader-inline-bgcolor=""
|
||||
data-darkreader-inline-bgimage=""
|
||||
>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
ngbtooltip="Either 2x the minimum, or the Low Priority rate (whichever is lower)"
|
||||
placement="top"
|
||||
class="px-1 pt-px w-full text-xs leading-4 truncate"
|
||||
style="list-style: outside;"
|
||||
>No Priority</span>
|
||||
</div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="h-5 bg-white bg-opacity-[0]"
|
||||
style="width: 4%; background-image: repeating-linear-gradient(90deg, rgb(36, 41, 58), rgb(36, 41, 58) 2px, rgb(23, 25, 39) 2px, rgb(23, 25, 39) 4px); list-style: outside;"
|
||||
></div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="flex flex-row mb-3 w-3/4 h-5"
|
||||
style="background: linear-gradient(to right, rgb(93, 125, 1), rgb(166, 125, 14)); --darkreader-inline-bgcolor: rgba(0, 0, 0, 0); --darkreader-inline-bgimage: linear-gradient(to right, #4a6401, #85640b); transition: background-color 1s ease 0s; border-radius: 0px 10px 10px 0px; list-style: outside;"
|
||||
data-darkreader-inline-bgcolor=""
|
||||
data-darkreader-inline-bgimage=""
|
||||
>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
ngbtooltip="Usually places your transaction in between the second and third mempool blocks"
|
||||
placement="top"
|
||||
class="px-1 pt-px w-1/3 text-xs leading-4 truncate"
|
||||
style="list-style: outside;"
|
||||
>Hour</span><span
|
||||
_ngcontent-serverapp-c126=""
|
||||
ngbtooltip="Usually places your transaction in between the first and second mempool blocks"
|
||||
placement="top"
|
||||
class="px-1 pt-px w-1/3 text-xs leading-4 truncate"
|
||||
style="list-style: outside;"
|
||||
>Half Hour</span
|
||||
><span
|
||||
_ngcontent-serverapp-c126=""
|
||||
ngbtooltip="Places your transaction in the first mempool block"
|
||||
placement="top"
|
||||
class="px-1 pt-px w-1/3 text-xs leading-4 truncate"
|
||||
style="list-style: outside;"
|
||||
>Fastest</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="flex flex-row justify-between break-words"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="my-0 mx-auto w-24"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="mb-0 text-xl leading-8"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="m-auto leading-7 border-b border-gray-200 border-solid text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<span x-text="minimumFee"></span>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="inline-flex relative top-0 text-xs leading-4 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>sat/vB</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class=""
|
||||
style="width: 4%; list-style: outside;"
|
||||
></div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="my-0 mx-auto w-24"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="mb-0 text-xl leading-8"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="m-auto leading-7 border-b border-gray-200 border-solid text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<span x-text="hourFee"></span>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="inline-flex relative top-0 text-xs leading-4 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>sat/vB</span>
|
||||
</div>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="block relative top-0 text-xs leading-5 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="my-0 mx-auto w-24"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="mb-0 text-xl leading-8"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="m-auto leading-7 border-b border-gray-200 border-solid text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<span x-text="halfHourFee"></span>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="inline-flex relative top-0 text-xs leading-4 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>sat/vB</span
|
||||
>
|
||||
</div>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="block relative top-0 text-xs leading-5 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="my-0 mx-auto w-24"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="mb-0 text-xl leading-8"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<div
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="m-auto leading-7 border-b border-gray-200 border-solid text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>
|
||||
<span x-text="fastestFee"></span>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="inline-flex relative top-0 text-xs leading-4 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
>sat/vB</span
|
||||
>
|
||||
</div>
|
||||
<span
|
||||
_ngcontent-serverapp-c126=""
|
||||
class="block relative top-0 text-xs leading-5 text-gray-900"
|
||||
style="list-style: outside;"
|
||||
></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</app-fees-box>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,169 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
|
||||
<div class="w-full flex justify-end">
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ route('bitcoinEvent.ics', ['country' => $country]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Calendar Stream Url copied!') }}',description:'{{ __('Paste the calendar stream link into a compatible calendar app.') }}',icon:'success'});"
|
||||
amber>
|
||||
<i class="fa fa-thin fa-calendar-arrow-down mr-2"></i>
|
||||
{{ __('Calendar Stream-Url') }} ({{ $events->count() }})
|
||||
</x-button>
|
||||
</div>
|
||||
|
||||
<div class="flex items-start">
|
||||
<div class="w-full sm:w-1/2">
|
||||
|
||||
@php
|
||||
$locale = \Illuminate\Support\Facades\Cookie::get('lang', 'de');
|
||||
@endphp
|
||||
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ asset('dist/js-year-calendar.min.css') }}"/>
|
||||
<script src="{{ asset('dist/js-year-calendar.min.js') }}"></script>
|
||||
<script src="{{ asset('dist/locales/js-year-calendar.'.$locale.'.js') }}"></script>
|
||||
|
||||
<style>
|
||||
.calendar {
|
||||
max-height: 280px;
|
||||
}
|
||||
.calendar .calendar-header {
|
||||
background-color: #F7931A;
|
||||
color: white;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.calendar table.month th.month-title {
|
||||
color: #F7931A;
|
||||
}
|
||||
|
||||
.calendar table.month th.day-header {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar table.month td.day .day-content {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar .calendar-header table th:hover {
|
||||
background: #222;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div
|
||||
wire:ignore
|
||||
x-data="{
|
||||
calendar: null,
|
||||
init() {
|
||||
let events = {{ Js::from($events) }};
|
||||
events = events.map(function(e){
|
||||
return {id: e.id, startDate: new Date(e.startDate), endDate: new Date(e.endDate), location: e.location, description: e.description}
|
||||
})
|
||||
|
||||
new Calendar(this.$refs.calendar, {
|
||||
style: 'background',
|
||||
language: '{{ $locale }}',
|
||||
startYear: {{ $year }},
|
||||
dataSource: events,
|
||||
yearChanged: function(e) {
|
||||
@this.set('year', e.currentYear);
|
||||
},
|
||||
clickDay: function(e) {
|
||||
if(e.events.length > 0) {
|
||||
var content = '';
|
||||
var ids = [];
|
||||
|
||||
for(var i in e.events) {
|
||||
ids.push(e.events[i].id);
|
||||
content += '<div class=\'event-tooltip-content\'>'
|
||||
+ '<div class=\'event-name\'>' + e.events[i].location + '</div>'
|
||||
+ '<div class=\'event-location\'>' + e.events[i].description + '</div>'
|
||||
+ '</div>';
|
||||
}
|
||||
console.log(content);
|
||||
|
||||
$wire.call('popover', content, ids.join(','));
|
||||
}
|
||||
},
|
||||
});
|
||||
},
|
||||
}"
|
||||
>
|
||||
<div x-ref="calendar"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden sm:inline sm:w-1/2">
|
||||
<div
|
||||
wire:ignore
|
||||
class="w-full flex justify-center"
|
||||
x-data="{
|
||||
init() {
|
||||
let markers = {{ Js::from($markers) }};
|
||||
console.log(markers);
|
||||
|
||||
$('#map').vectorMap({
|
||||
zoomButtons : true,
|
||||
zoomOnScroll: true,
|
||||
map: 'world_mill',
|
||||
height: 300,
|
||||
backgroundColor: 'transparent',
|
||||
markers: markers.map(function(h){ return {name: h.name, latLng: h.coords} }),
|
||||
onMarkerClick: function(event, index) {
|
||||
$wire.call('filterByMarker', markers[index].id)
|
||||
},
|
||||
markerStyle: {
|
||||
initial: {
|
||||
image: '{{ asset('img/btc.png') }}',
|
||||
}
|
||||
},
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#a4a4a4'
|
||||
},
|
||||
hover: {
|
||||
'fill-opacity': 1,
|
||||
cursor: 'default'
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div id="map" style="width: 100%; height: 300px" class="bg-gray-900"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Bitcoin Events') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.bitcoin-event-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_events"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,147 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Bitcoin Event') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
@can('delete', $bitcoinEvent)
|
||||
@if($bitcoinEvent->id)
|
||||
<div x-data>
|
||||
<x-button
|
||||
x-on:click="$wireui.confirmDialog({
|
||||
icon: 'warning',
|
||||
title: '{{ __('Are you sure you want to delete this Bitcoin event?') }}',
|
||||
accept: {label: '{{ __('Yes') }}',
|
||||
execute: () => $wire.deleteMe()},
|
||||
reject: {label: '{{ __('No, cancel') }}'},
|
||||
})"
|
||||
negative>
|
||||
<i class="fa fa-thin fa-trash"></i>
|
||||
{{ __('Delete') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@endif
|
||||
@endcan
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('image')" :label="__('Logo')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($bitcoinEvent->getFirstMediaUrl('logo'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $bitcoinEvent->getFirstMediaUrl('logo') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('venue_id')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Venue') }}
|
||||
</div>
|
||||
<x-button xs href="{{ route('venue.form') }}">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Create venue') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
autocomplete="off"
|
||||
wire:model.debounce="bitcoinEvent.venue_id"
|
||||
:placeholder="__('Venue')"
|
||||
:async-data="[
|
||||
'api' => route('api.venues.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'flag']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
option-description="city.name"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('bitcoinEvent.from')" :label="__('Start')">
|
||||
<x-datetime-picker
|
||||
:clearable="false"
|
||||
time-format="24"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="bitcoinEvent.from"
|
||||
display-format="DD-MM-YYYY HH:mm"
|
||||
:placeholder="__('Start')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('bitcoinEvent.to')" :label="__('To')">
|
||||
<x-datetime-picker
|
||||
:clearable="false"
|
||||
time-format="24"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="bitcoinEvent.to"
|
||||
display-format="DD-MM-YYYY HH:mm"
|
||||
:placeholder="__('To')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('bitcoinEvent.title')" :label="__('Title')">
|
||||
<x-input autocomplete="off" wire:model.debounce="bitcoinEvent.title"
|
||||
:placeholder="__('Title')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('bitcoinEvent.description')" :label="__('Description')">
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="bitcoinEvent.description"/>
|
||||
@error('bitcoinEvent.description') <span
|
||||
class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('bitcoinEvent.link')" :label="__('Link')">
|
||||
<x-input autocomplete="off" wire:model.debounce="bitcoinEvent.link"
|
||||
:placeholder="__('Link')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('bitcoinEvent.show_worldwide')" :label="__('Show worldwide')">
|
||||
<x-toggle lg autocomplete="off" wire:model.debounce="bitcoinEvent.show_worldwide"
|
||||
:placeholder="__('Show worldwide')"/>
|
||||
<p class="text-xs py-2 text-gray-200">{{ __('If checked, the event will be shown everywhere.') }}</p>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('action')" :label="__('Action')">
|
||||
<x-button primary wire:click="submit">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
|
||||
</div>
|
||||
@@ -1,34 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :c="$country->code"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Bookcases') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<livewire:tables.book-case-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_bookcases"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,23 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('City search') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<livewire:tables.city-table :country="$country->code" type="bookCase" :manage="$manage"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,106 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10">
|
||||
|
||||
<div class="flex">
|
||||
<div class="flex items-center space-x-1">
|
||||
<x-button
|
||||
:href="route('bookCases.form', ['bookCase' => $bookCase->id, 'country' => $country])"
|
||||
class="whitespace-nowrap" primary class="text-21gray whitespace-nowrap"
|
||||
>
|
||||
{{ __('💊 Orange Pill Now') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="p-4">
|
||||
<ul role="list"
|
||||
class="mx-auto grid max-w-2xl grid-cols-2 gap-y-16 gap-x-8 text-center sm:grid-cols-3 md:grid-cols-4 lg:mx-0 lg:max-w-none lg:grid-cols-5 xl:grid-cols-6">
|
||||
|
||||
@foreach($bookCase->orangePills as $orangePill)
|
||||
@if($orangePill->user_id === auth()->id())
|
||||
<a href="{{ route('bookCases.form', ['country' => $country, 'bookCase' => $orangePill->bookCase, 'orangePill' => $orangePill]) }}"
|
||||
wire:key="orange_pill_{{ $loop->index }}">
|
||||
<li class="border border-amber-500 rounded">
|
||||
<img class="mx-auto h-24 w-24 object-cover rounded"
|
||||
src="{{ $orangePill->getFirstMediaUrl('images') }}" alt="image">
|
||||
<h3 class="text-base font-semibold leading-7 tracking-tight text-gray-200">{{ $orangePill->user->name }}</h3>
|
||||
<p class="text-sm leading-6 text-gray-300">{{ $orangePill->comment }}</p>
|
||||
</li>
|
||||
</a>
|
||||
@else
|
||||
<li>
|
||||
<img class="mx-auto h-24 w-24 object-cover rounded"
|
||||
src="{{ $orangePill->getFirstMediaUrl('images') }}" alt="">
|
||||
<h3 class="text-base font-semibold leading-7 tracking-tight text-gray-200">{{ $orangePill->user->name }}</h3>
|
||||
<p class="text-sm leading-6 text-gray-300">{{ $orangePill->comment }}</p>
|
||||
<p class="text-sm leading-6 text-gray-300">{{ $orangePill->date->asDateTime() }}</p>
|
||||
</li>
|
||||
@endif
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2">
|
||||
|
||||
<div
|
||||
class="relative flex items-center space-x-3 rounded-lg border border-gray-300 bg-white px-6 py-5 shadow-sm">
|
||||
{{--<div class="flex-shrink-0">
|
||||
<img class="h-10 w-10 rounded-full" src="https://images.unsplash.com/photo-1494790108377-be9c29b29330?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt="">
|
||||
</div>--}}
|
||||
<div class="min-w-0 flex-1">
|
||||
<div class="focus:outline-none space-y-2">
|
||||
<p class="text-sm font-medium text-gray-900">Name</p>
|
||||
<p class="truncate text-sm text-gray-500">{{ $bookCase->title }}</p>
|
||||
<p class="text-sm font-medium text-gray-900">Link</p>
|
||||
<p class="text-sm text-gray-500">
|
||||
<a target="_blank"
|
||||
href="{{ $this->url_to_absolute($bookCase->homepage) }}">{{ $this->url_to_absolute($bookCase->homepage) }}</a>
|
||||
</p>
|
||||
<p class="text-sm font-medium text-gray-900">Adresse</p>
|
||||
<p class="truncate text-sm text-gray-500">{{ $bookCase->address }}</p>
|
||||
<p class="text-sm font-medium text-gray-900">Art</p>
|
||||
<p class="truncate text-sm text-gray-500">{{ $bookCase->type }}</p>
|
||||
<p class="text-sm font-medium text-gray-900">Geöffnet</p>
|
||||
<p class="truncate text-sm text-gray-500">{{ $bookCase->open }}</p>
|
||||
<p class="text-sm font-medium text-gray-900">Kontakt</p>
|
||||
<p class="truncate text-sm text-gray-500">{{ $bookCase->contact }}</p>
|
||||
<p class="text-sm font-medium text-gray-900">Information</p>
|
||||
<p class="truncate text-sm text-gray-500">{{ $bookCase->comment }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="rounded" wire:ignore>
|
||||
@map([
|
||||
'lat' => $bookCase->latitude,
|
||||
'lng' => $bookCase->longitude,
|
||||
'zoom' => 24,
|
||||
'markers' => [
|
||||
[
|
||||
'title' => $bookCase->title,
|
||||
'lat' => $bookCase->latitude,
|
||||
'lng' => $bookCase->longitude,
|
||||
'url' => 'https://gonoware.com',
|
||||
'icon' => asset('img/btc-logo-6219386_1280.png'),
|
||||
'icon_size' => [42, 42],
|
||||
],
|
||||
],
|
||||
])
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="my-4">
|
||||
<livewire:comments :model="$bookCase" newest-first hide-notification-options/>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
|
||||
</div>
|
||||
@@ -1,89 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Book Case') }}: {{ $bookCase->title }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
@if($orangePill->id)
|
||||
<x-button negative wire:click="deleteMe">
|
||||
<i class="fa fa-thin fa-trash"></i>
|
||||
{{ __('Delete') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('image')" :label="__('Main picture')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($orangePill->getFirstMediaUrl('images'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $orangePill->getFirstMediaUrl('images') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
@if($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<x-input.group :for="md5('orangePill.amount')" :label="__('Amount')">
|
||||
<x-input
|
||||
min="1"
|
||||
type="number"
|
||||
wire:model.debounce="orangePill.amount"
|
||||
label="{{ __('Number of books') }}"
|
||||
placeholder="{{ __('Number of books') }}"
|
||||
corner-hint="{{ __('How many bitcoin books have you put in?') }}"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('orangePill.date')" :label="__('Date')">
|
||||
<x-datetime-picker
|
||||
label="{{ __('Date') }}"
|
||||
placeholder="{{ __('Date') }}"
|
||||
wire:model.defer="orangePill.date"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
corner-hint="{{ __('When did you put bitcoin books in?') }}"
|
||||
without-time
|
||||
display-format="DD.MM.YYYY"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('orangePill.comment')" :label="__('Comment')">
|
||||
<x-textarea wire:model.defer="orangePill.comment" label="{{ __('Comment') }}"
|
||||
placeholder="{{ __('Comment') }}"
|
||||
corner-hint="{{ __('For example, what books you put in.') }}"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('orangePill.save')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,80 +0,0 @@
|
||||
<div
|
||||
id="matrix"
|
||||
class="h-screen justify-between relative">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country" bgColor="bg-transparent"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10">
|
||||
|
||||
<livewire:book-case.stats/>
|
||||
|
||||
<h1 class="text-xl font-bold py-4 text-gray-200">
|
||||
{{ __('Orange Pill Heatmap') }}
|
||||
</h1>
|
||||
|
||||
<div
|
||||
x-data="{
|
||||
data: @js($heatmap_data),
|
||||
init() {
|
||||
var testData = {
|
||||
max: 8,
|
||||
data: this.data,
|
||||
};
|
||||
|
||||
var baseLayer = L.tileLayer(
|
||||
'https://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png',{
|
||||
attribution: 'Map tiles by <a href=\'http://stamen.com\'>Stamen Design</a>, <a href=\'http://creativecommons.org/licenses/by/3.0\'>CC BY 3.0</a> — Map data © <a href=\'http://www.openstreetmap.org/copyright\'>OpenStreetMap</a>',
|
||||
maxZoom: 8
|
||||
}
|
||||
);
|
||||
|
||||
var cfg = {
|
||||
'radius': 25,
|
||||
'maxOpacity': .6,
|
||||
// scales the radius based on map zoom
|
||||
'scaleRadius': false,
|
||||
// if set to false the heatmap uses the global maximum for colorization
|
||||
// if activated: uses the data maximum within the current map boundaries
|
||||
// (there will always be a red spot with useLocalExtremas true)
|
||||
'useLocalExtrema': true,
|
||||
// which field name in your data represents the latitude - default 'lat'
|
||||
latField: 'lat',
|
||||
// which field name in your data represents the longitude - default 'lng'
|
||||
lngField: 'lng',
|
||||
// which field name in your data represents the data value - default 'value'
|
||||
valueField: 'count'
|
||||
};
|
||||
|
||||
var heatmapLayer = new HeatmapOverlay(cfg);
|
||||
|
||||
var map = new L.Map($refs.map, {
|
||||
center: new L.LatLng(51.1642,10.4541194),
|
||||
zoom: 6,
|
||||
maxZoom: 8,
|
||||
layers: [baseLayer, heatmapLayer]
|
||||
});
|
||||
|
||||
heatmapLayer.setData(testData);
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div x-ref="map" style="height: 70vh;"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_bookcases"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,174 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
|
||||
<livewire:book-case.stats/>
|
||||
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Highscore Table') }}
|
||||
</h2>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul role="list" class="grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4">
|
||||
@foreach($plebs as $pleb)
|
||||
<li x-data="{show: false}"
|
||||
wire:key="pleb_{{ $pleb->id }}"
|
||||
class="cursor-pointer col-span-1 flex flex-col rounded-lg bg-amber-500 text-center shadow-2xl">
|
||||
<div>
|
||||
<div class="-mt-px flex ">
|
||||
<div class="flex w-0 flex-1">
|
||||
@if($pleb->lightning_address || $pleb->lnurl || $pleb->node_id)
|
||||
<div x-on:click="show = !show"
|
||||
x-transition:enter="transition ease-out duration-300"
|
||||
x-transition:enter-start="opacity-0"
|
||||
x-transition:enter-end="opacity-100"
|
||||
x-transition:leave="transition ease-in duration-300"
|
||||
x-transition:leave-start="opacity-100"
|
||||
x-transition:leave-end="opacity-0 scale-90"
|
||||
class="relative -mr-px inline-flex w-0 flex-1 items-center justify-center rounded-bl-lg border border-transparent py-4 text-xl font-bold text-gray-800 hover:text-gray-900">
|
||||
<i class="fa-thin fa-bolt-lightning"></i>
|
||||
<span class="ml-3" x-text="show ? 'Schließen' : 'Donate'"></span>
|
||||
</div>
|
||||
@else
|
||||
<a href="{{ route('profile.show') }}"
|
||||
class="relative -mr-px inline-flex w-0 flex-1 items-center justify-center rounded-bl-lg border border-transparent py-4 text-xl font-bold text-gray-800 hover:text-gray-900">
|
||||
<i class="fa-thin fa-bolt-slash"></i>
|
||||
<span class="ml-3">{{ __('Missing lightning address') }}</span>
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@php
|
||||
$address = match(true) {
|
||||
$pleb->lightning_address !== '' => $pleb->lightning_address,
|
||||
$pleb->lnurl !== '' => $pleb->lnurl,
|
||||
$pleb->node_id !== '' => $pleb->node_id,
|
||||
default => null,
|
||||
};
|
||||
@endphp
|
||||
<div x-show="show">
|
||||
@if($address)
|
||||
<div wire:ignore>
|
||||
<lightning-widget
|
||||
name="{{ $pleb->name }}"
|
||||
accent="#f7931a"
|
||||
to="{{ $address }}"
|
||||
image="{{ $pleb->profile_photo_url }}"
|
||||
amounts="21,210,2100,21000"
|
||||
/>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-1 flex-col p-8" x-show="!show"
|
||||
wire:click="openModal({{ $pleb->id }})">
|
||||
<img class="mx-auto h-32 w-32 object-cover flex-shrink-0 rounded-full"
|
||||
src="{{ $pleb->profile_photo_url }}" alt="{{ $pleb->name }}">
|
||||
<h3 class="mt-6 text-sm font-medium text-gray-900 truncate">{{ $pleb->name }}</h3>
|
||||
<dl class="mt-1 flex flex-grow flex-col justify-between">
|
||||
<dd class="text-sm text-gray-800">{{ $pleb->orange_pills_count }} {{ __('Bookcases') }} {{ __('Orange pilled') }}</dd>
|
||||
<dd class="mt-3">
|
||||
<span class="rounded-full bg-21gray px-2 py-1 text-xs font-medium text-gray-200">{{ __('Points') }}: {{ $pleb->getPoints() }}</span>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
<script src="https://embed.twentyuno.net/js/app.js"></script>
|
||||
|
||||
</ul>
|
||||
|
||||
<style>
|
||||
.card {
|
||||
border-radius: 0px !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
<x-jet-dialog-modal wire:model="viewingModal" maxWidth="screen" bg="bg-21gray">
|
||||
<x-slot name="title">
|
||||
@if($modal)
|
||||
<div class="text-gray-200">
|
||||
{{ $modal->name }}
|
||||
</div>
|
||||
@endif
|
||||
</x-slot>
|
||||
|
||||
<x-slot name="content">
|
||||
@if($modal)
|
||||
<div class="space-y-4 mt-16 flex flex-col justify-center min-h-[600px]">
|
||||
|
||||
<div class="bg-amber-800 p-4 rounded">
|
||||
<div class="mt-6 flow-root">
|
||||
<ul role="list" class="-my-5 divide-y divide-gray-200">
|
||||
<li class="py-5">
|
||||
<div class="relative focus-within:ring-2 focus-within:ring-indigo-500">
|
||||
<h3 class="text-sm font-semibold text-gray-200">
|
||||
<div class="">
|
||||
<!-- Extend touch target to entire panel -->
|
||||
<span class="absolute inset-0" aria-hidden="true"></span>
|
||||
{{ $modal->name }} {{ __('has') }} {{ $modal->reputations->where('name', 'LoggedIn')->sum('point') }} {{ __('logins') }}
|
||||
</div>
|
||||
</h3>
|
||||
<p class="mt-1 text-sm text-gray-200 line-clamp-2">{{ __('You get a point when you log in.') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul role="list"
|
||||
class="grid grid-cols-2 gap-x-4 gap-y-8 sm:grid-cols-3 sm:gap-x-6 lg:grid-cols-4 xl:gap-x-8">
|
||||
@foreach($modal->orangePills as $orangePill)
|
||||
<li class="relative">
|
||||
<a target="_blank"
|
||||
href="{{ route('bookCases.comment.bookcase', ['country' => $country, 'bookCase' => $orangePill->bookCase]) }}">
|
||||
<div
|
||||
class="group aspect-w-10 aspect-h-10 block w-full overflow-hidden rounded-lg bg-gray-100 focus-within:ring-2 focus-within:ring-indigo-500 focus-within:ring-offset-2 focus-within:ring-offset-gray-100">
|
||||
<img
|
||||
src="{{ $orangePill->getFirstMediaUrl('images') ? $orangePill->getFirstMediaUrl('images', 'preview') : ($orangePill->bookCase->getFirstMediaUrl('images') ? $orangePill->bookCase->getFirstMediaUrl('images', 'preview') : asset('img/empty_book_case.webp')) }}"
|
||||
alt="book_case"
|
||||
class="pointer-events-none object-cover group-hover:opacity-75">
|
||||
</div>
|
||||
<p class="pointer-events-none mt-2 block truncate text-sm font-medium text-gray-200">
|
||||
210 {{ __('points') }}</p>
|
||||
<p class="pointer-events-none block text-sm font-medium text-gray-200">{{ $orangePill->date->asDate() }}</p>
|
||||
<p class="pointer-events-none block text-sm font-medium text-gray-200">{{ $orangePill->bookCase->title }}</p>
|
||||
<p class="pointer-events-none block text-sm font-medium text-gray-200">{{ $orangePill->bookCase->address }}</p>
|
||||
</a>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@endif
|
||||
</x-slot>
|
||||
|
||||
<x-slot name="footer">
|
||||
<x-jet-secondary-button wire:click="resetModal" wire:loading.attr="disabled">
|
||||
@lang('Close')
|
||||
</x-jet-secondary-button>
|
||||
</x-slot>
|
||||
</x-jet-dialog-modal>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_bookcases"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,23 +0,0 @@
|
||||
<div class="bg-gray-900 py-12 sm:py-24">
|
||||
<div class="mx-auto max-w-7xl px-6 lg:px-8">
|
||||
<dl class="grid grid-cols-1 gap-x-8 gap-y-16 text-center lg:grid-cols-2">
|
||||
<div class="mx-auto flex max-w-xs flex-col gap-y-4">
|
||||
<dt class="text-base leading-7 text-gray-400">
|
||||
{{ __('Book cases orange pilled') }}
|
||||
</dt>
|
||||
<dd class="order-first text-3xl font-semibold tracking-tight text-white sm:text-5xl">
|
||||
{{ number_format($orangePills, 0, ',', '.') }}
|
||||
</dd>
|
||||
</div>
|
||||
|
||||
<div class="mx-auto flex max-w-xs flex-col gap-y-4">
|
||||
<dt class="text-base leading-7 text-gray-400">
|
||||
{{ __('Number of plebs') }}
|
||||
</dt>
|
||||
<dd class="order-first text-3xl font-semibold tracking-tight text-white sm:text-5xl">
|
||||
{{ number_format($plebs, 0, ',', '.') }}
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,67 +0,0 @@
|
||||
<div
|
||||
id="matrix"
|
||||
class="h-screen justify-between relative">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country" bgColor="bg-transparent"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10">
|
||||
|
||||
<livewire:book-case.stats/>
|
||||
|
||||
<h1 class="text-xl font-bold py-4 text-gray-200">
|
||||
{{ __('World Map') }}
|
||||
</h1>
|
||||
|
||||
<div
|
||||
x-data="{
|
||||
data: @js($mapData),
|
||||
init() {
|
||||
|
||||
var baseLayer = L.tileLayer(
|
||||
'https://{s}.tile.openstreetmap.de/{z}/{x}/{y}.png',{
|
||||
attribution: '© <a href=\'https://www.openstreetmap.org/copyright\'>OpenStreetMap</a> contributors',
|
||||
}
|
||||
);
|
||||
|
||||
var map = new L.Map($refs.map, {
|
||||
preferCanvas: true,
|
||||
center: new L.LatLng(51.1642,10.4541194),
|
||||
zoom: 6,
|
||||
layers: [baseLayer]
|
||||
});
|
||||
|
||||
this.data.forEach(element => {
|
||||
if(element.op > 0) {
|
||||
const marker = L.circleMarker([element.lat, element.lng], {color: '#f7931a', radius: 8});
|
||||
marker.url = element.url;
|
||||
marker.addTo(map).on('click', e => window.open(e.target.url, '_self'));
|
||||
} else {
|
||||
const marker = L.circleMarker([element.lat, element.lng], {color: '#111827', radius: 8});
|
||||
marker.url = element.url;
|
||||
marker.addTo(map).on('click', e => window.open(e.target.url, '_self'));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div x-ref="map" style="height: 70vh;"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_bookcases"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,129 +0,0 @@
|
||||
<div x-cloak x-data="{ open: @entangle('open') }" x-show="open" class="relative z-50"
|
||||
aria-labelledby="slide-over-title" x-ref="dialog" aria-modal="true">
|
||||
|
||||
<div class="fixed inset-0 overflow-hidden backdrop-blur-sm">
|
||||
<div class="absolute inset-0 overflow-hidden">
|
||||
<div class="pointer-events-none fixed inset-y-0 right-0 flex max-w-full pl-10">
|
||||
|
||||
<div x-show="open" x-transition:enter="transform transition ease-in-out duration-500 sm:duration-700"
|
||||
x-transition:enter-start="translate-x-full" x-transition:enter-end="translate-x-0"
|
||||
x-transition:leave="transform transition ease-in-out duration-500 sm:duration-700"
|
||||
x-transition:leave-start="translate-x-0" x-transition:leave-end="translate-x-full"
|
||||
class="pointer-events-auto w-screen max-w-md"
|
||||
x-description="Slide-over panel, show/hide based on slide-over state."
|
||||
x-trap.noscroll="open"
|
||||
>
|
||||
<div class="flex h-full flex-col overflow-y-scroll bg-white shadow-xl">
|
||||
<div class="bg-amber-700 py-6 px-4 sm:px-6">
|
||||
<div class="flex items-center justify-between">
|
||||
<h2 class="text-lg font-medium text-gray-900" id="slide-over-title">{{ __('PlebChat') }}</h2>
|
||||
<div class="ml-3 flex h-7 items-center">
|
||||
<button type="button"
|
||||
class="rounded-md bg-amber-700 text-amber-200 hover:text-white focus:outline-none focus:ring-2 focus:ring-white"
|
||||
@click="open = false">
|
||||
<span class="sr-only">{{ __('Close panel') }}</span>
|
||||
<svg class="h-6 w-6" x-description="Heroicon name: outline/x-mark"
|
||||
xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
|
||||
stroke-width="1.5" stroke="currentColor" aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M6 18L18 6M6 6l12 12"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-1">
|
||||
<p class="text-sm text-gray-900">
|
||||
{{ __('This chat is limited by 21 messages.') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="relative flex-1">
|
||||
<!-- Replace with your content -->
|
||||
<div class="absolute inset-0">
|
||||
<div class="flex antialiased text-gray-800 h-full">
|
||||
<div class="flex flex-row w-full overflow-x-hidden">
|
||||
<div class="flex flex-col flex-auto">
|
||||
<div
|
||||
class="flex flex-col h-full flex-auto flex-shrink-0 bg-21gray p-4"
|
||||
>
|
||||
<div
|
||||
x-data="{ scroll: () => { $el.scrollTo(0, $el.scrollHeight); }}"
|
||||
@chat-updated.window="scroll()"
|
||||
x-intersect="scroll()"
|
||||
class="flex flex-col overflow-x-auto mb-4">
|
||||
<div class="flex flex-col">
|
||||
<div class="grid grid-cols-12 gap-y-2">
|
||||
|
||||
@php
|
||||
$myMessageClass = 'col-start-1 col-end-8 p-3 rounded-lg';
|
||||
$otherMessageClass = 'col-start-6 col-end-13 p-3 rounded-lg';
|
||||
@endphp
|
||||
|
||||
@foreach($messages as $message)
|
||||
<div class="{{ auth()->id() === $message['fromId'] ? $myMessageClass : $otherMessageClass }}">
|
||||
<div class="flex flex-row items-center">
|
||||
<div
|
||||
class="flex items-center justify-center h-10 w-10 rounded-full flex-shrink-0"
|
||||
>
|
||||
<img class="object-cover rounded" src="{{ $message['userImg'] }}" alt="{{ $message['fromName'] }}">
|
||||
</div>
|
||||
<div
|
||||
class="relative ml-3 text-sm bg-white py-2 px-4 shadow rounded-xl"
|
||||
>
|
||||
<div>
|
||||
<p>
|
||||
{{ $message['message'] }}
|
||||
</p>
|
||||
<p class="text-xs text-gray-400 italic">
|
||||
{{ $message['time'] }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="flex flex-row items-center h-16 rounded-xl bg-white w-full px-4"
|
||||
>
|
||||
<div class="flex-grow ml-4">
|
||||
<form wire:submit.prevent="sendMessage">
|
||||
<div class="relative w-full">
|
||||
<input
|
||||
wire:model.defer="myNewMessage"
|
||||
type="text"
|
||||
class="flex w-full border rounded-xl focus:outline-none focus:border-amber-300 pl-4 h-10"
|
||||
/>
|
||||
@error('myNewMessage')<p
|
||||
class="text-red-500 text-xs">{{ $message }}</p>@enderror
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="ml-4">
|
||||
<button
|
||||
wire:click="sendMessage"
|
||||
class="flex items-center justify-center bg-amber-500 hover:bg-amber-600 rounded-xl text-white px-4 py-1 flex-shrink-0"
|
||||
>
|
||||
<span>{{ __('Send') }}</span>
|
||||
<span class="ml-2">
|
||||
<i class="fa-thin fa-envelope w-4 h-4 transform rotate-45 -mt-px"></i>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- /End replace -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,70 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('City') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('city.country_id')" :label="__('Country')">
|
||||
<x-select
|
||||
:clearable="false"
|
||||
wire:model="city.country_id"
|
||||
:searchable="true"
|
||||
:async-data="[
|
||||
'api' => route('api.countries.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'flag']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('city.name')" :label="__('Name')">
|
||||
<x-input autocomplete="off" wire:model.debounce="city.name"
|
||||
:placeholder="__('Name')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('city.latitude')" :label="__('Latitude')">
|
||||
<x-input autocomplete="off" wire:model.debounce="city.latitude"
|
||||
:placeholder="__('Latitude')"/>
|
||||
<div class="text-amber-500 text-xs py-2"><a target="_blank" href="https://www.latlong.net/">https://www.latlong.net/</a>
|
||||
</div>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('city.longitude')" :label="__('Longitude')">
|
||||
<x-input autocomplete="off" wire:model.debounce="city.longitude"
|
||||
:placeholder="__('Longitude')"/>
|
||||
<div class="text-amber-500 text-xs py-2"><a target="_blank" href="https://www.latlong.net/">https://www.latlong.net/</a>
|
||||
</div>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.link')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,105 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Lecturer/Content Creator') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for=" md5('image')" :label="__('Avatar/Picture')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($lecturer->getFirstMediaUrl('avatar'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $lecturer->getFirstMediaUrl('avatar') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.name')" :label="__('Name')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.name"
|
||||
:placeholder="__('Name')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.subtitle')" :label="__('Subtitle')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.subtitle"
|
||||
:placeholder="__('Subtitle')" :hint="__('This is the subtitle on the landing page.')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.intro')" :label="__('Intro')">
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="lecturer.intro"/>
|
||||
@error('lecturer.intro') <span class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
<span
|
||||
class="text-gray-400 text-xs py-2">{{ __('This is the introduction text that is shown on the landing page.') }}</span>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.nostr')" :label="__('Nostr public key')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.nostr"
|
||||
:placeholder="__('Nostr public key')" :hint="__('starts with npub...')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.twitter_username')" :label="__('Twitter Username')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.twitter_username"
|
||||
:placeholder="__('Twitter Username')" :hint="__('Without @')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.website')" :label="__('Website')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.website"
|
||||
:placeholder="__('Website')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.paynym')" :label="__('PayNym')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.paynym"
|
||||
:placeholder="__('PayNym')" :hint="__('starts with PM...')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.lightning_address')" :label="__('Lightning Address')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.lightning_address"
|
||||
:placeholder="__('Lightning Address')" :hint="__('for example xy@getalby.com')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.lnurl')" :label="__('LNURL')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.lnurl"
|
||||
:placeholder="__('LNURL')" :hint="__('starts with: lnurl1dp68gurn8gh....')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer.node_id')" :label="__('Node Id')">
|
||||
<x-input autocomplete="off" wire:model.debounce="lecturer.node_id"
|
||||
:placeholder="__('Node Id')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.link')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
|
||||
</div>
|
||||
@@ -1,57 +0,0 @@
|
||||
<div class="py-6 bg-gray-900 w-full">
|
||||
<div class="px-10 mx-auto max-w-7xl">
|
||||
<div class="flex flex-col items-center md:flex-row md:justify-between">
|
||||
<a href="/">
|
||||
<img src="{{ asset('img/einundzwanzig-horizontal-inverted.svg') }}"
|
||||
class="text-white fill-current" alt="">
|
||||
</a>
|
||||
|
||||
<div class="flex flex-row justify-center mb-4 -ml-4 -mr-4">
|
||||
<a
|
||||
target="_blank"
|
||||
href="https://einundzwanzig.space/kontakt/"
|
||||
class="p-4 text-gray-700 hover:text-gray-400">
|
||||
Kontakt
|
||||
</a>
|
||||
<a
|
||||
target="_blank" href="https://einundzwanzig.space/datenschutz/"
|
||||
class="p-4 text-gray-700 hover:text-gray-400">
|
||||
Datenschutz
|
||||
</a>
|
||||
<a href="#" class="p-4 text-gray-700 hover:text-gray-400">
|
||||
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-6 sm:space-y-0 justify-between text-center md:flex-row">
|
||||
<p class="order-last text-sm leading-tight text-gray-500 md:order-first">
|
||||
{{ __('Built with ❤️ by our team.') }}
|
||||
</p>
|
||||
<ul class="flex flex-col space-y-2 sm:space-y-0 sm:flex-row justify-center pb-3 -ml-4 -mr-4 text-sm">
|
||||
<li>
|
||||
<a href="https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal" target="_blank"
|
||||
class="px-4 text-gray-500 hover:text-white">
|
||||
<i class="fa fab fa-github mr-1"></i>
|
||||
{{ __('Github') }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="https://github.com/Einundzwanzig-Podcast/einundzwanzig-portal/discussions" target="_blank"
|
||||
class="px-4 text-gray-500 hover:text-white">
|
||||
<i class="fa fa-thin fa-thought-bubble mr-1"></i>
|
||||
{{ __('Wish List/Feedback') }}
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/languages/{{ $language->language }}/translations" target="_blank"
|
||||
class="px-4 text-gray-500 hover:text-white">
|
||||
<i class="fa fa-thin fa-language mr-1"></i>
|
||||
{{ __('Translate (:lang :percent%)', ['lang' => $language->name ? $language->name : $language->language, 'percent' => $percentTranslated]) }}
|
||||
</a>
|
||||
</li>
|
||||
{{-- <li><a href="#_" class="px-4 text-gray-500 hover:text-white">FAQ's</a></li>--}}
|
||||
{{-- <li><a href="#_" class="px-4 text-gray-500 hover:text-white">Terms</a></li>--}}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,112 +0,0 @@
|
||||
<header x-data="{ open: false }" @keydown.window.escape="open = false" class="relative isolate z-10 bg-white mb-4">
|
||||
<nav class="mx-auto flex items-center justify-between p-6 lg:px-8" aria-label="Global">
|
||||
<div class="flex lg:flex-1">
|
||||
<a href="/" class="-m-1.5 p-1.5">
|
||||
<span class="sr-only">Einundzwanzig Portal</span>
|
||||
<img class="h-2 sm:h-4 w-auto" src="{{ asset('img/einundzwanzig-horizontal.svg') }}" alt="Logo">
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex lg:hidden">
|
||||
<button type="button" class="-m-2.5 inline-flex items-center justify-center rounded-md p-2.5 text-gray-700"
|
||||
@click="open = true">
|
||||
<span class="sr-only">Open main menu</span>
|
||||
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
|
||||
aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round"
|
||||
d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="hidden lg:flex lg:gap-x-8" x-data="Components.popoverGroup()" x-init="init()">
|
||||
|
||||
@include('livewire.frontend.navigation.news')
|
||||
|
||||
@include('livewire.frontend.navigation.meetups')
|
||||
|
||||
@include('livewire.frontend.navigation.courses')
|
||||
|
||||
@include('livewire.frontend.navigation.library')
|
||||
|
||||
@include('livewire.frontend.navigation.events')
|
||||
|
||||
@include('livewire.frontend.navigation.bookcases')
|
||||
|
||||
@include('livewire.frontend.navigation.association')
|
||||
|
||||
@auth
|
||||
@include('livewire.frontend.navigation.profile')
|
||||
@endauth
|
||||
|
||||
@include('livewire.frontend.navigation.settings')
|
||||
|
||||
</div>
|
||||
<div class="hidden lg:flex lg:flex-1 lg:justify-end">
|
||||
@if(!auth()->check())
|
||||
<a href="{{ route('auth.login') }}" class="text-sm font-semibold leading-6 text-gray-900">Log in <span
|
||||
aria-hidden="true">→</span></a>
|
||||
@else
|
||||
<form method="POST" action="{{ route('logout') }}" class="inline">
|
||||
@csrf
|
||||
<button secondary type="submit"
|
||||
class="-mx-3 block rounded-lg py-2.5 px-3 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50">
|
||||
<i class="fa-thin fa-sign-out"></i>
|
||||
{{ __('Logout') }}
|
||||
</button>
|
||||
</form>
|
||||
@endif
|
||||
</div>
|
||||
</nav>
|
||||
<div x-description="Mobile menu, show/hide based on menu open state." class="lg:hidden" x-ref="dialog" x-show="open"
|
||||
aria-modal="true" style="display: none;" x-cloak>
|
||||
<div x-description="Background backdrop, show/hide based on slide-over state." class="fixed inset-0 z-10"></div>
|
||||
<div
|
||||
class="fixed inset-y-0 right-0 z-10 w-full overflow-y-auto bg-white px-6 py-6 sm:max-w-sm sm:ring-1 sm:ring-gray-900/10"
|
||||
@click.away="open = false">
|
||||
<div class="flex items-center justify-between">
|
||||
<a href="#" class="-m-1.5 p-1.5">
|
||||
<span class="sr-only">Einundzwanzig Portal</span>
|
||||
<img class="h-2 sm:h-4 w-auto" src="{{ asset('img/einundzwanzig-horizontal.svg') }}" alt="Logo">
|
||||
</a>
|
||||
<button type="button" class="-m-2.5 rounded-md p-2.5 text-gray-700" @click="open = false">
|
||||
<span class="sr-only">Close menu</span>
|
||||
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"
|
||||
aria-hidden="true">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-6 divide-y divide-gray-500/10">
|
||||
<div class="space-y-2 py-6">
|
||||
|
||||
@include('livewire.frontend.navigation_mobile.news')
|
||||
@include('livewire.frontend.navigation_mobile.meetups')
|
||||
@include('livewire.frontend.navigation_mobile.events')
|
||||
@include('livewire.frontend.navigation_mobile.courses')
|
||||
@include('livewire.frontend.navigation_mobile.library')
|
||||
@include('livewire.frontend.navigation_mobile.bookcases')
|
||||
@include('livewire.frontend.navigation_mobile.association')
|
||||
@include('livewire.frontend.navigation_mobile.profile')
|
||||
|
||||
</div>
|
||||
<div class="py-6">
|
||||
@if(!auth()->check())
|
||||
<a href="{{ route('auth.login') }}"
|
||||
class="-mx-3 block rounded-lg py-2.5 px-3 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50">
|
||||
Log in</a>
|
||||
@else
|
||||
<form method="POST" action="{{ route('logout') }}" class="inline">
|
||||
@csrf
|
||||
<button secondary type="submit"
|
||||
class="-mx-3 block rounded-lg py-2.5 px-3 text-base font-semibold leading-7 text-gray-900 hover:bg-gray-50">
|
||||
<i class="fa-thin fa-sign-out"></i>
|
||||
{{ __('Logout') }}
|
||||
</button>
|
||||
</form>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
@@ -1,92 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Association') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Association') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('project.table.projectFunding', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-rectangle-history flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Submitted projects') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('project.projectProposal.form', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Submit project for funding') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
@foreach($projectProposals as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->getFirstMediaUrl('main') }}"
|
||||
alt="">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<div class="font-bold">{{ __('This project requires') }} </div><div
|
||||
class="font-bold text-amber-500">{{ number_format($item->support_in_sats, 0, ',', '.') }} {{ __('sats') }}</div>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="{{ route('voting.projectFunding', ['projectProposal' => $item]) }}">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->name }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600 truncate">
|
||||
{{ __('Yes') }}: {{ $item->votes->where('value', 1)->count() }} / {{ __('No') }}: {{ $item->votes->where('value', 0)->count() }}
|
||||
</p>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600 truncate">
|
||||
{{ __('From') }}: {{ $item->user->name }}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,120 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Bookcases') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">Bücherschränke</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('bookCases.table.city', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-city flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('City search') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bookCases.table.bookcases', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-book flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Bookcases') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bookCases.world', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-map flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('World map') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bookCases.heatmap', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-heat flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Heatmap') }}
|
||||
</a>
|
||||
|
||||
@auth
|
||||
<a href="{{ route('bookCases.highScoreTable', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-star flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Highscore Table') }}
|
||||
</a>
|
||||
@endauth
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="https://openbookcase.de/" target="_blank"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Submit new book case') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
@foreach($orangePills as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->getFirstMediaUrl('images') }}"
|
||||
alt="{{ $item->bookCase->title }}">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->date->asDateTime() }}
|
||||
</time>
|
||||
<div
|
||||
class="relative z-10 rounded-full bg-gray-50 py-1.5 px-3 text-xs font-medium text-gray-600 hover:bg-gray-100">
|
||||
{{ $item->user->name }}
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="{{ route('bookCases.comment.bookcase', ['country' => $country, 'bookCase' => $item->bookCase]) }}">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->bookCase->title }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600">
|
||||
{{ $item->bookCase->address }}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,152 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Courses') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">Kurse</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('school.table.city', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-city flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Cities') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-chalkboard-user flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Lecturers') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.venue', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-building flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Venues') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.course', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-screen-users flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Courses') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.event', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-calendar flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Course Events') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('contentCreator.form') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Register lecturer') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('venue.form') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Create venue') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('course.form.course') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Register course') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('course.form.courseEvent') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Register course date') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage lecturers') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bookCases.table.city', ['country' => $country, 'manage' => true]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage cities/areas') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.venue', ['country' => $country, 'manage' => true]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage venues') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
@foreach($courseEvents as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->course->lecturer->getFirstMediaUrl('avatar') }}"
|
||||
alt="{{ $item->course->lecturer->name }}">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->from->asDateTime() }}
|
||||
</time>
|
||||
<div
|
||||
class="relative z-10 rounded-full bg-gray-50 py-1.5 px-3 text-xs font-medium text-gray-600 hover:bg-gray-100">{{ $item->course->lecturer->name }}</div>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="#">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->course->name }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600 truncate">
|
||||
{{ $item->course->description }}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,108 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Bitcoin Events') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Bitcoin Events') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('bitcoinEvent.table.bitcoinEvent', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-calendar-lines-pen flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Events') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('venue.form') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Create venue') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bitcoinEvent.form') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Register event') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bookCases.table.city', ['country' => $country, 'manage' => true]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage cities/areas') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.venue', ['country' => $country, 'manage' => true]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage venues') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
@foreach($bitcoinEvents as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->getFirstMediaUrl('logo') }}"
|
||||
alt="{{ $item->title }}">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->from->asDateTime('d.m.Y') }}
|
||||
</time>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="{{ $item->link }}" target="_blank">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->title }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600 truncate">
|
||||
{{ $item->venue->name}}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,141 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Library') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Library') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-search flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Search') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $country, 'currentTab' => 'Tutorials']) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-graduation-cap flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Tutorials') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $country, 'currentTab' => 'Videos']) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-video flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Videos') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $country, 'currentTab' => 'Bücher']) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-book flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Bücher') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('buecherverleih') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-book-arrow-right flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Bücherverleih') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('library.table.podcastsEpisodes', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-podcast flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Podcast Episodes') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bindles', ['country' => null]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-image flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Bindles') }}
|
||||
</a>
|
||||
|
||||
@auth
|
||||
<a href="{{ route('library.table.lecturer', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-school flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Library for lecturers') }}
|
||||
</a>
|
||||
@endauth
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('library.libraryItem.form', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400"></i>
|
||||
{{ __('Submit contents') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400"></i>
|
||||
{{ __('Manage content creators') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
@foreach($libraryItems as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->getFirstMediaUrl('main') }}"
|
||||
alt="">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<div
|
||||
class="relative z-10 rounded-full bg-gray-50 py-1.5 px-3 text-xs font-medium text-gray-600 hover:bg-gray-100">
|
||||
{{ $item->lecturer->name }}
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="{{ route('libraryItem.view', ['libraryItem' => $item]) }}">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->name }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600 truncate">
|
||||
{{ $item->excerpt }}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,219 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Meetups') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">Meetups</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('meetup.world', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-globe flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('World map') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('meetup.table.meetup', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-people-group flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Meetups') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('meetup.table.meetupEvent', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-calendar flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Meetup dates') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('nostr.plebs') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<svg class="svg-inline--fa flex-none text-gray-400 w-6 h-5 mr-2 -ml-1" fill="#000000" version="1.1" id="nostr" xmlns="http://www.w3.org/2000/svg"
|
||||
height="20px" viewBox="0 0 571.004 571.004"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path d="M533.187,269.019c-1.432-1.746-2.219-3.876-1.252-5.993c1.868-4.08,0.611-7.658-0.931-11.465
|
||||
c-0.877-2.167-0.796-4.716-1.15-7.095c-0.221-1.493-0.057-3.199-0.742-4.435c-1.775-3.199-3.812-6.275-5.949-9.245
|
||||
c-2.681-3.717-5.564-7.291-8.38-10.914c-3.325-4.284-6.581-8.633-10.09-12.766c-0.706-0.833-2.604-1.42-3.607-1.085
|
||||
c-2.411,0.808-4.732,2.052-6.874,3.452c-2.771,1.812-5.435,3.317-8.928,3.713c-3.953,0.453-8.062,1.403-11.604,3.154
|
||||
c-5.189,2.562-9.747,6.401-14.924,9c-4.913,2.464-8.328,6.112-11.184,10.567c-0.783,1.22-1.705,2.371-2.685,3.444
|
||||
c-3.252,3.574-5.549,7.629-7.051,12.248c-1.154,3.554-2.378,7.226-4.373,10.322c-1.963,3.044-3.256,6.194-4.162,9.601
|
||||
c-0.285,1.065-0.44,2.167-0.656,3.251c-2.212-0.539-4.19-0.873-6.06-1.518c-1.709-0.592-3.684-1.15-4.879-2.375
|
||||
c-2.979-3.052-6.528-5.059-10.388-6.577c-3.448-1.354-6.581-3.06-9.441-5.496c-1.514-1.29-3.771-1.738-5.721-2.489
|
||||
c-1.419-0.547-3.043-0.714-4.3-1.501c-3.439-2.146-6.639-4.68-10.11-6.765c-2.256-1.359-4.737-2.542-7.271-3.166
|
||||
c-1.722-0.424-2.293-0.865-2.216-2.599c0.241-5.227-0.832-10.175-3.235-14.872c-2.855-5.582-8.723-8.625-14.777-7.589
|
||||
c-2.697,0.461-5.573,1.347-8.128,0.833c-3.329-0.669-6.516-2-10.028-1.861c-0.612,0.025-1.31-0.437-1.864-0.82
|
||||
c-4.076-2.832-8.152-5.663-12.163-8.584c-1.489-1.085-2.782-1.154-4.442-0.322c-1.221,0.612-2.705,0.955-4.08,0.967
|
||||
c-6.047,0.062-12.098-0.082-18.148-0.077c-5.173,0.004-10.498,1.815-15.377-1.399c-0.241-0.159-0.588-0.216-0.886-0.221
|
||||
c-3.023-0.028-4.488-1.632-5.096-4.524c-0.171-0.82-1.436-1.971-2.236-2c-3.986-0.143-7.984-0.041-11.971,0.139
|
||||
c-2.187,0.102-4.619,0.004-6.483,0.922c-3.941,1.942-7.556,4.533-11.355,6.773c-1.505,0.889-3.023,1.085-3.872-0.763
|
||||
c0.979-1.261,2.337-2.272,2.627-3.525c0.771-3.37-3.705-7.181-6.969-6.059c-1.498,0.514-3.003,1.208-4.272,2.138
|
||||
c-2.464,1.807-4.725,3.896-7.144,5.769c-3.011,2.33-6.055,4.655-10.449,4.737c0.983-3.753-1.718-5.104-4.108-6.597
|
||||
c-1.094-0.686-2.293-1.281-3.525-1.652c-3.276-1-6.348-0.763-8.956,1.828c-2.158,2.142-3.488,2.179-6.014,0.367
|
||||
c-3.081-2.208-3.986-2.175-7.128,0c-1.122,0.775-2.346,1.832-3.586,1.926c-4.268,0.318-6.646,3.052-8.931,6.132
|
||||
c-1.632,2.203-3.244,4.472-5.173,6.405c-4.378,4.39-8.911,8.629-13.48,12.815c-0.608,0.559-1.95,0.873-2.709,0.608
|
||||
c-3.378-1.191-5.582-3.823-6.899-7.001c-2.521-6.075-4.957-12.203-7.07-18.429c-0.816-2.399-1.11-5.165-0.865-7.687
|
||||
c0.559-5.786,1.771-11.51,2.411-17.291c1.196-10.796,3.583-21.343,7.405-31.445c6.773-17.891,13.934-35.643,21.2-53.342
|
||||
c4.619-11.249,7.817-22.852,10.167-34.75c1.644-8.319,2.477-16.63,1.901-25.137c-0.286-4.227,0.232-8.56,0.808-12.787
|
||||
c1.669-12.232-2.46-19.547-13.843-24.068c-1.403-0.559-2.766-1.228-4.149-1.844c-2.15,0-4.3,0-6.455,0
|
||||
c-2.909,0.91-5.871,1.681-8.715,2.762c-3.827,1.457-7.989,2.484-10.51,6.145c-1.701,2.472-4.088,3.5-6.916,4.06
|
||||
c-3.9,0.771-7.797,1.62-11.62,2.705c-3.378,0.959-6.369,2.709-9.135,5.872c6.863,1.652,13.211,3.305,19.617,4.692
|
||||
c7.629,1.652,14.558,4.729,20.518,9.763c2.954,2.493,5.667,5.447,6.165,9.425c0.51,4.084,0.608,8.271,0.392,12.383
|
||||
c-0.563,10.694-4.137,20.661-7.976,30.515c-2.358,6.059-5.406,11.876-7.36,18.054c-4.321,13.656-8.486,27.348-14.19,40.522
|
||||
c-3.309,7.646-6.83,15.251-8.307,23.534c-1.722,9.657-3.264,19.343-4.917,29.013c-0.845,4.958-0.877,10.049-2.864,14.819
|
||||
c-0.873,2.093-1.269,4.406-1.693,6.654c-0.975,5.182-1.832,10.379-2.733,15.573c0,7.838,0,15.675,0,23.513
|
||||
c0.632,3.905,1.363,7.801,1.877,11.722c1.481,11.232,4.773,21.955,8.825,32.489c0.816,2.121,1.322,4.378,1.783,6.613
|
||||
c0.718,3.473,1.069,7.365,4.309,9.303c2.427,1.452,2.982,3.402,3.603,5.671c1.828,6.684,1.318,13.428,0.147,20.086
|
||||
c-1.114,6.341-0.845,12.525,0.861,18.65c2.313,8.318,4.72,16.613,7.291,24.859c0.461,1.48,1.71,2.896,2.946,3.916
|
||||
c5.3,4.382,10.735,8.605,16.108,12.897c0.355,0.281,0.645,0.656,0.914,1.028c2.652,3.672,6.373,5.879,10.677,6.638
|
||||
c8.262,1.457,16.275,4.117,24.664,4.929c1.363,0.131,2.742,0.453,4.035,0.906c2.362,0.828,4.696,1.733,7.038,2.623
|
||||
c1.257,0.824,2.391,1.832,3.415,3.064c-0.698,2.239-1.901,4.234-3.199,6.164c-3.529,5.239-8.344,8.948-14.007,11.633
|
||||
c-5.818,2.754-11.975,4.442-18.242,5.744c-8.115,1.686-16.259,3.231-24.378,4.88c-6.789,1.379-13.248,3.79-19.633,6.414
|
||||
c-8.25,3.39-16.463,6.879-24.77,10.13c-6.447,2.525-13.158,4.149-20.086,4.68c-2.077,0.159-4.178,0.017-6.267,0.065
|
||||
c-0.604,0.017-1.326,0.045-1.783,0.367c-3.46,2.437-7.446,3.407-11.481,4.272c-1.607,0.347-3.203,0.742-4.802,1.117
|
||||
c-4.423,1.049-7.703,3.672-10.237,7.36c-2.481,3.619-3.827,7.691-4.762,11.914c-1.26,5.708-1.685,11.521-1.921,17.344
|
||||
c-0.306,7.405-0.526,14.814-0.828,22.22c-0.082,2.023-0.367,4.035-0.486,6.059c-0.033,0.592,0.012,1.302,0.314,1.779
|
||||
c3.525,5.654,7.299,11.126,12.276,15.643c4.251,3.859,8.993,6.769,14.819,7.557c0.171,0.024,0.326,0.175,0.485,0.265
|
||||
c1.775,0,3.55,0,5.32,0c1.032-0.253,2.085-0.444,3.097-0.767c2.216-0.702,4.415-1.461,6.663-2.212
|
||||
c-0.196-1.881-0.971-3.166-2.317-3.962c-1.236-0.734-2.595-1.301-3.958-1.771c-1.73-0.596-3.55-0.942-5.275-1.554
|
||||
c-1.114-0.396-2.208-0.968-3.174-1.648c-1.367-0.968-1.979-2.424-2.052-4.097c0.069-0.102,0.118-0.257,0.212-0.298
|
||||
c4.643-1.885,7.16-5.879,9.694-9.837c0.298-0.461,0.294-1.195,0.241-1.787c-0.445-4.696-1.775-9.184-3.354-13.599
|
||||
c-1.75-4.884-3.595-9.73-5.333-14.614c-0.551-1.547-0.836-3.183-1.326-4.749c-0.318-1.017,0.11-1.543,0.938-1.971
|
||||
c1.64-0.841,3.423-0.832,5.189-0.886c2.464-0.073,4.945,0.041,7.393-0.188c1.408-0.131,2.925-0.515,4.121-1.236
|
||||
c13.692-8.303,28.474-14.003,43.791-18.413c13.876-3.998,27.997-6.915,42.244-9.229c6.247-1.012,12.501-1.967,18.76-2.897
|
||||
c0.918-0.134,1.665-0.428,2.371-1.027c4.227-3.595,9.217-5.586,14.635-6.259c5.773-0.715,11.608-0.951,17.393-1.563
|
||||
c3.578-0.379,7.161-0.905,10.678-1.656c4.308-0.918,8.045-3.129,11.146-6.205c2.688-2.669,5.132-5.59,7.593-8.482
|
||||
c3.28-3.855,6.414-7.834,9.727-11.661c1.02-1.179,2.432-2.012,3.631-3.039c0.792-0.674,1.501-0.653,2.391-0.11
|
||||
c4.125,2.529,8.576,4.32,13.199,5.712c5.716,1.722,11.566,2.75,17.495,3.374c10.983,1.159,22,1.204,33.023,0.906
|
||||
c3.166-0.086,6.333-0.09,9.503-0.184c0.93-0.029,1.718,0.171,2.473,0.729c3.309,2.444,6.646,4.852,9.963,7.291
|
||||
c3.117,2.293,6.345,4.402,9.927,5.92c0.641,0.273,1.277,0.612,1.95,0.735c2.758,0.497,4.741,2.235,6.744,4.002
|
||||
c5.908,5.214,11.343,10.894,16.161,17.111c6.324,8.156,12.468,16.455,18.617,24.745c6.152,8.295,12.342,16.557,19.396,24.125
|
||||
c6.863,7.36,14.423,13.868,23.122,18.984c0.775,0.457,1.432,0.955,1.844,1.815c3.187,6.655,8.475,11.09,15.076,14.093
|
||||
c6.81,3.097,14.006,4.256,21.444,4.142c10.33-0.159,20.062-2.53,28.906-8.014c5.264-3.264,9.572-7.471,12.347-13.097
|
||||
c1.15-2.338,2.109-4.737,2.269-7.385c0.016-0.29,0.212-0.571,0.326-0.853c0-0.633,0-1.27,0-1.901
|
||||
c-3.488-0.6-6.802,0.208-10.045,1.362c-3.101,1.102-6.124,2.416-9.25,3.443c-2.692,0.886-5.442,1.673-8.225,2.195
|
||||
c-4.554,0.853-8.042-1.113-10.037-5.41c0.804-1.049,1.995-1.195,3.194-1.253c2.338-0.113,4.685-0.143,7.022-0.302
|
||||
c0.799-0.053,1.664-0.249,2.338-0.648c0.6-0.359,1.121-1.024,1.411-1.673c0.498-1.126,0.311-1.44-0.869-2.085
|
||||
c-3.402-1.856-6.993-3.264-10.714-4.324c-8.421-2.399-17.055-3.028-25.757-3.061c-1.836-0.008-3.677-0.004-5.513,0.082
|
||||
c-0.963,0.045-1.66-0.249-2.366-0.906c-4.843-4.5-9.094-9.53-13.166-14.721c-6.613-8.429-12.48-17.389-18.47-26.259
|
||||
c-2.836-4.198-5.786-8.319-8.769-12.411c-0.999-1.375-2.244-2.574-3.419-3.811c-0.384-0.404-0.885-0.727-1.383-0.991
|
||||
c-1.358-0.727-2.269-0.408-2.905,1.003c-0.229,0.511-0.379,1.062-0.648,1.828c-0.633-0.465-1.179-0.841-1.697-1.253
|
||||
c-5.03-4.019-8.866-9.058-11.905-14.655c-2.954-5.446-5.627-11.048-8.344-16.626c-2.607-5.353-5.092-10.767-8.438-15.712
|
||||
c-1.521-2.248-3.317-4.312-4.9-6.523c-0.783-1.094-1.709-1.229-2.949-1.094c-5.324,0.579-10.625,0.494-15.843-0.894
|
||||
c-2.591-0.689-5.035-1.718-7.1-3.488c-1.473-1.269-2.562-2.746-3.211-4.513c1.95-0.433,3.893-0.897,5.818-1.424
|
||||
c6.459-1.767,12.926-2.469,19.552-2.081c7.964,0.466,15.92,1.159,23.892,1.437c2.853,0.098,5.966-0.172,8.557-1.244
|
||||
c3.859-1.596,7.544-3.799,10.971-6.206c5.075-3.566,9.702-7.78,14.847-11.232c2.379-1.595,3.203-3.292,3.306-5.92
|
||||
c0.134-3.509,1.9-4.781,5.3-4.149c0.6,0.114,1.203,0.253,1.787,0.44c3.852,1.229,7.633,1.028,11.489-0.163
|
||||
c2.962-0.914,6.066-1.354,9.053-2.195c0.547-0.154,1.024-1.199,1.163-1.909c0.094-0.481-0.616-1.068-0.693-1.648
|
||||
c-0.127-0.922-0.384-2.402,0.057-2.705c0.854-0.575,2.154-0.656,3.265-0.636c0.881,0.016,1.733,0.62,2.627,0.729
|
||||
c2.064,0.258,3.995,0.021,5.247-1.986c1.232-1.971,1.277-3.864-0.163-5.757c-0.465-0.608-1.069-1.249-1.191-1.946
|
||||
c-0.163-0.938-0.273-2.199,0.212-2.881c1.779-2.488,3.771-4.83,5.77-7.152c1.828-2.121,4.251-3.354,6.997-3.541
|
||||
c0.967-0.065,2.158,0.742,2.966,1.465c0.633,0.562,0.686,1.729,1.261,2.407c0.674,0.795,1.628,1.347,2.465,2.007
|
||||
c0.571-0.877,1.358-1.688,1.656-2.651c0.311-0.992-0.028-2.175,0.236-3.187c0.213-0.812,0.743-1.738,1.416-2.195
|
||||
c3.591-2.439,7.442-4.524,10.861-7.177c2.574-1.991,4.508-4.786,6.944-6.98c4.182-3.771,9.526-5.097,14.789-6.472
|
||||
c3.452-0.901,4.194-1.921,3.134-5.365c-0.514-1.673-1.228-3.309-2.052-4.854c-1.062-1.987-0.531-3.362,1.297-4.402
|
||||
c0.727-0.412,1.498-0.751,2.252-1.114c2.387-1.139,4.08-2.701,4.688-5.521c0.612-2.827,1.75-5.549,2.741-8.286
|
||||
c1.339-3.692,2.432-7.65,7.34-8.144c0.147-0.017,0.294-0.061,0.441-0.094c0-1.077,0-2.15,0-3.228
|
||||
c-1.135-1.775-2.15-3.639-3.432-5.3C536.084,271.981,534.492,270.614,533.187,269.019z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
{{ __('Plebs on Nostr') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('meetup.meetup.form', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Submit Meetup') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('meetup.event.form', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Register Meetup date') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('bookCases.table.city', ['country' => $country, 'manage' => true]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage cities/areas') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('profile.meetups') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-user-group flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('My meetups') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
@foreach($meetups as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->meetup->getFirstMediaUrl('logo') }}"
|
||||
alt="">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->meetup->users->count() }} {{ __('Participants') }}
|
||||
</time>
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->start->asDateTime() }}
|
||||
</time>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="{{ route('meetup.event.landing', ['country' => $item->meetup->city->country, 'meetupEvent' => $item]) }}">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->meetup->name }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600 truncate">
|
||||
{{ $item->location }}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,107 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()" @keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button" class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('News') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">News</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('article.overview') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-newspaper flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('News Article') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('authors.overview') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-pen-nib flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Authors') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('news.form') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-plus flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Submit news articles') }}
|
||||
</a>
|
||||
|
||||
@if($country)
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]) }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-list flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Manage content creators') }}
|
||||
</a>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent news article</h3>
|
||||
|
||||
@foreach($news as $item)
|
||||
<article wire:key="library_item_{{ $item->id }}"
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<a href="{{ route('article.view', ['libraryItem' => $item]) }}">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->getFirstMediaUrl('main') }}"
|
||||
alt="{{ $item->name }}">
|
||||
</a>
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->created_at->asDateTime() }}
|
||||
</time>
|
||||
<div
|
||||
class="relative z-10 rounded-full bg-gray-50 py-1.5 px-3 text-xs font-medium text-gray-600 hover:bg-gray-100">
|
||||
{{ $item->lecturer->name }}
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="{{ route('article.view', ['libraryItem' => $item]) }}">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->name }}
|
||||
</a>
|
||||
</h4>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,109 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()"
|
||||
@keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button"
|
||||
class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('My profile') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div
|
||||
class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-2 gap-x-6 sm:gap-x-8">
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('My profile') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('profile.show') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-city flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('My profile') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('profile.meetups') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-user-group flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('My meetups') }}
|
||||
</a>
|
||||
|
||||
<a href="{{ route('profile.lnbits') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-key-skeleton-left-right flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('LNBits') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h3 class="text-sm font-medium leading-6 text-gray-500">{{ __('Manage') }}</h3>
|
||||
<div class="mt-6 flow-root">
|
||||
<div class="-my-2">
|
||||
|
||||
<a href="{{ route('profile.wallet') }}"
|
||||
class="flex gap-x-4 py-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<i class="fa-thin fa-bolt flex-none text-gray-400 w-6 h-5 mr-2 -ml-1"></i>
|
||||
{{ __('Change lightning wallet/pubkey') }}
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-2">
|
||||
<h3 class="sr-only">Recent posts</h3>
|
||||
|
||||
{{--@foreach($orangePills as $item)
|
||||
<article
|
||||
class="relative isolate flex max-w-2xl flex-col gap-x-8 gap-y-6 sm:flex-row sm:items-start lg:flex-col lg:items-stretch">
|
||||
<div class="relative flex-none">
|
||||
<img
|
||||
class="aspect-[2/1] w-full rounded-lg bg-gray-100 object-cover sm:aspect-[16/9] sm:h-32 lg:h-auto"
|
||||
src="{{ $item->getFirstMediaUrl('images') }}"
|
||||
alt="{{ $item->bookCase->title }}">
|
||||
<div
|
||||
class="absolute inset-0 rounded-lg ring-1 ring-inset ring-gray-900/10"></div>
|
||||
</div>
|
||||
<div>
|
||||
<div class="flex items-center gap-x-4">
|
||||
<time datetime="2023-03-16" class="text-sm leading-6 text-gray-600">
|
||||
{{ $item->date->asDateTime() }}
|
||||
</time>
|
||||
<div
|
||||
class="relative z-10 rounded-full bg-gray-50 py-1.5 px-3 text-xs font-medium text-gray-600 hover:bg-gray-100">
|
||||
{{ $item->user->name }}
|
||||
</div>
|
||||
</div>
|
||||
<h4 class="mt-2 text-sm font-semibold leading-6 text-gray-900">
|
||||
<a href="#">
|
||||
<span class="absolute inset-0"></span>
|
||||
{{ $item->bookCase->title }}
|
||||
</a>
|
||||
</h4>
|
||||
<p class="mt-2 text-sm leading-6 text-gray-600">
|
||||
{{ $item->bookCase->address }}
|
||||
</p>
|
||||
</div>
|
||||
</article>
|
||||
@endforeach--}}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,52 +0,0 @@
|
||||
<div x-data="Components.popover({ open: false, focus: false })" x-init="init()"
|
||||
@keydown.escape="onEscape"
|
||||
@close-popover-group.window="onClosePopoverGroup">
|
||||
<button type="button"
|
||||
class="flex items-center gap-x-1 text-sm font-semibold leading-6 text-gray-900"
|
||||
@click="toggle" @mousedown="if (open) $event.preventDefault()" aria-expanded="true"
|
||||
:aria-expanded="open.toString()">
|
||||
{{ __('Settings') }}
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" viewBox="0 0 20 20" fill="currentColor"
|
||||
aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div x-show="open" x-transition:enter="transition ease-out duration-200"
|
||||
x-transition:enter-start="opacity-0 -translate-y-1"
|
||||
x-transition:enter-end="opacity-100 translate-y-0"
|
||||
x-transition:leave="transition ease-in duration-150"
|
||||
x-transition:leave-start="opacity-100 translate-y-0"
|
||||
x-transition:leave-end="opacity-0 -translate-y-1"
|
||||
x-description="'Product' flyout menu, show/hide based on flyout menu state."
|
||||
class="absolute inset-x-0 top-0 -z-10 bg-white pt-16 shadow-lg ring-1 ring-gray-900/5"
|
||||
x-ref="panel" @click.away="open = false" x-cloak>
|
||||
<div
|
||||
class="mx-auto grid max-w-7xl grid-cols-1 gap-y-10 gap-x-8 py-10 px-6 lg:grid-cols-2 lg:px-8">
|
||||
<div class="grid grid-cols-1 gap-10 sm:gap-8 lg:grid-cols-3">
|
||||
<h3 class="sr-only">{{ __('Settings') }}</h3>
|
||||
<x-select label="{{ __('Timezone') }}" :clearable="false" wire:model.debounce="timezone"
|
||||
id="timezone"
|
||||
:options="collect(Timezonelist::toArray(false))->collapse()->keys()"/>
|
||||
<x-native-select
|
||||
label="{{ __('Change country') }}"
|
||||
wire:model="c"
|
||||
option-label="name"
|
||||
option-value="code"
|
||||
:options="$countries"
|
||||
/>
|
||||
<x-select
|
||||
label="{{ __('Change language') }}"
|
||||
wire:model="l"
|
||||
:clearable="false"
|
||||
:searchable="true"
|
||||
:async-data="route('api.languages.index')"
|
||||
option-label="name"
|
||||
option-value="language"
|
||||
/>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,24 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('Association') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('project.table.projectFunding', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Submitted projects') }}</a>
|
||||
<a href="{{ route('project.projectProposal.form', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Submit project for funding') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,32 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('Bookcases') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('bookCases.table.city', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('City search') }}</a>
|
||||
<a href="{{ route('bookCases.table.bookcases', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Bookcases') }}</a>
|
||||
<a href="{{ route('bookCases.world', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('World map') }}</a>
|
||||
@auth
|
||||
<a href="{{ route('bookCases.highScoreTable', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Highscore Table') }}</a>
|
||||
@endauth
|
||||
<a href="https://openbookcase.de/" target="_blank"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Submit new book case') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,30 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('Courses') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('school.table.city', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('City search') }}</a>
|
||||
<a href="{{ route('school.table.course', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Courses') }}</a>
|
||||
<a href="{{ route('school.table.venue', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Venues') }}</a>
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Lecturers') }}</a>
|
||||
<a href="{{ route('school.table.event', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Course Events') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,24 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('Events') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('bitcoinEvent.table.bitcoinEvent', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Events') }}</a>
|
||||
<a href="{{ route('bitcoinEvent.form') }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Register event') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,26 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('Library') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Search') }}</a>
|
||||
@auth
|
||||
<a href="{{ route('library.table.lecturer', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Library for lecturers') }}</a>
|
||||
@endauth
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,28 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('Meetups') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('meetup.world', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('World map') }}</a>
|
||||
<a href="{{ route('meetup.table.meetup', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Meetups') }}</a>
|
||||
<a href="{{ route('meetup.table.meetupEvent', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Meetup dates') }}</a>
|
||||
<a href="{{ route('nostr.plebs') }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Plebs on Nostr') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,26 +0,0 @@
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('News') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state." id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('article.overview') }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('News Article') }}</a>
|
||||
<a href="{{ route('authors.overview') }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Authors') }}</a>
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]) }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Manage content creators') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,27 +0,0 @@
|
||||
@auth
|
||||
<div x-data="{ open: false }" class="-mx-3">
|
||||
<button type="button"
|
||||
class="flex w-full items-center justify-between rounded-lg py-2 pl-3 pr-3.5 text-base font-semibold leading-7 hover:bg-gray-50"
|
||||
aria-controls="disclosure-1" @click="open = !open" aria-expanded="false"
|
||||
x-bind:aria-expanded="open.toString()">
|
||||
{{ __('My profile') }}
|
||||
<svg class="h-5 w-5 flex-none"
|
||||
x-description="Expand/collapse icon, toggle classes based on menu open state."
|
||||
x-state:on="Open" x-state:off="Closed" :class="{ 'rotate-180': open }"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z"
|
||||
clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="mt-2 space-y-2"
|
||||
x-description="'Product' sub-menu, show/hide based on menu state."
|
||||
id="disclosure-1"
|
||||
x-show="open" style="display: none;" x-cloak>
|
||||
<a href="{{ route('profile.show') }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('My profile') }}</a>
|
||||
<a href="{{ route('profile.wallet') }}"
|
||||
class="block rounded-lg py-2 pl-6 pr-3 text-sm font-semibold leading-7 text-gray-900 hover:bg-gray-50">{{ __('Change lightning wallet/pubkey') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@endauth
|
||||
@@ -1,31 +0,0 @@
|
||||
<div>
|
||||
<div class="border-b border-gray-200 pb-5 sm:pb-0 my-6">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Search') }}</h3>
|
||||
<div class="mt-3 sm:mt-4">
|
||||
<!-- Tabs at small breakpoint and up -->
|
||||
<div class="hidden sm:block">
|
||||
<nav class="-mb-px flex space-x-8">
|
||||
@php
|
||||
$currentTab = 'border-amber-500 text-amber-600';
|
||||
$notCurrentTab = 'border-transparent text-gray-200 hover:text-gray-400 hover:border-gray-300';
|
||||
@endphp
|
||||
<a href="{{ route('school.table.city', ['country' => $country]).'#table' }}"
|
||||
class="{{ request()->routeIs('school.table.city') ? $currentTab : $notCurrentTab }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Cities') }}</a>
|
||||
|
||||
<a href="{{ route('school.table.lecturer', ['country' => $country]).'#table' }}"
|
||||
class="{{ request()->routeIs('school.table.lecturer') ? $currentTab : $notCurrentTab }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Lecturers') }}</a>
|
||||
|
||||
<a href="{{ route('school.table.venue', ['country' => $country]).'#table' }}"
|
||||
class="{{ request()->routeIs('school.table.venue') ? $currentTab : $notCurrentTab }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Venues') }}</a>
|
||||
|
||||
<a href="{{ route('school.table.course', ['country' => $country]).'#table' }}"
|
||||
class="{{ request()->routeIs('school.table.course') ? $currentTab : $notCurrentTab }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Courses') }}</a>
|
||||
|
||||
<a href="{{ route('school.table.event', ['country' => $country]).'#table' }}"
|
||||
class="{{ request()->routeIs('school.table.event') ? $currentTab : $notCurrentTab }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Dates') }}</a>
|
||||
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,198 +0,0 @@
|
||||
<div class="min-h-screen bg-21gray flex flex-col justify-between">
|
||||
<section class="relative px-10 pt-16 pb-24 sm:py-16 sm:overflow-hidden">
|
||||
<img class="absolute h-43 left-0 z-0 w-3/4 transform -translate-y-1/2 opacity-70 top-1/2"
|
||||
src="{{ asset('img/gradient-blob.svg') }}">
|
||||
<img class="absolute left-0 z-0 object-cover object-center w-full h-full opacity-50 top-24"
|
||||
src="{{ asset('img/swirl-white.svg') }}">
|
||||
<div class="container relative z-10 px-4 mx-auto">
|
||||
<div class="w-full mb-8 sm:w-1/2 md:w-3/4 sm:pr-4 md:pr-12 sm:-mb-32 md:-mb-24 lg:-mb-36 xl:-mb-28">
|
||||
<h2 class="tracking-widest text-amber-500 uppercase">{{ __('Einundzwanzig') }}</h2>
|
||||
<p class="my-3 text-5xl font-bold tracking-tighter text-amber-500 lg:text-6xl">{{ __('Bitcoin Portal') }}</p>
|
||||
<p class="max-w-sm text-lg text-gray-200">
|
||||
{{ __('A Bitcoin community for all.') }}
|
||||
</p>
|
||||
<div
|
||||
class="max-w-sm text-lg text-gray-200 space-y-2 sm:space-y-0 sm:space-x-2 flex flex-col sm:flex-row items-start sm:items-end">
|
||||
<x-native-select
|
||||
label="{{ __('Change country') }}"
|
||||
wire:model="c"
|
||||
option-label="name"
|
||||
option-value="code"
|
||||
:options="$countries"
|
||||
/>
|
||||
<x-select
|
||||
label="{{ __('Change language') }}"
|
||||
wire:model="l"
|
||||
:clearable="false"
|
||||
:searchable="true"
|
||||
:async-data="route('api.languages.index')"
|
||||
option-label="name"
|
||||
option-value="language"
|
||||
/>
|
||||
<div class="py-2 sm:py-0">
|
||||
@if(!auth()->check())
|
||||
<x-button secondary href="{{ route('auth.login') }}">
|
||||
<i class="fa-thin fa-sign-in"></i>
|
||||
{{ __('Login') }}
|
||||
</x-button>
|
||||
@else
|
||||
<form method="POST" action="{{ route('logout') }}" class="inline">
|
||||
@csrf
|
||||
<x-button secondary type="submit">
|
||||
<i class="fa-thin fa-sign-out"></i>
|
||||
{{ __('Logout') }}
|
||||
</x-button>
|
||||
</form>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid w-full grid-cols-1 gap-8 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4">
|
||||
|
||||
{{-- News --}}
|
||||
<div class="row-span-2 col-span-full sm:col-span-1 md:col-start-1 sm:row-start-2 md:row-start-3">
|
||||
<a href="{{ route('article.overview') }}"
|
||||
class="relative flex flex-col items-start justify-end w-full h-full overflow-hidden bg-black shadow-lg rounded-xl group"
|
||||
style="aspect-ratio: 1/1;">
|
||||
<div class="absolute inset-0 w-full h-full">
|
||||
<div
|
||||
class="absolute bottom-0 left-0 z-10 w-full h-full opacity-30 bg-gradient-to-b from-transparent to-gray-900"></div>
|
||||
<img
|
||||
class="bg-white absolute inset-0 object-contain object-center w-full h-full transition duration-500 lg:opacity-80 group-hover:opacity-100 group-hover:scale-110"
|
||||
src="{{ asset('img/einundzwanzig-news-colored.png') }}" alt="">
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
{{ __('News') }}
|
||||
</h4>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="row-span-2 col-span-full sm:col-span-1 md:col-start-1 xl:col-start-2 sm:row-start-4 md:row-start-5 xl:row-start-2">
|
||||
<a href="{{ route('school.table.course', ['country' => $c]) }}"
|
||||
class="relative flex flex-col items-start justify-end w-full h-full overflow-hidden bg-black shadow-lg rounded-xl group"
|
||||
style="aspect-ratio: 1/1;">
|
||||
<div class="absolute inset-0 w-full h-full">
|
||||
<div
|
||||
class="absolute bottom-0 left-0 z-10 w-full h-full opacity-30 bg-gradient-to-b from-transparent to-gray-900"></div>
|
||||
<img
|
||||
class="absolute inset-0 object-cover object-center w-full h-full transition duration-500 lg:opacity-80 group-hover:opacity-100 group-hover:scale-110"
|
||||
src="{{ asset('img/vhs_kurs.jpg') }}" alt="">
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<span
|
||||
class="px-2 py-1 mb-3 text-xs font-semibold tracking-tight text-white uppercase bg-amber-500 rounded-md">{{ __('Education') }}</span>
|
||||
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
{{ __('Courses') }}
|
||||
</h4>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="row-span-2 col-span-full sm:col-span-1 md:col-start-2 xl:col-start-2 sm:row-start-6 md:row-start-2 xl:row-start-4">
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $c]) }}"
|
||||
class="relative flex flex-col items-start justify-end w-full h-full overflow-hidden bg-black shadow-lg rounded-xl group"
|
||||
style="aspect-ratio: 1/1;">
|
||||
<div class="absolute inset-0 w-full h-full">
|
||||
<div
|
||||
class="absolute bottom-0 left-0 z-10 w-full h-full opacity-30 bg-gradient-to-b from-transparent to-gray-900"></div>
|
||||
<img
|
||||
class="absolute inset-0 object-cover object-center w-full h-full transition duration-500 lg:opacity-80 group-hover:opacity-100 group-hover:scale-110"
|
||||
src="{{ asset('img/news_2.png') }}" alt="">
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<span
|
||||
class="px-2 py-1 mb-3 text-xs font-semibold tracking-tight text-white uppercase bg-amber-500 rounded-md">{{ _('Content') }}</span>
|
||||
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
{{ __('Library') }}
|
||||
</h4>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="row-span-2 col-span-full sm:col-span-1 md:col-start-2 xl:col-start-3 sm:row-start-1 md:row-start-4 xl:row-start-1">
|
||||
<a href="{{ route('bitcoinEvent.table.bitcoinEvent', ['country' => $c]) }}"
|
||||
class="relative flex flex-col items-start justify-end w-full h-full overflow-hidden bg-black shadow-lg rounded-xl group"
|
||||
style="aspect-ratio: 1/1;">
|
||||
<div class="absolute inset-0 w-full h-full">
|
||||
<div
|
||||
class="absolute bottom-0 left-0 z-10 w-full h-full opacity-30 bg-gradient-to-b from-transparent to-gray-900"></div>
|
||||
<img
|
||||
class="absolute inset-0 object-cover object-center w-full h-full transition duration-500 lg:opacity-80 group-hover:opacity-100 group-hover:scale-110"
|
||||
src="{{ asset('img/20220915_007_industryday.webp') }}" alt="">
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<span
|
||||
class="px-2 py-1 mb-3 text-xs font-semibold tracking-tight text-white uppercase bg-amber-500 rounded-md">{{ __('Worldwide') }}</span>
|
||||
<h4 class="text-2xl sm:text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
{{ __('Events') }}
|
||||
</h4>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="row-span-2 col-span-full sm:col-span-1 md:col-start-3 xl:col-start-3 sm:row-start-3 md:row-start-1 xl:row-start-3">
|
||||
<a href="{{ route('bookCases.world', ['country' => $c]) }}"
|
||||
class="relative flex flex-col items-start justify-end w-full h-full overflow-hidden bg-black shadow-lg rounded-xl group"
|
||||
style="aspect-ratio: 1/1;">
|
||||
<div class="absolute inset-0 w-full h-full">
|
||||
<div
|
||||
class="absolute bottom-0 left-0 z-10 w-full h-full opacity-30 bg-gradient-to-b from-transparent to-gray-900"></div>
|
||||
<img
|
||||
class="absolute inset-0 object-cover object-center w-full h-full transition duration-500 lg:opacity-80 group-hover:opacity-100 group-hover:scale-110"
|
||||
src="{{ asset('img/bookcase.jpg') }}" alt="">
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<span
|
||||
class="px-2 py-1 mb-3 text-xs font-semibold tracking-tight text-white uppercase bg-amber-500 rounded-md">{{ __('Reading') }}</span>
|
||||
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
{{ __('Bookcases') }}
|
||||
</h4>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class="row-span-2 col-span-full sm:col-span-1 md:col-start-3 xl:col-start-4 sm:row-start-5 md:row-start-3 xl:row-start-2">
|
||||
<a href="{{ route('meetup.table.meetup', ['country' => $c]) }}"
|
||||
class="relative flex flex-col items-start justify-end w-full h-full overflow-hidden bg-black shadow-lg rounded-xl group"
|
||||
style="aspect-ratio: 1/1;">
|
||||
<div class="absolute inset-0 w-full h-full">
|
||||
<div
|
||||
class="absolute bottom-0 left-0 z-10 w-full h-full bg-gradient-to-b from-transparent to-gray-900 opacity-30"></div>
|
||||
<img
|
||||
class="absolute inset-0 object-cover object-center w-full h-full transition duration-500 lg:opacity-80 group-hover:opacity-100 group-hover:scale-110"
|
||||
src="{{ asset('img/meetup_saarland.jpg') }}" alt="">
|
||||
</div>
|
||||
<div class="relative z-10 flex flex-col items-start justify-start w-full px-6 py-7">
|
||||
<h4 class="text-4xl font-bold tracking-tight text-gray-100 sm:text-3xl md:text-2xl lg:text-3xl">
|
||||
{{ __('Meetups') }}
|
||||
</h4>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<div class="bottom-0 w-full">
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,94 +0,0 @@
|
||||
<div>
|
||||
<section class="w-full">
|
||||
<div class="max-w-screen-2xl mx-auto px-10">
|
||||
<div class="flex flex-col flex-wrap items-center justify-between py-7 mx-auto md:flex-row max-w-screen-2xl">
|
||||
<div class="relative flex flex-col md:flex-row">
|
||||
<a href="#_"
|
||||
class="flex items-center mb-5 font-medium text-gray-900 lg:w-auto lg:items-center lg:justify-center md:mb-0">
|
||||
<img src="{{ asset('img/einundzwanzig-horizontal-inverted.svg') }}">
|
||||
</a>
|
||||
<nav
|
||||
class="flex flex-wrap items-center mb-5 text-lg md:mb-0 md:pl-8 md:ml-8 md:border-l md:border-gray-800">
|
||||
<a href="#_" class="mr-5 font-medium leading-6 text-gray-400 hover:text-gray-300">{{ __('Cities') }}</a>
|
||||
<a href="#_" class="mr-5 font-medium leading-6 text-gray-400 hover:text-gray-300">{{ __('Lecturers') }}</a>
|
||||
<a href="#_" class="mr-5 font-medium leading-6 text-gray-400 hover:text-gray-300">{{ __('Courses') }}</a>
|
||||
<a href="#_" class="mr-5 font-medium leading-6 text-gray-400 hover:text-gray-300">{{ __('Dates') }}</a>
|
||||
</nav>
|
||||
</div>
|
||||
<div class="inline-flex items-center ml-5 text-lg space-x-6 lg:justify-end">
|
||||
<a href="{{ route('nova.login') }}"
|
||||
class="text-base font-medium leading-6 text-gray-400 hover:text-gray-300 whitespace-no-wrap transition duration-150 ease-in-out">
|
||||
{{ __('Login') }}
|
||||
</a>
|
||||
<a href="#"
|
||||
class="inline-flex items-center justify-center px-4 py-2 font-medium leading-6 text-gray-200 hover:text-white whitespace-no-wrap bg-gray-800 border border-transparent rounded shadow-sm hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-800">
|
||||
{{ __('Registration') }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex lg:flex-row flex-col pt-4 md:pt-4 lg:pt-4">
|
||||
<div
|
||||
class="w-full lg:w-1/2 flex lg:px-0 px-5 flex-col md:items-center lg:items-start justify-center -mt-12">
|
||||
<h1 class="text-white text-3xl sm:text-5xl lg:max-w-none max-w-4xl lg:text-left text-left md:text-center xl:text-7xl font-black">
|
||||
Bitcoin <span
|
||||
class="bg-clip-text text-transparent bg-gradient-to-br from-yellow-400 via-yellow-500 to-yellow-700 mt-1 lg:block">{{ __('School') }}</span>
|
||||
</h1>
|
||||
<p class="text-gray-500 sm:text-lg md:text-xl xl:text-2xl lg:max-w-none max-w-2xl md:text-center lg:text-left lg:pr-32 mt-6">
|
||||
{{ __('Find Bitcoin courses in your city') }}
|
||||
</p>
|
||||
<a href="#_"
|
||||
class="bg-white px-12 lg:px-16 py-4 text-center lg:py-5 font-bold rounded text-lg md:text-xl lg:text-2xl mt-8 inline-block w-auto">
|
||||
{{ __('👇 Find a course 👇') }}
|
||||
</a>
|
||||
<p class="text-gray-400 font-normal mt-4">{{-- TEXT --}}</p>
|
||||
</div>
|
||||
<div class="w-full lg:w-1/2 relative lg:mt-0 mt-20 flex items-center justify-center">
|
||||
{{--<img src="https://cdn.devdojo.com/images/march2022/mesh-gradient1.png"
|
||||
class="absolute lg:max-w-none max-w-3xl mx-auto mt-32 w-full h-full inset-0">--}}
|
||||
<img src="{{ asset('img/btc-logo-6219386_1280.png') }}"
|
||||
class="w-full md:w-auto w-72 max-w-md max-w-sm ml-4 md:ml-20 lg:ml-0 xl:max-w-lg relative">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-10">
|
||||
<div class="border-b border-gray-200 pb-5 sm:pb-0 my-6">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Search') }}</h3>
|
||||
<div class="mt-3 sm:mt-4">
|
||||
<!-- Dropdown menu on small screens -->
|
||||
<div class="sm:hidden">
|
||||
<label for="current-tab" class="sr-only">{{ __('Select a tab') }}</label>
|
||||
<select id="current-tab" name="current-tab"
|
||||
class="block w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-base focus:border-indigo-500 focus:outline-none focus:ring-indigo-500 sm:text-sm">
|
||||
<option>{{ __('Cities') }}</option>
|
||||
<option>{{ __('Lecturers') }}</option>
|
||||
<option>{{ __('Courses') }}</option>
|
||||
<option>{{ __('Dates') }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<!-- Tabs at small breakpoint and up -->
|
||||
<div class="hidden sm:block">
|
||||
<nav class="-mb-px flex space-x-8">
|
||||
<!-- Current: "border-indigo-200 text-indigo-600", Default: "border-transparent text-gray-200 hover:text-gray-400 hover:border-gray-300" -->
|
||||
<a href="#"
|
||||
class="border-transparent text-gray-200 hover:text-gray-400 hover:border-gray-300 whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Cities') }}</a>
|
||||
|
||||
<a href="#"
|
||||
class="border-amber-500 text-amber-500 hover:border-gray-300 whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Lecturers') }}</a>
|
||||
|
||||
<a href="#"
|
||||
class="border-transparent text-gray-200 hover:text-gray-400 hover:border-gray-300 whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Courses') }}</a>
|
||||
|
||||
<a href="#"
|
||||
class="border-transparent text-gray-200 hover:text-gray-400 hover:border-gray-300 whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ __('Dates') }}</a>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.lecturer-table/>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
@@ -1,33 +0,0 @@
|
||||
<div>
|
||||
<div
|
||||
class="mt-10 flex flex-col items-center justify-center gap-x-6 bg-white pb-12">
|
||||
@if(!$invoicePaid)
|
||||
<div class="text-xl font-semibold text-gray-900 py-6 px-2">
|
||||
Deine Nachricht wird live vorgelesen.
|
||||
Fülle zuerst das Textfeld mit deiner Nachricht aus
|
||||
und bezahle erst danach mit Lightning.
|
||||
</div>
|
||||
<div class="text-xl font-semibold text-gray-900 py-6 w-full px-12">
|
||||
<x-textarea wire:model="message" label="Deine Nachricht hier" corner-hint="max. 255 Zeichen"/>
|
||||
</div>
|
||||
<div class="text-xl font-semibold text-gray-900 py-6 px-2">
|
||||
{{ __('Click QR-Code to open your wallet') }}
|
||||
</div>
|
||||
<div class="flex justify-center" wire:key="qrcode">
|
||||
<a href="lightning:{{ $this->invoice }}">
|
||||
<img src="{{ 'data:image/png;base64, '. $this->qrCode }}"
|
||||
alt="qrcode">
|
||||
</a>
|
||||
</div>
|
||||
<div class="text-xl font-semibold text-gray-900 py-6">
|
||||
21 sats
|
||||
</div>
|
||||
<div wire:poll.keep-alive="checkPaymentHash"
|
||||
wire:key="checkPaymentHash"></div>
|
||||
@else
|
||||
<div class="text-xl font-semibold text-gray-900 py-6">
|
||||
Danke für deine Nachricht. Wenn alles klappt, dann werden wir die Nachricht gleich hören.
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,216 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Library Item') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('libraryItem.lecturer_id')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Author') }}
|
||||
</div>
|
||||
<div>
|
||||
<x-button xs :href="route('contentCreator.form')">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Create new author') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
:clearable="false"
|
||||
wire:model="libraryItem.lecturer_id"
|
||||
:searchable="true"
|
||||
:async-data="[
|
||||
'api' => route('api.lecturers.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'image']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.type')" label="{{ __('Type') }}">
|
||||
<x-select
|
||||
:clearable="false"
|
||||
wire:model="libraryItem.type"
|
||||
:options="$types"
|
||||
option-label="label"
|
||||
option-value="value"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('library')" label="{{ __('Library') }}">
|
||||
<x-select
|
||||
:disabled="$lecturer"
|
||||
hint="{{ __('Please classify by type of your entry.') }}"
|
||||
:clearable="false"
|
||||
wire:model="library"
|
||||
:options="$libraries"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('selectedTags')" :label="__('Tags')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Tags') }}
|
||||
</div>
|
||||
@if(!$addTag)
|
||||
<x-button
|
||||
xs
|
||||
wire:click="$set('addTag', true)"
|
||||
>
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Add') }}
|
||||
</x-button>
|
||||
@else
|
||||
<x-input label="" wire:model.debounce="newTag" placeholder="{{ __('New tag') }}"/>
|
||||
<x-button
|
||||
xs
|
||||
wire:click="addTag">
|
||||
<i class="text-xl fa-thin fa-save"></i>
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
</x-slot>
|
||||
<div class="py-2 flex flex-wrap items-center space-x-1">
|
||||
@foreach($tags as $tag)
|
||||
<div class="cursor-pointer" wire:key="tag{{ $loop->index }}"
|
||||
wire:click="selectTag('{{ $tag['name'] }}')">
|
||||
@if(collect($selectedTags)->contains($tag['name']))
|
||||
<x-badge
|
||||
amber>
|
||||
{{ $tag['name'] }}
|
||||
</x-badge>
|
||||
@else
|
||||
<x-badge
|
||||
black>
|
||||
{{ $tag['name']}}
|
||||
</x-badge>
|
||||
@endif
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</x-input.group>
|
||||
|
||||
@if($libraryItem->lecturer_id && $libraryItem->type && $library && count($selectedTags) > 0)
|
||||
<x-input.group :for=" md5('image')" :label="__('Main picture')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($libraryItem->getFirstMediaUrl('main'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $libraryItem->getFirstMediaUrl('main') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
@if(!$isBindle)
|
||||
<x-input.group :for="md5('libraryItem.main_image_caption')"
|
||||
:label="__('Main image caption')">
|
||||
<x-input autocomplete="off" wire:model.debounce="libraryItem.main_image_caption"
|
||||
:placeholder="__('Main image caption')"
|
||||
:cornerHint="__('Ex: Photo by Timothy Vollmer/ CC BY')"/>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
<x-input.group :for="md5('libraryItem.name')" :label="__('Title')">
|
||||
<x-input autocomplete="off" wire:model.debounce="libraryItem.name"
|
||||
:placeholder="__('Title')"/>
|
||||
</x-input.group>
|
||||
|
||||
@if(!$isBindle)
|
||||
<x-input.group :for="md5('libraryItem.subtitle')" :label="__('Subtitle')">
|
||||
<x-input autocomplete="off" wire:model.debounce="libraryItem.subtitle"
|
||||
:placeholder="__('Subtitle')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.excerpt')" :label="__('Excerpt')">
|
||||
<x-textarea autocomplete="off" wire:model.debounce="libraryItem.excerpt"
|
||||
:placeholder="__('Excerpt')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.language_code')" :label="__('Language Code')">
|
||||
<x-select
|
||||
placeholder="{{ __('Choose language') }}"
|
||||
wire:model="libraryItem.language_code"
|
||||
:clearable="false"
|
||||
:searchable="true"
|
||||
:async-data="route('api.languages.index')"
|
||||
option-label="name"
|
||||
option-value="language"
|
||||
/>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
@if($libraryItem->type === App\Enums\LibraryItemType::MarkdownArticleExtern())
|
||||
<x-input.group :for="md5('libraryItem.value')" :label="__('Article as Markdown')">
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="libraryItem.value"/>
|
||||
@error('libraryItem.value') <span
|
||||
class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
@elseif($libraryItem->type !== App\Enums\LibraryItemType::DownloadableFile())
|
||||
<x-input.group :for="md5('libraryItem.value')" :label="__('Link')">
|
||||
<x-input type="url" autocomplete="off" wire:model.debounce="libraryItem.value"
|
||||
:placeholder="__('Link')"/>
|
||||
</x-input.group>
|
||||
@elseif($libraryItem->type === App\Enums\LibraryItemType::DownloadableFile())
|
||||
<x-input.group :for="md5('file')" :label="__('File')">
|
||||
<input class="text-gray-200" type="file" wire:model="file">
|
||||
@error('file') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
@if(!$isBindle)
|
||||
<x-input.group :for="md5('libraryItem.read_time')" :label="__('Time to read')">
|
||||
<x-inputs.number min="1" autocomplete="off" wire:model.debounce="libraryItem.read_time"
|
||||
:placeholder="__('Time to read')"
|
||||
:hint="__('How many minutes to read?')"/>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.link')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
|
||||
</div>
|
||||
@@ -1,184 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
<div class="max-w-screen-2xl mx-auto">
|
||||
<div class="w-full mb-6 sm:my-6">
|
||||
<div class="flex w-full justify-center mb-4">
|
||||
<x-button primary :href="route('library.libraryItem.form', ['country' => $country])">
|
||||
<i class="fa-thin fa-plus"></i>
|
||||
{{ __('Submit contents') }}
|
||||
</x-button>
|
||||
</div>
|
||||
<x-input class="sm:min-w-[900px]" placeholder="Suche..." wire:model.debounce="search">
|
||||
<x-slot name="append">
|
||||
<div class="absolute inset-y-0 right-0 flex items-center p-0.5">
|
||||
<x-button
|
||||
wire:click="resetFiltering({{ $isLecturerPage }})"
|
||||
class="h-full rounded-r-md"
|
||||
black
|
||||
flat
|
||||
squared
|
||||
>
|
||||
<i class="fa-thin fa-xmark"></i>
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
</x-input>
|
||||
</div>
|
||||
</div>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10" id="table">
|
||||
|
||||
<div class="relative border-b border-gray-200 pb-5 sm:pb-0">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
@if(request()->route()->getName() === 'library.table.lecturer')
|
||||
<h3 class="text-2xl font-medium leading-6 text-gray-200">{{ __('Lecturer Libraries') }}</h3>
|
||||
@else
|
||||
<h3 class="text-2xl font-medium leading-6 text-gray-200">{{ __('Libraries') }}</h3>
|
||||
@endif
|
||||
<x-button wire:click="resetFiltering({{ $isLecturerPage }})"
|
||||
xs>{{ __('Reset filtering and search') }}</x-button>
|
||||
</div>
|
||||
<div class="mt-4">
|
||||
<!-- Dropdown menu on small screens -->
|
||||
{{--<div class="sm:hidden">
|
||||
<label for="current-tab" class="sr-only">Select a tab</label>
|
||||
<select id="current-tab" name="current-tab" class="block w-full rounded-md border-gray-300 py-2 pl-3 pr-10 text-base focus:border-amber-500 focus:outline-none focus:ring-amber-500 sm:text-sm">
|
||||
<option>Applied</option>
|
||||
<option>Phone Screening</option>
|
||||
<option>Interview</option>
|
||||
<option>Offer</option>
|
||||
<option>Hired</option>
|
||||
</select>
|
||||
</div>--}}
|
||||
<!-- Tabs at small breakpoint and up -->
|
||||
<div class="hidden sm:block">
|
||||
<nav class="-mb-px flex space-x-8">
|
||||
@foreach($libraries as $library)
|
||||
@php
|
||||
$currentLibraryClass = $currentTab === $library['name'] ? 'border-amber-500 text-amber-600' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300';
|
||||
@endphp
|
||||
@if($isLecturerPage)
|
||||
<a href="{{ route('library.table.lecturer', ['country' => $country, 'currentTab' => $library['name']]) }}"
|
||||
class="{{ $currentLibraryClass }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ $library['name'] }}</a>
|
||||
@else
|
||||
<a href="{{ route('library.table.libraryItems', ['country' => $country, 'currentTab' => $library['name']]) }}"
|
||||
class="{{ $currentLibraryClass }} whitespace-nowrap pb-4 px-1 border-b-2 font-medium text-sm">{{ $library['name'] }}</a>
|
||||
@endif
|
||||
@endforeach
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<livewire:library.search-by-tag-component/>
|
||||
<div class="my-12">
|
||||
|
||||
<div wire:loading.class="opacity-25"
|
||||
class="mx-auto mt-12 grid max-w-lg gap-5 lg:max-w-none lg:grid-cols-3">
|
||||
|
||||
@foreach($libraryItems as $libraryItem)
|
||||
@php
|
||||
$link = $isLecturerPage ? route('lecturerMaterial.view', ['libraryItem' => $libraryItem]) : route('libraryItem.view', ['libraryItem' => $libraryItem]);
|
||||
@endphp
|
||||
<div wire:key="library_item_{{ $libraryItem->id }}"
|
||||
class="flex flex-col overflow-hidden rounded-lg border-2 border-[#F7931A]">
|
||||
<div class="flex-shrink-0 pt-6">
|
||||
<a href="{{ $link }}">
|
||||
<img class="h-48 w-full object-contain"
|
||||
src="{{ $libraryItem->getFirstMediaUrl('main', 'seo') }}"
|
||||
alt="{{ $libraryItem->name }}">
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex flex-1 flex-col justify-between bg-21gray p-6">
|
||||
<div class="flex-1">
|
||||
<div class="text-sm font-medium text-amber-600">
|
||||
<div
|
||||
class="text-amber-500">{{ $libraryItem->tags->pluck('name')->join(', ') }}</div>
|
||||
</div>
|
||||
<a href="{{ $link }}"
|
||||
class="mt-2 block">
|
||||
<p class="text-xl font-semibold text-gray-200">{{ $libraryItem->name }}</p>
|
||||
<p class="mt-3 text-base text-gray-300 line-clamp-6">{{ strip_tags($libraryItem->excerpt) }}</p>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mt-6 flex items-center">
|
||||
<div class="flex-shrink-0">
|
||||
<div>
|
||||
<span
|
||||
class="sr-only text-gray-200">{{ $libraryItem->lecturer->name }}</span>
|
||||
<img class="h-10 w-10 object-cover rounded"
|
||||
src="{{ $libraryItem->lecturer->getFirstMediaUrl('avatar') }}"
|
||||
alt="{{ $libraryItem->lecturer->name }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<div class="text-sm font-medium text-gray-200">
|
||||
<div class="text-gray-200">{{ $libraryItem->lecturer->name }}</div>
|
||||
</div>
|
||||
<div class="flex space-x-1 text-sm text-gray-400">
|
||||
<time
|
||||
datetime="2020-03-16">{{ $libraryItem->created_at->asDateTime() }}</time>
|
||||
@if($libraryItem->read_time)
|
||||
<span aria-hidden="true">·</span>
|
||||
<span>{{ $libraryItem->read_time }} {{ __('min read') }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div
|
||||
class="flex space-x-1 text-sm text-gray-500 justify-end items-end">
|
||||
<div>
|
||||
<x-button xs
|
||||
:href="route('library.libraryItem.form', ['country' => $country, 'libraryItem' => $libraryItem])">
|
||||
<i class="fa fa-thin fa-edit"></i>
|
||||
{{ __('Edit') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
<div
|
||||
x-data="{
|
||||
observe () {
|
||||
let observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
@this.call('loadMore')
|
||||
}
|
||||
})
|
||||
}, {
|
||||
root: null
|
||||
})
|
||||
observer.observe(this.$el)
|
||||
}
|
||||
}"
|
||||
x-init="observe"
|
||||
></div>
|
||||
|
||||
@if($libraryItems->hasMorePages())
|
||||
<x-button outline wire:click.prevent="loadMore">{{ __('load more...') }}</x-button>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_library"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,130 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
<div class="max-w-screen-2xl mx-auto">
|
||||
<div class="w-full mb-6 sm:my-6">
|
||||
<x-input class="sm:min-w-[900px]" placeholder="Suche..." wire:model.debounce="search">
|
||||
<x-slot name="append">
|
||||
<div class="absolute inset-y-0 right-0 flex items-center p-0.5">
|
||||
<x-button
|
||||
wire:click="resetFiltering()"
|
||||
class="h-full rounded-r-md"
|
||||
black
|
||||
flat
|
||||
squared
|
||||
>
|
||||
<i class="fa-thin fa-xmark"></i>
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
</x-input>
|
||||
</div>
|
||||
</div>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10" id="table">
|
||||
|
||||
<div class="relative border-b border-gray-200 pb-5 sm:pb-0">
|
||||
<div class="md:flex md:items-center md:justify-between py-6">
|
||||
<h3 class="text-2xl font-medium leading-6 text-gray-200">{{ __('Podcast Episodes') }}</h3>
|
||||
<x-button wire:click="resetFiltering()"
|
||||
xs>
|
||||
{{ __('Reset filtering and search') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="my-12">
|
||||
|
||||
<div wire:loading.class="opacity-25"
|
||||
class="mx-auto mt-12 grid max-w-lg gap-5 lg:max-w-none lg:grid-cols-3">
|
||||
|
||||
@foreach($episodes as $episode)
|
||||
<div wire:key="episode_{{ $episode->id }}"
|
||||
class="flex flex-col overflow-hidden rounded-lg border-2 border-[#F7931A]">
|
||||
<div class="flex-shrink-0 pt-6">
|
||||
<a href="{{ $episode->data['link'] }}" target="_blank">
|
||||
<img class="h-48 w-full object-contain"
|
||||
src="{{ !empty($episode->data['image']) ? $episode->data['image'] : $episode->podcast->data['image'] }}"
|
||||
alt="{{ $episode->data['title'] }}">
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex flex-1 flex-col justify-between bg-21gray p-6">
|
||||
<div class="flex-1">
|
||||
<div class="text-sm font-medium text-amber-600">
|
||||
<div
|
||||
class="text-amber-500">{{ __('Language') }}: {{ $episode->data['feedLanguage'] }}</div>
|
||||
</div>
|
||||
<a href="{{ $episode->data['link'] }}" target="_blank"
|
||||
class="mt-2 block">
|
||||
<p class="text-xl font-semibold text-gray-200">{{ $episode->data['title'] }}</p>
|
||||
<p class="prose mt-3 text-base text-gray-300 line-clamp-3">{{ strip_tags($episode->data['description']) }}</p>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mt-6 flex items-center">
|
||||
<div class="flex-shrink-0">
|
||||
<div>
|
||||
<span
|
||||
class="sr-only text-gray-200">{{ $episode->podcast->title }}</span>
|
||||
<img class="h-10 w-10 object-cover rounded"
|
||||
src="{{ $episode->podcast->data['image'] }}"
|
||||
alt="{{ $episode->podcast->data['title'] }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<div class="text-sm font-medium text-gray-200">
|
||||
<div class="text-gray-200">{{ $episode->podcast->title }}</div>
|
||||
</div>
|
||||
<div class="flex space-x-1 text-sm text-gray-400">
|
||||
<time
|
||||
datetime="2020-03-16">{{ \App\Support\Carbon::parse($episode->data['datePublished'])->asDateTime() }}</time>
|
||||
<span aria-hidden="true">·</span>
|
||||
<span>{{ round($episode->data['duration'] / 60) }} {{ __('minutes') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
|
||||
<div
|
||||
x-data="{
|
||||
observe () {
|
||||
let observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
@this.call('loadMore')
|
||||
}
|
||||
})
|
||||
}, {
|
||||
root: null
|
||||
})
|
||||
observer.observe(this.$el)
|
||||
}
|
||||
}"
|
||||
x-init="observe"
|
||||
></div>
|
||||
|
||||
@if($episodes->hasMorePages())
|
||||
<x-button outline wire:click.prevent="loadMore">{{ __('load more...') }}</x-button>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_podcasts"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,52 +0,0 @@
|
||||
<div>
|
||||
<div
|
||||
class="flex overflow-auto relative flex-wrap gap-x-1 gap-y-1 justify-left p-0 mx-auto mt-2 mb-2 w-full font-normal text-white align-baseline border-0 border-solid md:mx-auto md:mb-0 md:max-w-screen-2xl"
|
||||
>
|
||||
@foreach($languages as $language)
|
||||
<div
|
||||
class="flex flex-wrap justify-left p-0 m-0 text-center align-baseline border-0 border-solid"
|
||||
style="font-size: 128%; background-position: 0px center; list-style: outside;"
|
||||
>
|
||||
<a
|
||||
href="{{ route(request()->route()->getName(), ['country' => $country, 'filters' => ['language' => [$language]]]) }}"
|
||||
>
|
||||
@if(in_array($language, $filters['language'] ?? [], false))
|
||||
<x-badge squared amber>
|
||||
{{ $language }}
|
||||
</x-badge>
|
||||
@else
|
||||
<x-badge squared gray>
|
||||
{{ $language }}
|
||||
</x-badge>
|
||||
@endif
|
||||
</a>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
<div
|
||||
class="flex overflow-auto relative flex-wrap gap-x-1 gap-y-1 justify-left p-0 mx-auto mt-2 mb-2 w-full font-normal text-white align-baseline border-0 border-solid md:mx-auto md:mb-0 md:max-w-screen-2xl"
|
||||
>
|
||||
@foreach($tags as $tag)
|
||||
<div
|
||||
class="flex flex-wrap justify-left p-0 m-0 text-center align-baseline border-0 border-solid"
|
||||
style="font-size: 128%; background-position: 0px center; list-style: outside;"
|
||||
>
|
||||
<a
|
||||
href="{{ route(request()->route()->getName(), ['country' => $country, 'filters' => ['tag' => [$tag->id]]]) }}"
|
||||
>
|
||||
@if(in_array($tag->id, $filters['tag'] ?? [], false))
|
||||
<x-badge squared amber>
|
||||
<i class="fa fa-thin fa-{{ $tag->icon }}"></i>
|
||||
{{ $tag->name }}
|
||||
</x-badge>
|
||||
@else
|
||||
<x-badge squared gray>
|
||||
<i class="fa fa-thin fa-{{ $tag->icon }}"></i>
|
||||
{{ $tag->name }}
|
||||
</x-badge>
|
||||
@endif
|
||||
</a>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,50 +0,0 @@
|
||||
<div class="h-full {{ $darkMode ? 'bg-21gray' : 'bg-transparent' }}">
|
||||
@php
|
||||
$focus = '';
|
||||
$map = $country->code . '_merc';
|
||||
if (!\File::exists(public_path('vendor/jvector/maps/' . $country->code . '.js'))) {
|
||||
$map = 'europe_merc';
|
||||
$focus = 'focusOn: {lat:'.$country->latitude.',lng:'.$country->longitude.',scale:8,animate:true},';
|
||||
}
|
||||
@endphp
|
||||
<div
|
||||
wire:ignore
|
||||
class="w-full flex justify-center h-full"
|
||||
x-data="{
|
||||
init() {
|
||||
let markers = {{ Js::from($markers) }};
|
||||
|
||||
$('#map').vectorMap({
|
||||
{{ $focus }}
|
||||
zoomButtons : true,
|
||||
zoomOnScroll: true,
|
||||
map: '{{ $map }}',
|
||||
backgroundColor: 'transparent',
|
||||
markers: markers.map(function(h){ return {name: h.name, latLng: h.coords, url: h.url} }),
|
||||
onMarkerClick: function(event, index) {
|
||||
window.open(
|
||||
markers[index].url,
|
||||
'_blank'
|
||||
);
|
||||
},
|
||||
markerStyle: {
|
||||
initial: {
|
||||
image: '{{ asset('img/btc.png') }}',
|
||||
}
|
||||
},
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#a4a4a4'
|
||||
},
|
||||
hover: {
|
||||
'fill-opacity': 1,
|
||||
cursor: 'default'
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div id="map" style="width: 100%; height: 100vh;" class="my-4 sm:my-0"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,123 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Meetup Event') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
@if($meetupEvent->id)
|
||||
<x-button negative wire:click="deleteMe">
|
||||
<i class="fa fa-thin fa-trash"></i>
|
||||
{{ __('Delete') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('meetup_id')" :label="__('Meetup')">
|
||||
<x-select
|
||||
autocomplete="off"
|
||||
wire:model.debounce="meetupEvent.meetup_id"
|
||||
:placeholder="__('Meetup')"
|
||||
:async-data="[
|
||||
'api' => route('api.meetup.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
'params' => ['user_id' => auth()->id()], // default is []
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'profile_image']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
option-description="city.name"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.start')" :label="__('Start')">
|
||||
<x-datetime-picker
|
||||
:clearable="false"
|
||||
time-format="24"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="meetupEvent.start"
|
||||
display-format="DD-MM-YYYY HH:mm"
|
||||
:placeholder="__('Start')"/>
|
||||
</x-input.group>
|
||||
|
||||
@if(!$meetupEvent->id && $meetupEvent->start)
|
||||
<x-input.group :for="md5('recurringid')" :label="__('Recurring appointment / monthly')">
|
||||
<x-toggle lg :label="__('Recurring appointment')" wire:model="recurring"/>
|
||||
<p class="text-xs text-amber-400 py-2">{{ __('The recurring appointments are created in the database as new entries. Please be careful with this function, otherwise you will have to change or delete all the appointments you have created manually if you make an error.') }}</p>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
@if($recurring)
|
||||
<x-input.group :for="md5('repetitions')" :label="__('Number of repetitions')">
|
||||
<x-input type="number" autocomplete="off" wire:model.debounce="repetitions"
|
||||
:placeholder="__('Number of repetitions')"/>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.location')" :label="__('Location')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetupEvent.location"
|
||||
:placeholder="__('Location')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.description')" :label="__('Description')">
|
||||
<x-textarea autocomplete="off" wire:model.debounce="meetupEvent.description"
|
||||
:placeholder="__('Description')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.link')" :label="__('Link')">
|
||||
<x-input type="url" autocomplete="off" wire:model.debounce="meetupEvent.link"
|
||||
:placeholder="__('Link')"
|
||||
:hint="__('For example, a link to a location on Google Maps or a link to a website. (not your Telegram group link)')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('grid')" :label="__('Recurring appointments')">
|
||||
@if($recurring && count($series) === $repetitions)
|
||||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-2">
|
||||
@for($i = 0; $i < $repetitions; $i++)
|
||||
<x-datetime-picker
|
||||
:label="\App\Support\Carbon::parse($series[$i]['start'])->asDayNameAndMonthName()"
|
||||
:clearable="false"
|
||||
time-format="24"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="series.{{ $i }}.start"
|
||||
display-format="DD-MM-YYYY HH:mm"
|
||||
:placeholder="__('Start')"/>
|
||||
@endfor
|
||||
</div>
|
||||
@endif
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.link')" :label="__('Action')">
|
||||
<x-button primary wire:click="submit">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,137 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Meetup') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('image')" :label="__('Main picture')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($meetup->getFirstMediaUrl('logo'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $meetup->getFirstMediaUrl('logo') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.name')" :label="__('Name')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetup.name"
|
||||
:placeholder="__('Name')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.community')" :label="__('Community')">
|
||||
<x-select
|
||||
:options="['einundzwanzig', 'bitcoin', 'satoshis_coffeeshop']"
|
||||
:clearable="false"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="meetup.community"
|
||||
:placeholder="__('Community')"
|
||||
:hint="__('This is the community that the meetup belongs to. If a community is not listed, please contact the administrator.')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('city_id')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('City/Area') }}
|
||||
</div>
|
||||
<x-button xs :href="route('city.form')">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('New City') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
:clearable="false"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="meetup.city_id"
|
||||
:placeholder="__('City/Area')"
|
||||
:async-data="[
|
||||
'api' => route('api.cities.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
option-description="country.name"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.intro')" :label="__('Intro')">
|
||||
<x-textarea autocomplete="off" wire:model.debounce="meetup.intro"
|
||||
:placeholder="__('Intro')"
|
||||
:hint="__('This is the introduction text that is shown on the landing page.')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.nostr')" :label="__('Nostr public key')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetup.nostr"
|
||||
:placeholder="__('Nostr public key')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.simplex')" :label="__('Simplex')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetup.simplex"
|
||||
:placeholder="__('Simplex')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.matrix_group')" :label="__('Matrix Group')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetup.matrix_group"
|
||||
:placeholder="__('Matrix Group')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.telegram_link')" :label="__('Telegram-Link')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetup.telegram_link"
|
||||
:placeholder="__('Telegram-Link')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.webpage')" :label="__('Website')">
|
||||
<x-input type="url" autocomplete="off" wire:model.debounce="meetup.webpage"
|
||||
:placeholder="__('Link')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.twitter_username')" :label="__('Twitter Username')">
|
||||
<x-input autocomplete="off" wire:model.debounce="meetup.twitter_username"
|
||||
:placeholder="__('Twitter Username')"
|
||||
:hint="__('Without @')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetup.link')" :label="__('Action')">
|
||||
<x-button primary wire:click="submit">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,332 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
<livewire:frontend.header :country="null"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12 mt-2">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4 flex flex-col sm:flex-row">
|
||||
|
||||
<div class="relative py-4 sm:py-4">
|
||||
<div class="lg:mx-auto lg:grid lg:max-w-7xl lg:grid-cols-2 lg:items-start lg:gap-24 lg:px-8">
|
||||
<div class="relative sm:py-4 lg:py-0">
|
||||
<div class="relative mx-auto max-w-md px-6 sm:max-w-3xl lg:max-w-none lg:px-0 lg:py-12">
|
||||
<!-- Testimonial card-->
|
||||
<div class="relative overflow-hidden rounded-2xl pt-64 pb-10l">
|
||||
<img class="absolute inset-0 h-full w-full object-contain"
|
||||
src="{{ $meetup->getFirstMediaUrl('logo', 'preview') }}"
|
||||
alt="">
|
||||
</div>
|
||||
</div>
|
||||
<blockquote class="mt-8">
|
||||
<div class="relative text-lg font-medium text-gray-200 md:flex-grow">
|
||||
<p class="relative">{{ $meetup->intro }}</p>
|
||||
</div>
|
||||
</blockquote>
|
||||
|
||||
<x-button black target="_blank" class="my-6"
|
||||
:href="route('export.meetupEvent', ['meetupEvent' => $meetupEvent])">
|
||||
<i class="fa-thin fa-file-excel"></i>
|
||||
{{ __('Download') }}
|
||||
</x-button>
|
||||
|
||||
<div class="border-b border-gray-200 pb-5">
|
||||
<h3 class="text-base font-semibold leading-6 text-gray-200">{{ __('Confirmations') }}</h3>
|
||||
</div>
|
||||
<ul role="list" class="divide-y divide-gray-200">
|
||||
|
||||
@foreach($attendees as $a)
|
||||
<li class="flex py-4">
|
||||
<img class="h-10 w-10 rounded-full"
|
||||
src="{{ $a['user']['profile_photo_url'] ?? 'https://ui-avatars.com/api/?name='.urlencode($a['name']).'&color=7F9CF5&background=EBF4FF' }}"
|
||||
alt="{{ $a['name'] }}">
|
||||
<div class="ml-3">
|
||||
<p class="text-sm font-medium text-gray-200">{{ $a['name'] }}</p>
|
||||
<p class="text-sm text-green-300">{{ __('Participation confirmed') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
|
||||
<div class="border-b border-gray-200 pb-5 mt-6">
|
||||
<h3 class="text-base font-semibold leading-6 text-gray-200">{{ __('Perhaps') }}</h3>
|
||||
</div>
|
||||
<ul role="list" class="divide-y divide-gray-200">
|
||||
|
||||
@foreach($mightAttendees as $a)
|
||||
<li class="flex py-4">
|
||||
<img class="h-10 w-10 rounded-full"
|
||||
src="{{ $a['user']['profile_photo_url'] ?? 'https://ui-avatars.com/api/?name='.urlencode($a['name']).'&color=7F9CF5&background=EBF4FF' }}"
|
||||
alt="{{ $a['name'] }}">
|
||||
<div class="ml-3">
|
||||
<p class="text-sm font-medium text-gray-200">{{ $a['name'] }}</p>
|
||||
<p class="text-sm text-yellow-300">{{ __('Perhaps') }}</p>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="relative mx-auto max-w-md px-6 sm:max-w-3xl lg:px-0">
|
||||
<!-- Content area -->
|
||||
<div class="pt-12 sm:pt-16 lg:pt-20">
|
||||
<h2 class="text-3xl font-bold tracking-tight text-gray-200 sm:text-4xl">{{ $meetup->name }}</h2>
|
||||
<div class="mt-6 space-y-6 text-gray-100">
|
||||
<p class="font-bold text-xl">
|
||||
{{ __('When') }}: {{ $meetupEvent->start->asDateTime() }}
|
||||
</p>
|
||||
<p class="font-bold text-xl">
|
||||
{{ __('Where') }}: {{ $meetupEvent->location }}
|
||||
</p>
|
||||
<div class="prose prose-invert leading-normal">
|
||||
<x-markdown>
|
||||
{!! $meetupEvent->description !!}
|
||||
</x-markdown>
|
||||
</div>
|
||||
<div>
|
||||
@if($meetupEvent->link)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetupEvent->link"
|
||||
primary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Event-Link') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-6 space-y-6 text-gray-100 flex flex-col space-y-2">
|
||||
<div>
|
||||
@if($meetup->telegram_link)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->telegram_link"
|
||||
secondary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Telegram-Link') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if($meetup->webpage)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->webpage"
|
||||
secondary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Website') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if($meetup->simplex)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->simplex"
|
||||
secondary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('SimpleX') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if($meetup->matrix_group)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->matrix_group"
|
||||
secondary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-people-group mr-2"></i>
|
||||
{{ __('Matrix-Group') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if($meetup->twitter_username)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="'https://twitter.com/'.$meetup->twitter_username"
|
||||
secondary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Twitter') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Stats section -->
|
||||
<div class="mt-10">
|
||||
<dl class="grid grid-cols-2 gap-x-4 gap-y-8">
|
||||
|
||||
<div class="border-t-2 border-gray-100 pt-6">
|
||||
<dt class="text-base font-medium text-gray-200">{{ __('Confirmations') }}</dt>
|
||||
<dd class="text-3xl font-bold tracking-tight text-gray-300">{{ count($meetupEvent->attendees ?? []) }}</dd>
|
||||
</div>
|
||||
|
||||
<div class="border-t-2 border-gray-100 pt-6">
|
||||
<dt class="text-base font-medium text-gray-200">{{ __('Perhaps') }}</dt>
|
||||
<dd class="text-3xl font-bold tracking-tight text-gray-300">{{ count($meetupEvent->might_attendees ?? []) }}</dd>
|
||||
</div>
|
||||
|
||||
</dl>
|
||||
|
||||
<div class="mt-6">
|
||||
<x-input
|
||||
wire:model.debounce="name"
|
||||
label="{{ __('Name') }}"
|
||||
hint="{{ __('Your unique name so that we can count the number of participants correctly (does not necessarily have to be your real name)') }}"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mt-10 flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
@if(!$willShowUp && !$perhapsShowUp)
|
||||
<div x-data="{}">
|
||||
<x-button
|
||||
lg primary
|
||||
x-on:click="$wireui.confirmDialog({
|
||||
id: 'attend-event',
|
||||
icon: 'question',
|
||||
accept: {label: '{{ __('Yes') }}',
|
||||
execute: () => $wire.attend()},
|
||||
reject: {label: '{{ __('No, cancel') }}',
|
||||
execute: () => window.$wireui.notify({'title': '{{ __('You have not confirmed your participation.') }}','icon': 'warning'})}
|
||||
})"
|
||||
>
|
||||
<i class="fa fa-thin fa-check mr-2"></i>
|
||||
{{ __('I will show up') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@else
|
||||
<div x-data="{}">
|
||||
<x-button
|
||||
x-on:click="$wireui.confirmDialog({
|
||||
icon: 'question',
|
||||
title: '{{ __('Are you sure you want to cancel your participation?') }}',
|
||||
accept: {label: '{{ __('Yes') }}',
|
||||
execute: () => $wire.cannotCome()},
|
||||
reject: {label: '{{ __('No, cancel') }}',
|
||||
}})"
|
||||
lg primary>
|
||||
<i class="fa fa-thin fa-face-frown mr-2"></i>
|
||||
{{ __('Unfortunately I cannot come') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if(!$perhapsShowUp && !$willShowUp)
|
||||
<div x-data="{}">
|
||||
<x-button
|
||||
x-on:click="$wireui.confirmDialog({
|
||||
id: 'attend-event',
|
||||
icon: 'question',
|
||||
accept: {label: '{{ __('Yes') }}',
|
||||
execute: () => $wire.mightAttend()},
|
||||
reject: {label: '{{ __('No, cancel') }}',
|
||||
execute: () => window.$wireui.notify({'title': '{{ __('You have not confirmed your participation.') }}','icon': 'warning'})}})"
|
||||
lg>
|
||||
<i class="fa fa-thin fa-question mr-2"></i>
|
||||
{{ __('Might attend') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mt-6">
|
||||
@auth
|
||||
@else
|
||||
<div class="rounded-md bg-red-50 p-4">
|
||||
<div class="flex">
|
||||
<div class="flex-shrink-0">
|
||||
<!-- Heroicon name: mini/x-circle -->
|
||||
<svg class="h-5 w-5 text-red-400" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<h3 class="text-sm font-medium text-red-800">
|
||||
{{ __('Remember that you are currently not logged in.') }}
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-red-700">
|
||||
<ul role="list" class="list-disc space-y-1 pl-5">
|
||||
<li>{{ __('Your participation will only be saved for one week in the current browser session.') }}</li>
|
||||
<li>{{ __('You cannot withdraw your participation after one week.') }}</li>
|
||||
<li>{{ __('Log in so that you can edit your participation at any time.') }}</li>
|
||||
</ul>
|
||||
<div class="w-full flex justify-end">
|
||||
<x-button xs secondary :href="route('auth.login')">
|
||||
<i class="fa fa-thin fa-sign-in"></i>
|
||||
{{ __('Login') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endauth
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
@push('modals')
|
||||
<x-dialog id="attend-event" title="{{ __('Confirmation') }}"
|
||||
description="{{ __('You confirm your participation.') }}">
|
||||
@auth
|
||||
@else
|
||||
<div class="rounded-md bg-transparent p-4">
|
||||
<div class="flex">
|
||||
<div class="flex-shrink-0">
|
||||
<!-- Heroicon name: mini/x-circle -->
|
||||
<svg class="h-5 w-5 text-red-400" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<h3 class="text-sm font-medium text-red-500">
|
||||
{{ __('Remember that you are currently not logged in.') }}
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-red-700">
|
||||
<ul role="list" class="list-disc space-y-1 pl-5">
|
||||
<li>{{ __('Your participation will only be saved for one week in the current browser session.') }}</li>
|
||||
<li>{{ __('You cannot withdraw your participation after one week.') }}</li>
|
||||
<li>{{ __('Log in so that you can edit your participation at any time.') }}</li>
|
||||
</ul>
|
||||
<div class="w-full flex justify-end">
|
||||
<x-button xs secondary :href="route('auth.login')">
|
||||
<i class="fa fa-thin fa-sign-in"></i>
|
||||
{{ __('Login') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endauth
|
||||
</x-dialog>
|
||||
@endpush
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_{{ str($meetupEvent->meetup->slug)->replace('-', '_') }}"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,224 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
<livewire:frontend.header :country="null"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12 mt-8">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4 flex flex-col sm:flex-row">
|
||||
<div class="flex flex-col sm:flex-row">
|
||||
<div class="sm:w-10/12 flex flex-col">
|
||||
<h1 class="mb-6 text-5xl font-extrabold leading-none tracking-normal text-gray-200 sm:text-6xl md:text-6xl lg:text-7xl md:tracking-tight">
|
||||
<span
|
||||
class="text-transparent bg-clip-text bg-gradient-to-r from-amber-400 via-amber-500 to-amber-200">{{ $meetup->name }}</span><br
|
||||
class="lg:block hidden">
|
||||
{{ __('Plebs together strong 💪') }}
|
||||
</h1>
|
||||
<div class="px-0 mb-6 text-lg text-gray-200 md:text-xl">
|
||||
<x-markdown>
|
||||
{!! $meetup->intro !!}
|
||||
</x-markdown>
|
||||
</div>
|
||||
|
||||
@if($meetup->telegram_link)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->telegram_link"
|
||||
primary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Telegram-Link') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@if($meetup->simplex)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->simplex"
|
||||
primary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('SimpleX-Link') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@if($meetup->webpage)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->webpage"
|
||||
primary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Website') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@if($meetup->matrix_group)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="$meetup->matrix_group"
|
||||
primary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-people-group mr-2"></i>
|
||||
{{ __('Matrix-Group') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@if($meetup->twitter_username)
|
||||
<x-button
|
||||
target="_blank"
|
||||
:href="'https://twitter.com/'.$meetup->twitter_username"
|
||||
primary lg class="mt-4 whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-external-link mr-2"></i>
|
||||
{{ __('Twitter') }}
|
||||
</x-button>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
<div class="sm:w-2/12 p-4">
|
||||
<img class="max-h-64" src="{{ $meetup->getFirstMediaUrl('logo') }}" alt="Logo">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4">
|
||||
|
||||
<section class="h-auto px-10 py-16">
|
||||
<div class="max-w-3xl mx-auto space-y-4 sm:text-center">
|
||||
<h2 class="text-4xl sm:text-5xl font-semibold text-white">
|
||||
{{ __('Events') }}
|
||||
</h2>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<ul role="list" class="grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4">
|
||||
@foreach($meetupEvents as $meetupEvent)
|
||||
@php
|
||||
$activeClass = $activeEvent === $meetupEvent->id ? 'bg-gradient-to-r from-amber-800 via-amber-600 to-amber-500' : 'bg-amber-500';
|
||||
@endphp
|
||||
<li id="meetupEventId_{{ $meetupEvent->id }}" class="{{ $activeClass }} col-span-1 flex flex-col divide-y divide-gray-200 rounded-lg text-center shadow-2xl">
|
||||
<div class="flex flex-1 flex-col p-8">
|
||||
{{--<img class="mx-auto h-32 w-32 object-contain flex-shrink-0 rounded"
|
||||
src="{{ $meetupEvent->meetup->getFirstMediaUrl('logo') }}"
|
||||
alt="{{ $meetupEvent->meetup->name }}">--}}
|
||||
<h3 class="mt-1 text-xl font-medium text-gray-900">{{ $meetupEvent->start->asDateTime() }}</h3>
|
||||
<h3 class="mt-1 text-xl font-medium text-gray-900">{{ $meetupEvent->location }}</h3>
|
||||
<dl class="mt-1 flex flex-grow flex-col justify-between">
|
||||
<div x-data="{ active: 2 }" class="mx-auto max-w-3xl w-full space-y-4">
|
||||
<div x-data="{
|
||||
id: 1,
|
||||
get expanded() {
|
||||
return this.active === this.id
|
||||
},
|
||||
set expanded(value) {
|
||||
this.active = value ? this.id : null
|
||||
},
|
||||
}"
|
||||
role="region" class="rounded-lg bg-white shadow">
|
||||
<h2>
|
||||
<button
|
||||
x-on:click="expanded = !expanded"
|
||||
:aria-expanded="expanded"
|
||||
class="flex w-full items-center justify-between px-6 py-4 text-xl font-bold"
|
||||
>
|
||||
<span>{{ __('Description') }}</span>
|
||||
<span x-show="expanded" aria-hidden="true" class="ml-4">−</span>
|
||||
<span x-show="!expanded" aria-hidden="true" class="ml-4">+</span>
|
||||
</button>
|
||||
</h2>
|
||||
<div x-show="expanded" x-collapse>
|
||||
<div class="px-6 pb-4 text-left">{!! nl2br($meetupEvent->description) !!}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
<div>
|
||||
<div class="-mt-px flex divide-x divide-gray-200">
|
||||
<div class="-ml-px flex w-0 flex-1">
|
||||
<a target="_blank" href="{{ route('meetup.event.landing', ['country' => $country, 'meetupEvent' => $meetupEvent]) }}"
|
||||
class="relative inline-flex w-0 flex-1 items-center justify-center rounded-br-lg border border-transparent py-4 text-sm font-medium text-gray-700 hover:text-gray-500">
|
||||
<i class="text-gray-100 text-2xl fa-thin fa-right-to-bracket"></i>
|
||||
<span class="ml-3 text-gray-100 text-2xl">{{ __('Link to participate') }}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<div class="w-full mt-8">
|
||||
|
||||
@php
|
||||
$locale = \Illuminate\Support\Facades\Cookie::get('lang', 'de');
|
||||
@endphp
|
||||
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ asset('dist/js-year-calendar.min.css') }}"/>
|
||||
<script src="{{ asset('dist/js-year-calendar.min.js') }}"></script>
|
||||
<script src="{{ asset('dist/locales/js-year-calendar.'.$locale.'.js') }}"></script>
|
||||
|
||||
<style>
|
||||
.calendar .calendar-header {
|
||||
background-color: #F7931A;
|
||||
color: white;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.calendar table.month th.month-title {
|
||||
color: #F7931A;
|
||||
}
|
||||
|
||||
.calendar table.month th.day-header {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar table.month td.day .day-content {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar .calendar-header table th:hover {
|
||||
background: #222;
|
||||
}
|
||||
</style>
|
||||
<div
|
||||
wire:ignore
|
||||
x-data="{
|
||||
calendar: null,
|
||||
init() {
|
||||
let events = {{ Js::from($events) }};
|
||||
events = events.map(function(e){
|
||||
return {id: e.id, startDate: new Date(e.startDate), endDate: new Date(e.endDate), location: e.location, description: e.description}
|
||||
})
|
||||
|
||||
new Calendar(this.$refs.calendar, {
|
||||
style: 'background',
|
||||
language: '{{ $locale }}',
|
||||
startYear: {{ date('Y') }},
|
||||
dataSource: events,
|
||||
yearChanged: function(e) {
|
||||
@this.set('year', e.currentYear);
|
||||
},
|
||||
clickDay: function(e) {
|
||||
if(e.events.length > 0) {
|
||||
$wire.call('showEvent', e.events[0].id);
|
||||
document.getElementById('meetupEventId_'+e.events[0].id).scrollIntoView();
|
||||
}
|
||||
},
|
||||
});
|
||||
},
|
||||
}"
|
||||
>
|
||||
<div x-ref="calendar"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_{{ str($meetup->slug)->replace('-', '_') }}"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,189 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div>
|
||||
<div class="w-full flex justify-end my-2">
|
||||
<div class="flex flex-col space-y-2">
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ route('meetup.ics', ['country' => $country]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Calendar Stream Url copied!') }}',description:'{{ __('Paste the calendar stream link into a compatible calendar app.') }}',icon:'success'});"
|
||||
amber>
|
||||
<i class="fa fa-thin fa-calendar-arrow-down mr-2"></i>
|
||||
{{ __('Calendar Stream-Url for all meetup events') }}
|
||||
</x-button>
|
||||
@if(auth()->check() && auth()->user()->meetups->count() > 0)
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ route('meetup.ics', ['country' => $country, 'my' => auth()->user()->meetups->pluck('id')->toArray()]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Calendar Stream Url copied!') }}',description:'{{ __('Paste the calendar stream link into a compatible calendar app.') }}',icon:'success'});"
|
||||
black>
|
||||
<i class="fa fa-thin fa-calendar-heart mr-2"></i>
|
||||
{{ __('Calendar Stream-Url for my meetups only') }}
|
||||
</x-button>
|
||||
@endif
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ $mapEmbedCode }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Embed code for the map copied!') }}',icon:'success'});"
|
||||
amber>
|
||||
<i class="fa fa-thin fa-code mr-2"></i>
|
||||
{{ __('Copy embed code for the map') }} <img class="h-6 rounded"
|
||||
src="{{ asset('vendor/blade-country-flags/4x3-'. $country->code .'.svg') }}"
|
||||
alt="{{ $country->code }}">
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start">
|
||||
<div class="w-full sm:w-1/2">
|
||||
|
||||
@php
|
||||
$locale = \Illuminate\Support\Facades\Cookie::get('lang', 'de');
|
||||
@endphp
|
||||
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ asset('dist/js-year-calendar.min.css') }}"/>
|
||||
<script src="{{ asset('dist/js-year-calendar.min.js') }}"></script>
|
||||
<script src="{{ asset('dist/locales/js-year-calendar.'.$locale.'.js') }}"></script>
|
||||
|
||||
<style>
|
||||
.calendar {
|
||||
max-height: 280px;
|
||||
}
|
||||
|
||||
.calendar .calendar-header {
|
||||
background-color: #F7931A;
|
||||
color: white;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.calendar table.month th.month-title {
|
||||
color: #F7931A;
|
||||
}
|
||||
|
||||
.calendar table.month th.day-header {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar table.month td.day .day-content {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar .calendar-header table th:hover {
|
||||
background: #222;
|
||||
}
|
||||
</style>
|
||||
<div
|
||||
wire:ignore
|
||||
x-data="{
|
||||
calendar: null,
|
||||
init() {
|
||||
let events = {{ Js::from($events) }};
|
||||
events = events.map(function(e){
|
||||
return {id: e.id, startDate: new Date(e.startDate), endDate: new Date(e.endDate), location: e.location, description: e.description}
|
||||
})
|
||||
|
||||
new Calendar(this.$refs.calendar, {
|
||||
style: 'background',
|
||||
language: '{{ $locale }}',
|
||||
startYear: {{ $year }},
|
||||
dataSource: events,
|
||||
yearChanged: function(e) {
|
||||
@this.set('year', e.currentYear);
|
||||
},
|
||||
clickDay: function(e) {
|
||||
if(e.events.length > 0) {
|
||||
var content = '';
|
||||
var ids = [];
|
||||
|
||||
for(var i in e.events) {
|
||||
ids.push(e.events[i].id);
|
||||
content += '<div class=\'event-tooltip-content\'>'
|
||||
+ '<div class=\'event-name\'>' + e.events[i].location + '</div>'
|
||||
+ '<div class=\'event-location\'>' + e.events[i].description + '</div>'
|
||||
+ '</div>';
|
||||
}
|
||||
console.log(content);
|
||||
|
||||
$wire.call('popover', content, ids.join(','));
|
||||
}
|
||||
},
|
||||
});
|
||||
},
|
||||
}"
|
||||
>
|
||||
<div x-ref="calendar"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden sm:inline sm:w-1/2 max-h-[300px]">
|
||||
@php
|
||||
$focus = '';
|
||||
$map = $country->code . '_merc';
|
||||
if (!\File::exists(public_path('vendor/jvector/maps/' . $country->code . '.js'))) {
|
||||
$map = 'europe_merc';
|
||||
$focus = 'focusOn: {lat:'.$country->latitude.',lng:'.$country->longitude.',scale:8,animate:true},';
|
||||
}
|
||||
@endphp
|
||||
<div
|
||||
wire:ignore
|
||||
class="w-full flex justify-center"
|
||||
x-data="{
|
||||
init() {
|
||||
let markers = {{ Js::from($markers) }};
|
||||
|
||||
$('#map').vectorMap({
|
||||
{{ $focus }}
|
||||
zoomButtons : true,
|
||||
zoomOnScroll: true,
|
||||
height: 300,
|
||||
map: '{{ $map }}',
|
||||
backgroundColor: 'transparent',
|
||||
markers: markers.map(function(h){ return {name: h.name, latLng: h.coords} }),
|
||||
onMarkerClick: function(event, index) {
|
||||
$wire.call('filterByMarker', markers[index].id)
|
||||
},
|
||||
markerStyle: {
|
||||
initial: {
|
||||
image: '{{ asset('img/btc.png') }}',
|
||||
}
|
||||
},
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#a4a4a4'
|
||||
},
|
||||
hover: {
|
||||
'fill-opacity': 1,
|
||||
cursor: 'default'
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div id="map" style="width: 100%; height: 300px" class="bg-gray-900"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Meetup dates') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.meetup-event-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,108 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4 py-4">
|
||||
<div class="w-full flex justify-end">
|
||||
<div class="flex flex-col space-y-2">
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ route('meetup.ics', ['country' => $country]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Calendar Stream Url copied!') }}',description:'{{ __('Paste the calendar stream link into a compatible calendar app.') }}',icon:'success'});"
|
||||
amber>
|
||||
<i class="fa fa-thin fa-calendar-arrow-down mr-2"></i>
|
||||
{{ __('Calendar Stream-Url for all meetup events') }}
|
||||
</x-button>
|
||||
@if(auth()->check() && auth()->user()->meetups->count() > 0)
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ route('meetup.ics', ['country' => $country, 'my' => auth()->user()->meetups->pluck('id')->toArray()]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Calendar Stream Url copied!') }}',description:'{{ __('Paste the calendar stream link into a compatible calendar app.') }}',icon:'success'});"
|
||||
black>
|
||||
<i class="fa fa-thin fa-calendar-heart mr-2"></i>
|
||||
{{ __('Calendar Stream-Url for my meetups only') }}
|
||||
</x-button>
|
||||
@endif
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ $mapEmbedCode }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Embed code for the map copied!') }}',icon:'success'});"
|
||||
amber>
|
||||
<i class="fa fa-thin fa-code mr-2"></i>
|
||||
{{ __('Copy embed code for the map') }} <img class="h-6 rounded"
|
||||
src="{{ asset('vendor/blade-country-flags/4x3-'. $country->code .'.svg') }}"
|
||||
alt="{{ $country->code }}">
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col sm:flex-row">
|
||||
@php
|
||||
$focus = '';
|
||||
$map = $country->code . '_merc';
|
||||
if (!\File::exists(public_path('vendor/jvector/maps/' . $country->code . '.js'))) {
|
||||
$map = 'europe_merc';
|
||||
$focus = 'focusOn: {lat:'.$country->latitude.',lng:'.$country->longitude.',scale:8,animate:true},';
|
||||
} elseif ($country->code === 'mx') {
|
||||
$focus = 'focusOn: {lat:'.$country->latitude.',lng:'.$country->longitude.',scale:8,animate:true},';
|
||||
}
|
||||
@endphp
|
||||
<div
|
||||
wire:ignore
|
||||
class="w-full flex justify-center"
|
||||
x-data="{
|
||||
init() {
|
||||
let markers = {{ Js::from($markers) }};
|
||||
|
||||
$('#map').vectorMap({
|
||||
{{ $focus }}
|
||||
zoomButtons : true,
|
||||
zoomOnScroll: true,
|
||||
map: '{{ $map }}',
|
||||
backgroundColor: 'transparent',
|
||||
markers: markers.map(function(h){ return {name: h.name, latLng: h.coords} }),
|
||||
onMarkerClick: function(event, index) {
|
||||
$wire.call('filterByMarker', markers[index].id)
|
||||
},
|
||||
markerStyle: {
|
||||
initial: {
|
||||
image: '{{ asset('img/btc.png') }}',
|
||||
}
|
||||
},
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#a4a4a4'
|
||||
},
|
||||
hover: {
|
||||
'fill-opacity': 1,
|
||||
cursor: 'default'
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div id="map" style="width: 100%;" class="h-[200px] sm:h-[400px] my-4 sm:my-0 bg-gray-900"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Meetups') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.meetup-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,446 +0,0 @@
|
||||
<div>
|
||||
<div class="w-full p-0 lg:p-6" wire:loading.class="opacity-50 pointer-events-none cursor-not-allowed">
|
||||
<div class="flex max-w-none flex-col space-y-4 text-black">
|
||||
|
||||
{{-- SEARCH PANEL --}}
|
||||
<div class="rounded-lg bg-white shadow dark:bg-gray-800">
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2">
|
||||
<div class="px-4 py-5 lg:p-6">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900 dark:text-gray-100">
|
||||
{{ $meetup->name }}
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-gray-500">
|
||||
|
||||
<form wire:submit.prevent="submit" class="space-y-2">
|
||||
@if (!$model?->simplified_geojson || !$selectedItemOSMPolygons)
|
||||
<div class="flex flex-col space-y-2 lg:flex-row lg:space-y-0 lg:space-x-2">
|
||||
<div>
|
||||
<x-input wire:model.defer="search"/>
|
||||
</div>
|
||||
<div>
|
||||
<x-button type="submit" class='w-full font-semibold'>Search</x-button>
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div class="flex flex-col space-y-2">
|
||||
<a href="{{ route('osm.meetups') }}">
|
||||
<x-badge gray class="whitespace-nowrap dark:bg-gray-200 dark:text-black">
|
||||
Back
|
||||
</x-badge>
|
||||
</a>
|
||||
<div class="overflow-hidden rounded-lg bg-white shadow dark:bg-gray-900">
|
||||
<div class="px-2 py-2 sm:px-4 sm:py-5 sm:px-6">
|
||||
<h3
|
||||
class="text-lg font-medium leading-6 text-gray-900 dark:text-gray-200">
|
||||
{{ $selectedItemOSMPolygons['display_name'] }}
|
||||
</h3>
|
||||
<p class="mt-1 max-w-2xl text-sm text-gray-500 dark:text-gray-300">
|
||||
|
||||
</p>
|
||||
</div>
|
||||
<div class="border-t border-gray-200 px-2 py-2 sm:p-0 sm:px-4 sm:py-5">
|
||||
<dl class="sm:divide-y sm:divide-gray-200">
|
||||
<div class="space-y-1 py-2 sm:py-4 sm:py-5">
|
||||
<dt
|
||||
class="text-sm font-medium text-gray-500 dark:text-gray-300">
|
||||
<x-badge
|
||||
blue>{{ $selectedItemOSMPolygons['type'] }}</x-badge>
|
||||
</dt>
|
||||
<dd class="text-sm text-gray-900 dark:text-gray-300">
|
||||
OSM ID: {{ $selectedItemOSMPolygons['osm_id'] }}
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
<div class="overflow-hidden rounded-lg bg-white shadow dark:bg-gray-900">
|
||||
<div class="px-2 py-2 sm:px-4 sm:py-5 sm:px-6">
|
||||
<div class="mt-1 max-w-2xl text-sm text-gray-500 dark:text-gray-300">
|
||||
<x-toggle red lg
|
||||
label="Fetch water boundaries from https://osm-boundaries.com"
|
||||
wire:model="OSMBoundaries"/>
|
||||
</div>
|
||||
<div x-data="{
|
||||
show: @entangle('polygonsOSMfr')
|
||||
}"
|
||||
class="mt-2 max-w-2xl text-sm text-gray-500 dark:text-gray-300">
|
||||
<x-toggle red lg
|
||||
label="Fetch polygons from https://polygons.openstreetmap.fr"
|
||||
wire:model="polygonsOSMfr"/>
|
||||
<div class="mt-2 flex flex-row items-end space-x-2" x-show="show">
|
||||
<x-input max="1" label="X"
|
||||
wire:model.defer="polygonsOSMfrX"/>
|
||||
<x-input max="1" label="Y"
|
||||
wire:model.defer="polygonsOSMfrY"/>
|
||||
<x-input max="1" label="Z"
|
||||
wire:model.defer="polygonsOSMfrZ"/>
|
||||
</div>
|
||||
<div class="mt-4 font-mono text-sm" x-show="show">
|
||||
<p>
|
||||
X, Y, Z are parameters for the following PostGIS equation.
|
||||
The default values are chosen according to the size of the
|
||||
original geometry to give a slighty bigger geometry, without
|
||||
too many nodes.
|
||||
|
||||
</p>
|
||||
<p class="mt-4">Note that:</p>
|
||||
<p>
|
||||
X > 0 will give a polygon bigger than the original geometry,
|
||||
and guaranteed to contain it.
|
||||
</p>
|
||||
<p>
|
||||
X = 0 will give a polygon similar to the original geometry.
|
||||
</p>
|
||||
<p>
|
||||
X < 0 will give a polygon smaller than the original
|
||||
geometry, and guaranteed to be smaller. </p>
|
||||
</div>
|
||||
<div x-show="show" class="mt-2 font-semibold">
|
||||
<x-button emerald label="Submit and load polygons"
|
||||
wire:click="submitPolygonsOSM"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<div>
|
||||
@if (!$model?->simplified_geojson && $search)
|
||||
<x-badge lg positive class="xl:whitespace-nowrap">
|
||||
Now select the appropriate place so that a GeoJSON can be built.
|
||||
</x-badge>
|
||||
@endif
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="overflow-y-auto px-4 py-5 lg:p-6">
|
||||
@if ($search)
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-900 dark:text-gray-100">
|
||||
Search: {{ $search }}
|
||||
</h3>
|
||||
@endif
|
||||
<div class="mt-2 text-sm text-gray-500">
|
||||
|
||||
<div class="flex max-h-[400px] flex-col space-y-4">
|
||||
<div class="mt-6 flow-root">
|
||||
<ul role="list" class="-my-5 divide-y divide-gray-200">
|
||||
|
||||
@foreach ($osmSearchResults as $item)
|
||||
@php
|
||||
$currentClass = $item['osm_id'] === $osm_id ? 'bg-amber-400 dark:bg-amber-900' : '';
|
||||
@endphp
|
||||
|
||||
<li class="{{ $currentClass }} cursor-pointer py-4 px-2 hover:bg-amber-400 dark:hover:bg-amber-800"
|
||||
wire:key="osmItem_{{ $loop->index }}"
|
||||
wire:click="selectItem({{ $loop->index }})">
|
||||
<div class="flex items-center space-x-4">
|
||||
<div class="min-w-0 flex-1">
|
||||
<p
|
||||
class="truncate text-sm font-medium text-gray-900 dark:text-gray-200">
|
||||
{{ $item['display_name'] }}</p>
|
||||
<p class="truncate text-sm text-gray-500">
|
||||
<x-badge amber>
|
||||
{{ count($item['geojson']['coordinates'], COUNT_RECURSIVE) }}
|
||||
points
|
||||
</x-badge>
|
||||
</p>
|
||||
</div>
|
||||
<div>
|
||||
<x-badge blue>{{ $item['type'] }}</x-badge>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Wikipedia Links --}}
|
||||
<div class="flex flex-row items-center space-x-6">
|
||||
@if ($search)
|
||||
<div class='rounded-lg bg-white px-4 py-5 shadow dark:bg-gray-800 lg:p-6'>
|
||||
<h1 class='font-semibold dark:text-gray-100'>Wikipedia search <span
|
||||
class='text-sm text-gray-500 dark:text-gray-400'>(for population data)</span></h1>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<a target="_blank" class="text-amber-500 underline"
|
||||
href="https://en.wikipedia.org/wiki/{{ urlencode(str($search)->replace(' ', '_')->toString()) }}">Wikipedia
|
||||
EN:
|
||||
{{ $search }}</a>
|
||||
<a target="_blank" class="text-amber-500 underline"
|
||||
href="https://de.wikipedia.org/wiki/{{ urlencode(str($search)->replace(' ', '_')->toString()) }}">Wikipedia
|
||||
DE:
|
||||
{{ $search }}</a>
|
||||
<a target="_blank" class="text-amber-500 underline"
|
||||
href="https://fr.wikipedia.org/wiki/{{ urlencode(str($search)->replace(' ', '_')->toString()) }}">Wikipedia
|
||||
FR:
|
||||
{{ $search }}</a>
|
||||
<a target="_blank" class="text-amber-500 underline"
|
||||
href="https://es.wikipedia.org/wiki/{{ urlencode(str($search)->replace(' ', '_')->toString()) }}">Wikipedia
|
||||
ES:
|
||||
{{ $search }}</a>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<div class='rounded-lg bg-white px-4 py-5 shadow dark:bg-gray-800 lg:p-6'>
|
||||
<x-input wire:model.debounce="population" label="population"/>
|
||||
<x-input wire:model.debounce="population_date" label="population_date"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- GeoJSON simplification --}}
|
||||
@if ($model && $selectedItemOSMPolygons)
|
||||
<div class="rounded-lg bg-white shadow dark:bg-gray-800">
|
||||
<div class="px-4 py-5 lg:p-6">
|
||||
<div class="flex items-center space-x-4">
|
||||
<h3 class="text-lg font-medium leading-6 text-blue-500">
|
||||
Mapshaper simplification of <span class="text-[#FFA500]">OSM GeoJSON
|
||||
[{{ count($selectedItemOSMPolygons['geojson']['coordinates'], COUNT_RECURSIVE) }}
|
||||
points]</span> to
|
||||
{{ count($model->simplified_geojson['coordinates'] ?? [], COUNT_RECURSIVE) }} points
|
||||
</h3>
|
||||
</div>
|
||||
<div class="mt-2 text-sm text-gray-500 dark:text-gray-200">
|
||||
<div class="flex flex-col space-y-2">
|
||||
<h1 class="py-2">
|
||||
(smaller percentage means fewer points - aim for no more than 150)
|
||||
</h1>
|
||||
<div class="flex hidden space-x-2 overflow-auto lg:block">
|
||||
@php
|
||||
$btnClassLeft = 'relative inline-flex items-center rounded-l-md border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 dark:bg-gray-600 dark:hover:bg-blue-800 hover:bg-blue-400 focus:z-10 focus:border-blue-500 dark:focus:border-blue-700 focus:outline-none focus:ring-1 focus:ring-blue-500 dark:focus:ring-blue-700';
|
||||
$btnClassRight = 'relative -ml-px inline-flex items-center rounded-r-md border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 dark:bg-gray-600 dark:hover:bg-blue-800 hover:bg-blue-400 focus:z-10 focus:border-blue-500 dark:focus:border-blue-700 focus:outline-none focus:ring-1 focus:ring-blue-500 dark:focus:ring-blue-700';
|
||||
$btnClassCenter = 'relative -ml-px inline-flex items-center border border-gray-300 px-4 py-2 text-sm font-medium text-gray-700 dark:text-gray-200 dark:bg-gray-600 dark:hover:bg-blue-800 hover:bg-blue-400 focus:z-10 focus:border-blue-500 dark:focus:border-blue-700 focus:outline-none focus:ring-1 focus:ring-blue-500 dark:focus:ring-blue-700';
|
||||
$currentClass = 'bg-blue-500 dark:bg-blue-700 text-white dark:text-gray-900';
|
||||
@endphp
|
||||
<div class="isolate inline-flex rounded-md shadow-sm">
|
||||
@foreach ($percentages as $percentage)
|
||||
@php
|
||||
$btnClass = $loop->first ? $btnClassLeft : ($loop->last ? $btnClassRight : $btnClassCenter);
|
||||
@endphp
|
||||
<button wire:key="percentage_{{ $loop->index }}" type="button"
|
||||
wire:click="setPercentage({{ $percentage }})"
|
||||
class="{{ $btnClass }} {{ $currentPercentage === $percentage ? $currentClass : '' }}">
|
||||
{{ $percentage }}%
|
||||
</button>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
<div class="block lg:hidden">
|
||||
<x-native-select label="Select percentage" placeholder="Select percentage"
|
||||
:options="$percentages" wire:model="currentPercentage"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
{{-- GeoJSON data --}}
|
||||
<div>
|
||||
@if ($model?->simplified_geojson && $selectedItemOSMPolygons)
|
||||
<div class="rounded-lg bg-white shadow dark:bg-gray-800">
|
||||
<div class="grid grid-cols-1 gap-4 px-4 py-5 lg:grid-cols-2 lg:p-6">
|
||||
<div>
|
||||
@php
|
||||
$jsonEncodedSelectedItem = json_encode($selectedItemOSMPolygons['geojson'], JSON_THROW_ON_ERROR);
|
||||
@endphp
|
||||
<h3 class="text-lg font-medium leading-6 text-[#FFA500]">
|
||||
OSM GeoJSON
|
||||
[{{ count($selectedItemOSMPolygons['geojson']['coordinates'] ?? [], COUNT_RECURSIVE) }}
|
||||
points]
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-gray-500">
|
||||
<div class="flex w-full flex-col space-y-2">
|
||||
<pre
|
||||
class="overflow-x-auto py-3 text-[#FFA500]">{{ $jsonEncodedSelectedItem }}</pre>
|
||||
<div class='font-semibold'>
|
||||
<x-button x-data="{
|
||||
textToCopy: @entangle('selectedItemOSMPolygons.geojson')
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(JSON.stringify(textToCopy));window.$wireui.notify({title:'{{ __('Copied!') }}',icon:'success'});"
|
||||
lg amber>
|
||||
Copy to clipboard
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
@php
|
||||
$jsonEncodedSimplifiedGeoJson = json_encode($model->simplified_geojson, JSON_THROW_ON_ERROR);
|
||||
@endphp
|
||||
<h3 class="text-lg font-medium leading-6 text-blue-500">
|
||||
Simplified GeoJSON
|
||||
[{{ count($model->simplified_geojson['coordinates'] ?? [], COUNT_RECURSIVE) }}
|
||||
points]
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-gray-500">
|
||||
<div class="flex w-full flex-col space-y-2">
|
||||
<pre
|
||||
class="overflow-x-auto py-3 text-blue-500">{{ $jsonEncodedSimplifiedGeoJson }}</pre>
|
||||
<div class='font-semibold'>
|
||||
<x-button
|
||||
wire:click="saveSimplifiedGeoJson"
|
||||
lg blue>
|
||||
Save on model
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if ($selectedItemOSMBoundaries)
|
||||
<div>
|
||||
@php
|
||||
$jsonEncodedGeoJsonWater = json_encode($selectedItemOSMBoundaries, JSON_THROW_ON_ERROR);
|
||||
@endphp
|
||||
<h3 class="text-lg font-medium leading-6 text-[#FF0084]">
|
||||
https://osm-boundaries.com water GeoJSON
|
||||
[{{ count($selectedItemOSMBoundaries['coordinates'], COUNT_RECURSIVE) }}
|
||||
points]
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-gray-500">
|
||||
<div class="flex w-full flex-col space-y-2">
|
||||
<pre
|
||||
class="overflow-x-auto py-3 text-[#FF0084]">{{ $jsonEncodedGeoJsonWater }}</pre>
|
||||
<div class='font-semibold'>
|
||||
<x-button x-data="{
|
||||
textToCopy: @entangle('selectedItemOSMBoundaries')
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(JSON.stringify(textToCopy));window.$wireui.notify({title:'{{ __('Copied!') }}',icon:'success'});"
|
||||
lg pink>
|
||||
Copy to clipboard
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@if ($selectedItemPolygonsOSMfr)
|
||||
<div>
|
||||
@php
|
||||
$jsonEncodedGeoJsonOSMFr = json_encode($selectedItemPolygonsOSMfr, JSON_THROW_ON_ERROR);
|
||||
@endphp
|
||||
<h3 class="text-lg font-medium leading-6 text-emerald-500">
|
||||
https://polygons.openstreetmap.fr GeoJSON
|
||||
<span wire:key="ifNotGeometryCollection">
|
||||
@if ($selectedItemPolygonsOSMfr['type'] !== 'GeometryCollection')
|
||||
[{{ count($selectedItemPolygonsOSMfr['coordinates'] ?? [], COUNT_RECURSIVE) }}
|
||||
points]
|
||||
@endif
|
||||
</span>
|
||||
</h3>
|
||||
<div class="mt-2 text-sm text-gray-500">
|
||||
<div class="flex w-full flex-col space-y-2">
|
||||
<pre
|
||||
class="overflow-x-auto py-3 text-emerald-500">{{ $jsonEncodedGeoJsonOSMFr }}</pre>
|
||||
<div class='font-semibold'>
|
||||
<x-button x-data="{
|
||||
textToCopy: @entangle('selectedItemPolygonsOSMfr')
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(JSON.stringify(textToCopy));window.$wireui.notify({title:'{{ __('Copied!') }}',icon:'success'});"
|
||||
lg emerald>
|
||||
Copy to clipboard
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col space-y-4 px-4 py-5 lg:p-6">
|
||||
<div class="w-full">
|
||||
<div>
|
||||
<h1 class="font-bold dark:text-white">
|
||||
GeoJSON preview
|
||||
</h1>
|
||||
<div wire:ignore class="my-4" x-data="{
|
||||
geojson: @entangle('selectedItemOSMPolygons.geojson'),
|
||||
simplifiedGeojson: @entangle('model.simplified_geojson'),
|
||||
geojsonWater: @entangle('selectedItemOSMBoundaries'),
|
||||
geojsonOSMfr: @entangle('selectedItemPolygonsOSMfr'),
|
||||
init() {
|
||||
const map = L.map($refs.map)
|
||||
.setView([0, 0], 13);
|
||||
|
||||
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', { foo: 'bar', attribution: '© <a href=\'https://www.openstreetmap.org/copyright\'>OpenStreetMap</a> contributors' }).addTo(map);
|
||||
|
||||
const geojsonFeature = {
|
||||
'type': 'Feature',
|
||||
'geometry': this.geojson
|
||||
};
|
||||
const simplifiedGeojsonFeature = {
|
||||
'type': 'Feature',
|
||||
'geometry': this.simplifiedGeojson
|
||||
};
|
||||
L.geoJson(geojsonFeature, { style: { color: '#FFA500', fillColor: '#FFA500', fillOpacity: 0.3 } }).addTo(map);
|
||||
let simplifiedGeoJSON = L.geoJson(simplifiedGeojsonFeature, { style: { fillOpacity: 0.5 } }).addTo(map);
|
||||
map.fitBounds(simplifiedGeoJSON.getBounds(), { padding: [50, 50] });
|
||||
|
||||
$wire.on('geoJsonUpdated', () => {
|
||||
map.eachLayer((layer) => {
|
||||
layer.remove();
|
||||
});
|
||||
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png?{foo}', { foo: 'bar', attribution: '© <a href=\'https://www.openstreetmap.org/copyright\'>OpenStreetMap</a> contributors' }).addTo(map);
|
||||
const geojsonFeature = {
|
||||
'type': 'Feature',
|
||||
'geometry': this.geojson
|
||||
};
|
||||
const simplifiedGeojsonFeature = {
|
||||
'type': 'Feature',
|
||||
'geometry': this.simplifiedGeojson
|
||||
};
|
||||
const geojsonWaterFeature = {
|
||||
'type': 'Feature',
|
||||
'geometry': this.geojsonWater
|
||||
};
|
||||
const geojsonOSMfrFeature = {
|
||||
'type': 'Feature',
|
||||
'geometry': this.geojsonOSMfr
|
||||
};
|
||||
L.geoJson(geojsonFeature, { style: { color: '#FFA500', fillColor: '#FFA500', fillOpacity: 0.3 } }).addTo(map);
|
||||
L.geoJson(geojsonWaterFeature, { style: { color: '#FF0084', fillColor: '#FF0084', fillOpacity: 0.2 } }).addTo(map);
|
||||
L.geoJson(geojsonOSMfrFeature, { style: { color: '#10b981', fillColor: '#10b981', fillOpacity: 0.3 } }).addTo(map);
|
||||
let simplifiedGeoJSON = L.geoJson(simplifiedGeojsonFeature, { style: { fillOpacity: 0.5 } }).addTo(map);
|
||||
map.fitBounds(simplifiedGeoJSON.getBounds(), { padding: [50, 50] });
|
||||
});
|
||||
}
|
||||
}">
|
||||
<div x-ref="map" style="height: 50vh;"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class='rounded-lg bg-white px-4 py-5 shadow dark:bg-gray-800 lg:p-6'>
|
||||
<p class="mt-8 text-xs leading-5 text-gray-400 md:order-1 md:mt-0">
|
||||
<a class="text-blue-500" href="https://github.com/HolgerHatGarKeineNode/geojson-helper"
|
||||
target="_blank">GeoJSON helper</a> is maintained by <a
|
||||
href="https://github.com/HolgerHatGarKeineNode" target="_blank"
|
||||
class="text-amber-500">HolgerHatGarKeineNode</a> [<span
|
||||
class="break-all font-mono">npub1pt0kw36ue3w2g4haxq3wgm6a2fhtptmzsjlc2j2vphtcgle72qesgpjyc6</span>].
|
||||
This
|
||||
software is open-sourced software
|
||||
licensed under the <a href="https://opensource.org/licenses/MIT" target="_blank"
|
||||
class="underline">MIT license</a>.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
.leaflet-attribution-flag {
|
||||
display: inline;
|
||||
}
|
||||
</style>
|
||||
</div>
|
||||
@@ -1,74 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-4">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4 flex flex-col sm:flex-row">
|
||||
<div
|
||||
wire:ignore
|
||||
class="w-full flex justify-center"
|
||||
x-data="{
|
||||
init() {
|
||||
let markers = {{ Js::from($allMarkers) }};
|
||||
|
||||
$('#mapworld').vectorMap({
|
||||
zoomButtons : true,
|
||||
zoomOnScroll: true,
|
||||
map: 'world_mill',
|
||||
backgroundColor: 'transparent',
|
||||
markers: markers.map(function(h){ return {name: h.name, latLng: h.coords} }),
|
||||
onMarkerClick: function(event, index) {
|
||||
$wire.call('filterByMarker', markers[index].id)
|
||||
},
|
||||
markerStyle: {
|
||||
initial: {
|
||||
image: '{{ asset('img/btc.png') }}',
|
||||
}
|
||||
},
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#a4a4a4'
|
||||
},
|
||||
hover: {
|
||||
'fill-opacity': 1,
|
||||
cursor: 'default'
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div id="mapworld" style="width: 100%;" class="h-[200px] sm:h-[400px] bg-gray-900"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="w-full pb-24">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Meetups') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.meetup-table :country="$country->code"/>
|
||||
</div>
|
||||
</div>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_meetups_world"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,216 +0,0 @@
|
||||
<div class="bg-21gray">
|
||||
@push('feeds')
|
||||
<x-feed-links/>
|
||||
@endpush
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<livewire:banner.mempool-weather/>
|
||||
|
||||
<div class="relative bg-21gray px-6 pt-2 pb-20 lg:px-8 lg:pt-2 lg:pb-2">
|
||||
<div class="absolute inset-0">
|
||||
<div class="h-1/3 bg-21gray sm:h-2/3"></div>
|
||||
</div>
|
||||
<div class="relative mx-auto max-w-7xl">
|
||||
<div class="flex flex-col sm:flex-row justify-center items-center space-x-2">
|
||||
<div>
|
||||
<img class="h-32 object-cover" src="{{ asset('img/einundzwanzig-news-colored.png') }}" alt="">
|
||||
</div>
|
||||
<div class="flex flex-col space-y-2">
|
||||
@if(isset($filters['author']))
|
||||
<x-button wire:click="resetFiltering"
|
||||
xs>{{ __('Reset filtering') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@auth
|
||||
<x-button
|
||||
class="whitespace-nowrap"
|
||||
:href="route('news.form')"
|
||||
primary>
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Submit news articles') }}
|
||||
</x-button>
|
||||
@if(auth()->check() && auth()->user()->lnbits['wallet_id'] ?? false)
|
||||
<x-button
|
||||
class="whitespace-nowrap"
|
||||
:href="route('news.form', ['type' => 'paid'])"
|
||||
primary>
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Submit paid news article') }}
|
||||
<i class="fa fa-thin fa-coins"></i>
|
||||
</x-button>
|
||||
@elseif(auth()->check())
|
||||
<x-button
|
||||
class="whitespace-nowrap"
|
||||
:href="route('profile.lnbits')"
|
||||
black>
|
||||
<i class="fa fa-thin fa-gear"></i>
|
||||
{{ __('Setup LNBits for paid articles') }}
|
||||
<i class="fa fa-thin fa-coins"></i>
|
||||
</x-button>
|
||||
@endif
|
||||
@endauth
|
||||
</div>
|
||||
</div>
|
||||
<div class="mx-auto mt-2 grid max-w-lg gap-5 lg:max-w-none lg:grid-cols-3">
|
||||
|
||||
@foreach($libraryItems as $libraryItem)
|
||||
@if($libraryItem->approved || $libraryItem->created_by === auth()->id() || auth()->user()?->hasRole('news-editor'))
|
||||
<div wire:key="library_item_{{ $libraryItem->id }}" wire:loading.class="opacity-25"
|
||||
class="relative flex flex-col overflow-hidden rounded-lg border-2 border-[#F7931A]">
|
||||
@if($libraryItem->sats)
|
||||
<div class="absolute -left-1 top-0 h-16 w-16">
|
||||
<div
|
||||
class="absolute transform -rotate-45 bg-amber-500 text-center text-white font-semibold py-1 left-[-34px] top-[32px] w-[170px]">
|
||||
{{ number_format($libraryItem->sats, 0, ',', '.') }} {{ __('sats') }}
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
<div class="flex-shrink-0 pt-6">
|
||||
<a href="{{ route('article.view', ['libraryItem' => $libraryItem]) }}">
|
||||
<img class="h-48 w-full object-contain"
|
||||
src="{{ $libraryItem->getFirstMediaUrl('main', 'seo') }}"
|
||||
alt="{{ $libraryItem->name }}">
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex flex-1 flex-col justify-between bg-21gray p-6">
|
||||
<div class="flex-1">
|
||||
<div class="text-sm font-medium text-amber-600">
|
||||
<div
|
||||
class="text-amber-500">{{ $libraryItem->tags->pluck('name')->join(', ') }}</div>
|
||||
</div>
|
||||
<a href="{{ route('article.view', ['libraryItem' => $libraryItem]) }}"
|
||||
class="mt-2 block">
|
||||
<p class="text-xl font-semibold text-gray-200">{{ $libraryItem->name }}</p>
|
||||
<p class="mt-3 text-base text-gray-300 line-clamp-6">{{ strip_tags($libraryItem->excerpt) }}</p>
|
||||
</a>
|
||||
</div>
|
||||
<div class="mt-6 flex items-center w-full">
|
||||
<div class="flex-shrink-0">
|
||||
<div>
|
||||
<span
|
||||
class="sr-only text-gray-200">{{ $libraryItem->lecturer->name }}</span>
|
||||
<img class="h-10 w-10 object-cover rounded"
|
||||
src="{{ $libraryItem->lecturer->getFirstMediaUrl('avatar') }}"
|
||||
alt="{{ $libraryItem->lecturer->name }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<div class="text-sm font-medium text-gray-200">
|
||||
<div class="text-gray-200">{{ $libraryItem->lecturer->name }}</div>
|
||||
</div>
|
||||
<div class="flex space-x-1 text-sm text-gray-500">
|
||||
<time
|
||||
datetime="2020-03-16">{{ $libraryItem->created_at->asDateTime() }}</time>
|
||||
@if($libraryItem->read_time)
|
||||
<span aria-hidden="true">·</span>
|
||||
<span>{{ $libraryItem->read_time }} {{ __('min read') }}</span>
|
||||
@endif
|
||||
</div>
|
||||
<div
|
||||
class="flex space-x-1 text-sm text-gray-500 justify-end items-end">
|
||||
@if($libraryItem->created_by === auth()->id() || auth()->user()?->hasRole('news-editor'))
|
||||
<div>
|
||||
@if($libraryItem->approved)
|
||||
<div>
|
||||
<x-badge green>{{ __('approved') }}</x-badge>
|
||||
</div>
|
||||
@else
|
||||
<div>
|
||||
<x-badge negative>{{ __('not approved') }}</x-badge>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if($libraryItem->approved && auth()->user()?->hasRole('news-editor') && !$libraryItem->nostr_status)
|
||||
<div x-data="{}">
|
||||
<x-button xs
|
||||
purple
|
||||
wire:loading.attr="disabled"
|
||||
class="whitespace-nowrap"
|
||||
x-on:click="$wireui.confirmDialog({
|
||||
icon: 'question',
|
||||
title: '{{ __('Are you sure you want to publish this article on Nostr?')}}',
|
||||
accept: {label: '{{ __('Yes') }}',
|
||||
execute: () => $wire.nostr({{ $libraryItem->id }})},
|
||||
reject: {label: '{{ __('No, cancel') }}'},
|
||||
})"
|
||||
>
|
||||
<i class="fa fa-thin fa-message-plus"></i>
|
||||
{{ __('Publish on Nostr') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@endif
|
||||
@if($libraryItem->approved && $libraryItem->nostr_status)
|
||||
<div>
|
||||
<x-badge purple>
|
||||
<i class="fa fa-thin fa-check"></i>
|
||||
{{ __('nostr') }}
|
||||
</x-badge>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
@if(!$libraryItem->approved && auth()->user()?->hasRole('news-editor'))
|
||||
<x-button
|
||||
xs
|
||||
wire:click="approve({{ $libraryItem->id }})"
|
||||
>
|
||||
<i class="fa fa-thin fa-check"></i>
|
||||
{{ __('Approve') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<x-button xs
|
||||
:href="route('news.form', ['libraryItem' => $libraryItem, 'type' => $libraryItem->sats ? 'paid' : null])">
|
||||
<i class="fa fa-thin fa-edit"></i>
|
||||
{{ __('Edit') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@endforeach
|
||||
|
||||
<div
|
||||
x-data="{
|
||||
observe () {
|
||||
let observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
@this.call('loadMore')
|
||||
}
|
||||
})
|
||||
}, {
|
||||
root: null
|
||||
})
|
||||
observer.observe(this.$el)
|
||||
}
|
||||
}"
|
||||
x-init="observe"
|
||||
></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
@push('modals')
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_news"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
@endpush
|
||||
</div>
|
||||
@@ -1,50 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="bg-21gray py-24 sm:py-32">
|
||||
<div class="mx-auto grid max-w-7xl gap-y-20 gap-x-8 px-6 lg:px-8 xl:grid-cols-3">
|
||||
<div class="max-w-2xl">
|
||||
<h2 class="text-3xl font-bold tracking-tight text-gray-200 sm:text-4xl">{{ __('News articles writer') }}</h2>
|
||||
<p class="mt-6 text-lg leading-8 text-gray-300">
|
||||
{{ __('Click on any of the authors to see their articles.') }}
|
||||
</p>
|
||||
</div>
|
||||
<ul role="list" class="grid gap-x-8 gap-y-12 sm:grid-cols-2 sm:gap-y-16 xl:col-span-2">
|
||||
|
||||
@foreach($authors as $author)
|
||||
<a href="{{ route('article.overview', ['filters' => ['author' => $author->slug]]) }}"
|
||||
wire:key="author_{{ $author->id }}">
|
||||
<li>
|
||||
<div class="flex items-center gap-x-6">
|
||||
<img class="h-16 w-16 rounded-full"
|
||||
src="{{ $author->getFirstMediaUrl('avatar') }}"
|
||||
alt="{{ $author->name }}">
|
||||
<div>
|
||||
<h3 class="text-base font-semibold leading-7 tracking-tight text-gray-200">
|
||||
{{ $author->name }}
|
||||
</h3>
|
||||
<p class="text-sm font-semibold leading-6 text-amber-600">
|
||||
{{ $author->library_items_count }} {{ __('articles') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</a>
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_news_authors"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,216 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
@if($paid)
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Paid News Article') }}</h3>
|
||||
@else
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('News Article') }}</h3>
|
||||
@endif
|
||||
<div class="flex flex-row space-x-2 items-center justify-between">
|
||||
<div x-data="{}">
|
||||
@if($libraryItem->created_by === auth()->id())
|
||||
<x-button
|
||||
x-on:click="$wireui.confirmDialog({
|
||||
icon: 'question',
|
||||
title: '{{ __('Are your sure?') }}',
|
||||
accept: {label: '{{ __('Yes') }}',
|
||||
execute: () => $wire.delete()},
|
||||
reject: {label: '{{ __('No, cancel') }}',
|
||||
}})"
|
||||
negative>
|
||||
<i class="fa fa-thin fa-trash"></i>
|
||||
{{ __('Delete') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
@if($paid)
|
||||
<x-input.group :for="md5('libraryItem.sats')" :label="__('sats')">
|
||||
<x-inputs.number min="21" autocomplete="off" wire:model.debounce="libraryItem.sats"
|
||||
:placeholder="__('sats')"
|
||||
:hint="__('How many sats to read this article?')"/>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
<x-input.group :for="md5('libraryItem.lecturer_id')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Author') }}
|
||||
</div>
|
||||
<x-button xs href="{{ route('contentCreator.form', ['country' => 'de']) }}">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Create new author') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
:clearable="false"
|
||||
wire:model="libraryItem.lecturer_id"
|
||||
:searchable="true"
|
||||
:async-data="[
|
||||
'api' => route('api.lecturers.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
'params' => ['user_id' => auth()->id()], // default is []
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'image']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('selectedTags')" :label="__('Tags')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Tags') }}
|
||||
</div>
|
||||
@if(!$addTag)
|
||||
<x-button
|
||||
xs
|
||||
wire:click="$set('addTag', true)"
|
||||
>
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Add') }}
|
||||
</x-button>
|
||||
@else
|
||||
<x-input label="" wire:model.debounce="newTag" placeholder="{{ __('New tag') }}"/>
|
||||
<x-button
|
||||
xs
|
||||
wire:click="addTag">
|
||||
<i class="text-xl fa-thin fa-save"></i>
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
</x-slot>
|
||||
<div class="flex flex-col">
|
||||
<div class="py-2 flex flex-wrap items-center space-x-1">
|
||||
@foreach($tags as $tag)
|
||||
<div class="cursor-pointer" wire:key="tag{{ $loop->index }}"
|
||||
wire:click="selectTag('{{ $tag['name'] }}')">
|
||||
@if(collect($selectedTags)->contains($tag['name']))
|
||||
<x-badge
|
||||
amber>
|
||||
{{ $tag['name'] }}
|
||||
</x-badge>
|
||||
@else
|
||||
<x-badge
|
||||
black>
|
||||
{{ $tag['name'] }}
|
||||
</x-badge>
|
||||
@endif
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@error('selectedTags')
|
||||
<div class="text-red-500">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
</x-input.group>
|
||||
|
||||
@if($libraryItem->lecturer_id)
|
||||
<x-input.group :for="md5('image')" :label="__('Main picture')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($libraryItem->getFirstMediaUrl('main'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $libraryItem->getFirstMediaUrl('main') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.main_image_caption')" :label="__('Main image caption')">
|
||||
<x-input autocomplete="off" wire:model.debounce="libraryItem.main_image_caption"
|
||||
:placeholder="__('Main image caption')"
|
||||
:cornerHint="__('Ex: Photo by Timothy Vollmer/ CC BY')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.name')" :label="__('Title')">
|
||||
<x-input autocomplete="off" wire:model.debounce="libraryItem.name"
|
||||
:placeholder="__('Title')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.subtitle')" :label="__('Subtitle')">
|
||||
<x-input autocomplete="off" wire:model.debounce="libraryItem.subtitle"
|
||||
:placeholder="__('Subtitle')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.excerpt')" :label="__('Excerpt')">
|
||||
<x-textarea autocomplete="off" wire:model.debounce="libraryItem.excerpt"
|
||||
:placeholder="__('Excerpt')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.language_code')" :label="__('Language Code')">
|
||||
<x-select
|
||||
:clearable="false"
|
||||
wire:model="libraryItem.language_code"
|
||||
:options="collect(config('languages.languages'))->map(fn($value, $key) => ['id' => $key, 'name' => $value])->toArray()"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('libraryItem.value')"
|
||||
:label="$paid ? __('Free part of the Article as Markdown') : __('Article as Markdown')">
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="libraryItem.value"/>
|
||||
@error('libraryItem.value') <span class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
@if($paid)
|
||||
<x-input.group :for="md5('libraryItem.value_to_be_paid')"
|
||||
:label="__('Part of the article to be paid')">
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="libraryItem.value_to_be_paid"/>
|
||||
@error('libraryItem.value_to_be_paid') <span
|
||||
class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
<x-input.group :for="md5('libraryItem.read_time')" :label="__('Time to read')">
|
||||
<x-inputs.number min="1" autocomplete="off" wire:model.debounce="libraryItem.read_time"
|
||||
:placeholder="__('Time to read')" :hint="__('How many minutes to read?')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('meetupEvent.link')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
|
||||
</div>
|
||||
@@ -1,356 +0,0 @@
|
||||
<div class="bg-21gray">
|
||||
@googlefonts('article')
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="lg:h-[985px] lg:overflow-y-auto">
|
||||
<div
|
||||
class="font-article overflow-hidden relative isolate bg-21gray px-6 py-24 sm:py-32 lg:overflow-visible lg:px-0">
|
||||
<div class="absolute inset-0 -z-10 opacity-10 overflow-hidden">
|
||||
<svg
|
||||
class="absolute top-0 left-[max(50%,25rem)] h-[64rem] w-[128rem] -translate-x-1/2 stroke-gray-200 [mask-image:radial-gradient(64rem_64rem_at_top,white,transparent)]"
|
||||
aria-hidden="true">
|
||||
<defs>
|
||||
<pattern id="e813992c-7d03-4cc4-a2bd-151760b470a0" width="200" height="200" x="50%" y="-1"
|
||||
patternUnits="userSpaceOnUse">
|
||||
<path d="M100 200V.5M.5 .5H200" fill="none"/>
|
||||
</pattern>
|
||||
</defs>
|
||||
<svg x="50%" y="-1" class="overflow-visible fill-gray-50">
|
||||
<path
|
||||
d="M-100.5 0h201v201h-201Z M699.5 0h201v201h-201Z M499.5 400h201v201h-201Z M-300.5 600h201v201h-201Z"
|
||||
stroke-width="0"/>
|
||||
</svg>
|
||||
<rect width="100%" height="100%" stroke-width="0"
|
||||
fill="url(#e813992c-7d03-4cc4-a2bd-151760b470a0)"/>
|
||||
</svg>
|
||||
</div>
|
||||
<div
|
||||
class="mx-auto grid max-w-screen-2xl grid-cols-1 gap-y-16 gap-x-8 lg:mx-0 lg:max-w-none lg:grid-cols-2 lg:items-start lg:gap-y-10">
|
||||
<div
|
||||
class="lg:col-span-2 lg:col-start-1 lg:row-start-1 lg:mx-auto lg:grid lg:w-full lg:max-w-7xl lg:grid-cols-2 lg:gap-x-8 lg:px-8">
|
||||
<div class="lg:pr-4">
|
||||
<div>
|
||||
<h2 class="text-lg font-semibold text-amber-600">{{ $libraryItem->tags->pluck('name')->join(', ') }}</h2>
|
||||
<h3 class="mt-2 text-3xl font-bold leading-8 tracking-tight text-gray-100 sm:text-4xl">{{ $libraryItem->name }}</h3>
|
||||
</div>
|
||||
<div class="mx-auto max-w-prose text-base lg:grid lg:max-w-none lg:grid-cols-2 lg:gap-8">
|
||||
<div class="mt-6 flex items-center w-full">
|
||||
<div class="flex-shrink-0">
|
||||
<div>
|
||||
<span class="sr-only text-gray-200">{{ $libraryItem->lecturer->name }}</span>
|
||||
<img class="h-10 w-10 object-cover rounded"
|
||||
src="{{ $libraryItem->lecturer->getFirstMediaUrl('avatar') }}"
|
||||
alt="{{ $libraryItem->lecturer->name }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<div class="text-sm font-medium text-gray-200">
|
||||
<div class="text-gray-200">{{ $libraryItem->lecturer->name }}</div>
|
||||
</div>
|
||||
<div class="flex space-x-1 text-sm text-gray-500">
|
||||
<time datetime="2020-03-16">{{ $libraryItem->created_at->asDateTime() }}</time>
|
||||
@if($libraryItem->read_time)
|
||||
<span aria-hidden="true">·</span>
|
||||
<span>{{ $libraryItem->read_time }} {{ __('min read') }}</span>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="-mt-12 -ml-12 p-12 lg:sticky lg:top-4 lg:col-start-2 lg:row-span-2 lg:row-start-1 lg:overflow-hidden">
|
||||
<img
|
||||
class="w-[48rem] max-w-full rounded-xl bg-gray-900 shadow-xl ring-1 ring-gray-400/10 sm:w-[57rem]"
|
||||
src="{{ $libraryItem->getFirstMediaUrl('main') }}" alt="{{ $libraryItem->name }}">
|
||||
<figcaption class="mt-3 flex text-sm text-gray-200">
|
||||
<!-- Heroicon name: mini/camera -->
|
||||
<svg class="h-5 w-5 flex-none text-gray-400" xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M1 8a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 018.07 3h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0016.07 6H17a2 2 0 012 2v7a2 2 0 01-2 2H3a2 2 0 01-2-2V8zm13.5 3a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM10 14a3 3 0 100-6 3 3 0 000 6z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
<span class="ml-2">{{ $libraryItem->main_image_caption ?? $libraryItem->name }}</span>
|
||||
</figcaption>
|
||||
</div>
|
||||
<div
|
||||
class="lg:col-span-2 lg:col-start-1 lg:row-start-2 lg:mx-auto lg:grid lg:w-full lg:max-w-7xl lg:grid-cols-2 lg:gap-x-8 lg:px-8">
|
||||
<div class="lg:pr-4">
|
||||
<div class="max-w-xl text-base leading-7 text-gray-700 lg:max-w-xl">
|
||||
|
||||
<div class="mx-auto text-base lg:max-w-none">
|
||||
<div class="prose md:prose-lg prose-invert">
|
||||
<x-markdown class="leading-normal">
|
||||
{!! $libraryItem->subtitle !!}
|
||||
</x-markdown>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="prose md:prose-lg prose-invert mx-auto mt-5 text-gray-100 lg:col-start-1 lg:row-start-1 lg:max-w-none">
|
||||
<div class="flex flex-col space-y-1">
|
||||
@if($libraryItem->type !== 'markdown_article' && str($libraryItem->value)->contains('http'))
|
||||
@if($libraryItem->type === 'youtube_video')
|
||||
<x-button lg amber :href="$libraryItem->value" target="_blank">
|
||||
<i class="fa fa-brand fa-youtube mr-2"></i>
|
||||
{{ __('Open on Youtube') }}
|
||||
</x-button>
|
||||
@elseif($libraryItem->type !== 'markdown_article' && $libraryItem->type !== 'markdown_article_extern')
|
||||
<x-button lg amber :href="$libraryItem->value" target="_blank">
|
||||
<i class="fa fa-thin fa-book-open mr-2"></i>
|
||||
{{ __('Open') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@endif
|
||||
@if($libraryItem->type === 'downloadable_file')
|
||||
<x-button lg amber :href="$libraryItem->getFirstMediaUrl('single_file')"
|
||||
target="_blank">
|
||||
<i class="fa fa-thin fa-download mr-2"></i>
|
||||
{{ __('Download') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@if($libraryItem->type === 'podcast_episode')
|
||||
<x-button lg amber :href="$libraryItem->episode->data['link']" target="_blank">
|
||||
<i class="fa fa-thin fa-headphones mr-2"></i>
|
||||
{{ __('Listen') }}
|
||||
</x-button>
|
||||
@endif
|
||||
@if($libraryItem->type !== 'markdown_article')
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ url()->route('libraryItem.view', ['libraryItem' => $libraryItem]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Share url copied!') }}',icon:'success'});"
|
||||
lg black>
|
||||
<i class="fa fa-thin fa-copy mr-2"></i>
|
||||
{{ __('Share link') }}
|
||||
</x-button>
|
||||
@elseif($libraryItem->news)
|
||||
<x-button
|
||||
x-data="{
|
||||
textToCopy: '{{ url()->route('article.view', ['libraryItem' => $libraryItem]) }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Share url copied!') }}',icon:'success'});"
|
||||
xs black>
|
||||
<i class="fa fa-thin fa-copy mr-2"></i>
|
||||
{{ __('Share link') }}
|
||||
</x-button>
|
||||
@else
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if($libraryItem->type === 'youtube_video')
|
||||
<div class="my-12">
|
||||
<x-embed :url="$libraryItem->value"/>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($libraryItem->type === 'markdown_article' || $libraryItem->type === 'markdown_article_extern')
|
||||
<x-markdown class="leading-normal">
|
||||
{!! $libraryItem->value !!}
|
||||
</x-markdown>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
@if($libraryItem->sats && !$invoicePaid)
|
||||
<div
|
||||
class="mx-auto max-w-7xl sm:px-6 lg:px-8">
|
||||
<div
|
||||
class="relative isolate overflow-hidden bg-gray-900 px-6 py-12 text-center shadow-2xl sm:rounded-3xl sm:px-16">
|
||||
<h2 class="mx-auto max-w-2xl text-3xl font-bold tracking-tight text-white sm:text-4xl">
|
||||
{{ __('You can read the full article if you paid with Lightning') }}
|
||||
</h2>
|
||||
<div
|
||||
class="flex max-w-2xl text-3xl font-bold tracking-tight text-white sm:text-4xl justify-center items-center">
|
||||
<div class="mt-6 flex items-center">
|
||||
<div class="flex-shrink-0">
|
||||
<div>
|
||||
<span
|
||||
class="sr-only text-gray-200">{{ $libraryItem->lecturer->name }}</span>
|
||||
<img class="h-10 w-10 object-cover rounded"
|
||||
src="{{ $libraryItem->lecturer->getFirstMediaUrl('avatar') }}"
|
||||
alt="{{ $libraryItem->lecturer->name }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<div class="text-sm font-medium text-gray-200">
|
||||
<div class="text-gray-200">{{ __('Receiver') }}
|
||||
: {{ $libraryItem->lecturer->name }}</div>
|
||||
</div>
|
||||
<div class="flex space-x-1 text-sm text-gray-300">
|
||||
<time>{{ number_format($libraryItem->sats, 0, ',', '.') }} {{ __('sats') }}</time>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@if(!$invoice)
|
||||
<div class="mt-10 flex items-center justify-center gap-x-6">
|
||||
<x-button
|
||||
wire.loading.attr="disabled"
|
||||
primary
|
||||
wire:click="pay">
|
||||
<i class="fa-thin fa-bolt"></i>
|
||||
Pay with lightning
|
||||
</x-button>
|
||||
<div wire:click="$set('alreadyPaid', true)"
|
||||
class="cursor-pointer text-sm font-semibold leading-6 text-white">{{ __('already paid?') }}
|
||||
<span aria-hidden="true">→</span></div>
|
||||
</div>
|
||||
@else
|
||||
<div
|
||||
class="mt-10 flex flex-col items-center justify-center gap-x-6 bg-white pb-12">
|
||||
<div class="text-sm font-semibold text-gray-900 py-6">
|
||||
{{ __('Click QR-Code to open your wallet') }}
|
||||
</div>
|
||||
<div class="flex justify-center" wire:key="qrcode">
|
||||
<a href="lightning:{{ $this->invoice }}">
|
||||
<img src="{{ 'data:image/png;base64, '. $this->qrCode }}"
|
||||
alt="qrcode">
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
@if(!$invoice)
|
||||
<svg viewBox="0 0 1024 1024"
|
||||
class="absolute top-1/2 left-1/2 -z-10 h-[64rem] w-[64rem] -translate-x-1/2 [mask-image:radial-gradient(closest-side,white,transparent)]"
|
||||
aria-hidden="true">
|
||||
<circle cx="512" cy="512" r="512"
|
||||
fill="url(#827591b1-ce8c-4110-b064-7cb85a0b1217)"
|
||||
fill-opacity="0.7"/>
|
||||
<defs>
|
||||
<radialGradient id="827591b1-ce8c-4110-b064-7cb85a0b1217">
|
||||
<stop stop-color="#F7931A"/>
|
||||
<stop offset="1" stop-color="#F7931A"/>
|
||||
</radialGradient>
|
||||
</defs>
|
||||
</svg>
|
||||
@endif
|
||||
@if($alreadyPaid)
|
||||
<div class="flex items-center justify-center gap-x-6 py-2"
|
||||
wire:key="checkPaymentHashDiv">
|
||||
<div class="w-full flex flex-col space-y-2 justify-center"
|
||||
wire:key="paymentHash">
|
||||
<div
|
||||
class="w-full my-2 flex justify-center font-mono break-all py-2">
|
||||
<x-input.group :for="md5('checkThisPaymentHash')"
|
||||
:label="__('Payment Hash')">
|
||||
<x-input autocomplete="off"
|
||||
wire:model.debounce="checkThisPaymentHash"
|
||||
:placeholder="__('Payment Hash')"/>
|
||||
</x-input.group>
|
||||
</div>
|
||||
</div>
|
||||
@if($checkThisPaymentHash)
|
||||
<div wire:poll.keep-alive="checkPaymentHash"
|
||||
wire:key="checkPaymentHash"></div>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
@if($invoice)
|
||||
<div class="flex items-center justify-center gap-x-6 bg-white py-2">
|
||||
<div
|
||||
x-data="{
|
||||
textToCopy: '{{ $this->paymentHash }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('Payment hash copied!') }}',icon:'success'});"
|
||||
class="w-full flex flex-col space-y-2 justify-center"
|
||||
wire:key="paymentHash">
|
||||
<div
|
||||
class="w-full my-2 flex justify-center font-mono break-all px-6">
|
||||
<input class="w-full" readonly wire:key="paymentHashInput"
|
||||
onClick="this.select();"
|
||||
value="{{ $this->paymentHash }}"/>
|
||||
</div>
|
||||
<div
|
||||
>
|
||||
<x-button
|
||||
black
|
||||
>
|
||||
<i class="fa fa-thin fa-clipboard"></i>
|
||||
{{ __('Copy payment hash') }}
|
||||
</x-button>
|
||||
</div>
|
||||
<div
|
||||
class="w-full my-2 flex justify-center font-mono font-bold p-4">
|
||||
<p class="text-amber-500">{{ __('As a guest, please save your payment hash so that you can unlock this article later. Unfortunately, we cannot save your purchase status permanently for guests. Please log in to use this feature.') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div wire:poll.keep-alive="checkPaymentHash"
|
||||
wire:key="checkPaymentHash"></div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@else
|
||||
<div
|
||||
class="prose md:prose-lg prose-invert mx-auto mt-5 text-gray-100 lg:col-start-1 lg:row-start-1 lg:max-w-none">
|
||||
|
||||
<x-markdown class="leading-normal">
|
||||
{!! $libraryItem->value_to_be_paid !!}
|
||||
</x-markdown>
|
||||
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($payNymQrCode)
|
||||
<div
|
||||
class="flex flex-col sm:flex-row justify-center space-x-4 border-t border-white py-4 mt-4">
|
||||
<h1 class="text-2xl text-gray-200">PayNym</h1>
|
||||
<div class="p-12 bg-white">
|
||||
<img src="{{ 'data:image/png;base64, '. $payNymQrCode }}" alt="qrcode">
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div wire:ignore>
|
||||
<div
|
||||
class="flex flex-col sm:flex-row justify-center space-x-4 border-t border-white py-4 mt-4">
|
||||
@if($libraryItem->lecturer->lightning_address || $libraryItem->lecturer->lnurl || $libraryItem->lecturer->node_id)
|
||||
<h1 class="text-2xl text-gray-200">value-4-value</h1>
|
||||
<div wire:ignore>
|
||||
<lightning-widget
|
||||
name="{{ $libraryItem->lecturer->name }}"
|
||||
accent="#f7931a"
|
||||
to="{{ $libraryItem->lecturer->lightning_address ?? $libraryItem->lecturer->lnurl ?? $libraryItem->lecturer->node_id }}"
|
||||
image="{{ $libraryItem->lecturer->getFirstMediaUrl('avatar') }}"
|
||||
amounts="21,210,2100,21000"
|
||||
/>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<script src="https://embed.twentyuno.net/js/app.js"></script>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div x-data="{paid: @entangle('invoicePaid')}" x-init="$watch('paid', value => {if (value) {
|
||||
party.confetti(document.body, {
|
||||
count: party.variation.range(20, 40),
|
||||
});
|
||||
}})"></div>
|
||||
|
||||
@push('modals')
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script src="https://cdn.jsdelivr.net/npm/party-js@latest/bundle/party.min.js"></script>
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_{{ str($libraryItem->slug)->replace('-', '_') }}"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
@endpush
|
||||
</div>
|
||||
@@ -1,317 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="bg-21gray py-24 sm:py-32"
|
||||
wire:ignore
|
||||
x-data="{
|
||||
text: 'Animate',
|
||||
char: -1,
|
||||
width: '0',
|
||||
loading: true,
|
||||
loadingFollow: false,
|
||||
plebsNpubs: @entangle('plebsNpubs'),
|
||||
plebs: [],
|
||||
ndk: null,
|
||||
search: '',
|
||||
ndkUser: null,
|
||||
nip07signer: null,
|
||||
currentUser: null,
|
||||
npubToFollow: null,
|
||||
currentFollows: null,
|
||||
get searchResults () {
|
||||
if (this.search === '') {
|
||||
return this.plebs;
|
||||
}
|
||||
|
||||
return this.plebs.filter(
|
||||
i => i.profile && i.profile.name.toLocaleLowerCase().includes(this.search.toLocaleLowerCase())
|
||||
);
|
||||
},
|
||||
async init() {
|
||||
$watch('width', value => { if (value > 100) { width = 100 } if (value == 0) { width = 10 } });
|
||||
this.ndk = new window.NDK({
|
||||
explicitRelayUrls: [
|
||||
'wss://eden.nostr.land',
|
||||
'wss://relay.snort.social',
|
||||
'wss://nostr.wine',
|
||||
'wss://nostr-pub.wellorder.net',
|
||||
'wss://nos.lol',
|
||||
'wss://offchain.pub',
|
||||
'wss://nostr.fmt.wiz.biz',
|
||||
'wss://nostr.einundzwanzig.space',
|
||||
'wss://relay.nostr.band',
|
||||
'wss://relay.damus.io',
|
||||
'wss://eden.nostr.land',
|
||||
'wss://nostr.codingarena.de',
|
||||
'wss://relay.primal.net',
|
||||
],
|
||||
});
|
||||
this.ndk.connect();
|
||||
const length = this.plebsNpubs.filter(npub => npub.includes('npub1')).length;
|
||||
let counter = 1;
|
||||
for (const npub of this.plebsNpubs) {
|
||||
if(npub.includes('npub1')) {
|
||||
const ndkUser = this.ndk.getUser({
|
||||
npub: npub.trim(),
|
||||
});
|
||||
await ndkUser.fetchProfile();
|
||||
if (ndkUser.profile.image) {
|
||||
this.char = -1;
|
||||
this.text = ndkUser.profile.name;
|
||||
this.animate();
|
||||
ndkUser.profile.npub = npub;
|
||||
this.plebs.push(ndkUser);
|
||||
this.width = Math.round(counter / length * 100);
|
||||
counter++;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.loading = false;
|
||||
console.log('LOADING FALSE');
|
||||
},
|
||||
login () {
|
||||
this.nip07signer = new window.NDKNip07Signer();
|
||||
this.ndk = new window.NDK({
|
||||
explicitRelayUrls: [
|
||||
'wss://eden.nostr.land',
|
||||
'wss://relay.snort.social',
|
||||
'wss://nostr.wine',
|
||||
'wss://nostr-pub.wellorder.net',
|
||||
'wss://nos.lol',
|
||||
'wss://offchain.pub',
|
||||
'wss://nostr.fmt.wiz.biz',
|
||||
'wss://nostr.einundzwanzig.space',
|
||||
'wss://relay.nostr.band',
|
||||
'wss://relay.damus.io',
|
||||
'wss://eden.nostr.land',
|
||||
'wss://nostr.codingarena.de',
|
||||
'wss://relay.primal.net',
|
||||
],
|
||||
signer: this.nip07signer
|
||||
});
|
||||
this.ndk.connect();
|
||||
this.nip07signer.user().then(async (user) => {
|
||||
if (!!user.npub) {
|
||||
this.currentUser = this.ndk.getUser({
|
||||
npub: user.npub,
|
||||
});
|
||||
await this.currentUser.fetchProfile();
|
||||
//this.currentFollows = await this.currentUser.follows();
|
||||
//this.plebs.forEach(pleb => {
|
||||
// console.log(this.currentFollows);
|
||||
// console.log(this.currentFollows.has(pleb));
|
||||
//});
|
||||
}
|
||||
});
|
||||
},
|
||||
async followAll() {
|
||||
this.width = 0;
|
||||
this.loadingFollow = true;
|
||||
const length = this.plebs.length;
|
||||
let counter = 1;
|
||||
for (const pleb of this.plebs) {
|
||||
const follow = await this.currentUser.follow(pleb);
|
||||
this.char = -1;
|
||||
this.text = 'Followed ' + pleb.profile.name + '!';
|
||||
this.animate();
|
||||
console.log(follow);
|
||||
this.width = Math.round(counter / length * 100);
|
||||
counter++;
|
||||
}
|
||||
this.loadingFollow = false;
|
||||
window.$wireui.notify({title:'{{ __('Successfully followed all nostr plebs') }}',icon:'success'});
|
||||
},
|
||||
async follow(npubToFollow) {
|
||||
this.followUser = this.ndk.getUser({
|
||||
npub: npubToFollow,
|
||||
});
|
||||
console.log(this.followUser);
|
||||
const follow = await this.currentUser.follow(this.followUser);
|
||||
console.log(follow);
|
||||
if(follow) {
|
||||
window.$wireui.notify({title:'{{ __('Followed!') }}',icon:'success'});
|
||||
} else {
|
||||
window.$wireui.notify({title:'{{ __('Follow failed!') }}',icon:'error'});
|
||||
}
|
||||
},
|
||||
animate() {
|
||||
let timer = setInterval(() => {
|
||||
this.char++;
|
||||
if (this.char == this.text.length) {
|
||||
clearInterval(timer);
|
||||
timer = null;
|
||||
return;
|
||||
}
|
||||
}, 50);
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div class="mx-auto grid max-w-7xl gap-y-20 gap-x-8 px-6 lg:px-8 xl:grid-cols-2">
|
||||
<div class="max-w-2xl">
|
||||
<h2 class="text-3xl font-bold tracking-tight text-gray-200 sm:text-4xl">{{ __('Follow Einundzwanzig plebs') }}</h2>
|
||||
<p class="mt-6 text-lg leading-8 text-gray-300">
|
||||
{{ __('An overview of all Einundzwanzig plebs who have shared their npub.') }}
|
||||
</p>
|
||||
@auth
|
||||
<p class="mt-6 text-lg leading-8 text-gray-300">
|
||||
{{ __('Go to your profile and add your Nostr-npub. After that you can also log in with Nostr here on the portal.') }}
|
||||
<br>
|
||||
<a class="text-amber-500" href="{{ route('profile.show') }}">{{ __('Profile') }}</a>
|
||||
</p>
|
||||
@endauth
|
||||
<p class="mt-8">
|
||||
<x-button
|
||||
::disabled="loading"
|
||||
x-show="!currentUser" primary label="{{ __('NIP-07 Login') }}" icon="login"
|
||||
@click="login()"/>
|
||||
</p>
|
||||
<p class="text-gray-100">
|
||||
<span>{{ __('Log in with your Nostr Extension so you can follow all plebs with one click.') }}</span>
|
||||
</p>
|
||||
<h3 x-show="currentUser && currentUser.profile" class="py-4 text-gray-100 text-2xl">
|
||||
{{ __('Logged into Nostr as:') }}
|
||||
</h3>
|
||||
<template x-if="currentUser && currentUser.profile">
|
||||
<div
|
||||
x-show="currentUser && currentUser.profile.image"
|
||||
class="block flex-shrink-0 mt-8">
|
||||
<div class="flex items-center">
|
||||
<div>
|
||||
<img class="inline-block h-9 w-9 rounded-full"
|
||||
:src="currentUser.profile.image"
|
||||
:alt="currentUser.profile.image"
|
||||
>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<p class="text-sm font-medium text-gray-100" x-text="currentUser.profile.name"></p>
|
||||
<p class="text-xs font-medium text-gray-200" x-text="currentUser.profile.nip05"></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="py-4 flex space-x-4">
|
||||
<div class="w-1/2">
|
||||
<x-input x-ref="searchInput" x-model="search" placeholder="{{ __('Search') }}"/>
|
||||
</div>
|
||||
<div>
|
||||
<x-button
|
||||
::disabled="loadingFollow"
|
||||
@click.prevent="followAll()"
|
||||
x-show="currentUser && currentUser.profile"
|
||||
>
|
||||
<i class="fa-thin fa-user-plus mr-2"></i>
|
||||
{{ __('Follow all') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
x-show="loading"
|
||||
class="relative block w-full rounded-lg border-2 border-dashed border-purple-300 p-12 text-center hover:border-purple-400 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">
|
||||
<p class="mt-2 block text-lg font-semibold text-amber-500">
|
||||
You should stack sats as long as this page loads here. This is a low time preference loading bar. 🤙
|
||||
</p>
|
||||
<template x-for="(c, i) in text.split('')"><span
|
||||
x-text="c"
|
||||
class="opacity-0 transition ease-in text-2xl text-white"
|
||||
:class="{'opacity-100':char>=i}"></span></template>
|
||||
<div
|
||||
class="bg-purple-200 rounded h-6 mt-5"
|
||||
role="progressbar"
|
||||
:aria-valuenow="width"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100"
|
||||
>
|
||||
<div
|
||||
class="bg-purple-500 rounded h-6 text-center text-white text-sm transition"
|
||||
:style="`width: ${width}%; transition: width 2s;`"
|
||||
x-text="`${width}%`"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<img src="{{ asset('img/running-nostr.gif') }}" alt="running-nostr"
|
||||
class="mt-2 block text-sm font-semibold text-gray-900"/>
|
||||
<span class="mt-2 block text-sm font-semibold text-gray-100">Loadingstr...</span>
|
||||
</div>
|
||||
|
||||
<div
|
||||
x-show="loadingFollow"
|
||||
class="relative block w-full rounded-lg border-2 border-dashed border-purple-300 p-12 text-center hover:border-purple-400 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2">
|
||||
<p class="mt-2 block text-lg font-semibold text-amber-500">
|
||||
You should stack sats as long as this page loads here. This is a low time preference loading bar. 🤙
|
||||
</p>
|
||||
<template x-for="(c, i) in text.split('')"><span
|
||||
x-text="c"
|
||||
class="opacity-0 transition ease-in text-2xl text-white"
|
||||
:class="{'opacity-100':char>=i}"></span></template>
|
||||
<div
|
||||
class="bg-purple-200 rounded h-6 mt-5"
|
||||
role="progressbar"
|
||||
:aria-valuenow="width"
|
||||
aria-valuemin="0"
|
||||
aria-valuemax="100"
|
||||
>
|
||||
<div
|
||||
class="bg-purple-500 rounded h-6 text-center text-white text-sm transition"
|
||||
:style="`width: ${width}%; transition: width 2s;`"
|
||||
x-text="`${width}%`"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
<img src="{{ asset('img/running-nostr.gif') }}" alt="running-nostr"
|
||||
class="mt-2 block text-sm font-semibold text-gray-900"/>
|
||||
<span class="mt-2 block text-sm font-semibold text-gray-100">Followstr...</span>
|
||||
</div>
|
||||
|
||||
<ul role="list" class="divide-y divide-gray-100">
|
||||
|
||||
<template x-for="pleb in searchResults">
|
||||
<li class="flex items-center justify-between gap-x-6 py-5" x-show="!loading && !loadingFollow">
|
||||
<div class="flex min-w-0 gap-x-4">
|
||||
<img class="h-12 w-12 flex-none rounded-full bg-gray-50"
|
||||
:src="pleb.profile.image"
|
||||
:alt="pleb.profile.name"
|
||||
>
|
||||
<div class="min-w-0 flex-auto">
|
||||
<p class="text-sm font-semibold leading-6 text-gray-100"
|
||||
x-text="pleb.profile.name"></p>
|
||||
<p class="mt-1 truncate text-xs leading-5 text-gray-200"
|
||||
x-text="pleb.profile.nip05"></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col space-y-2">
|
||||
<div>
|
||||
<div
|
||||
x-data="{
|
||||
textToCopy: pleb.profile.npub,
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('NPUB copied!') }}',icon:'success'});"
|
||||
class="cursor-pointer whitespace-no-wrap rounded-full bg-white px-2.5 py-1 text-xs font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50">
|
||||
Copy
|
||||
</div>
|
||||
</div>
|
||||
{{--<div>
|
||||
<div
|
||||
x-show="currentUser"
|
||||
@click.prevent="follow(pleb.profile.npub)"
|
||||
class="cursor-pointer whitespace-no-wrap rounded-full bg-white px-2.5 py-1 text-xs font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50">
|
||||
Follow
|
||||
</div>
|
||||
</div>--}}
|
||||
</div>
|
||||
</li>
|
||||
</template>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
3
resources/views/livewire/nostr/start.blade.php
Normal file
3
resources/views/livewire/nostr/start.blade.php
Normal file
@@ -0,0 +1,3 @@
|
||||
<div>
|
||||
{{-- Because she competes with no one, no one can compete with her. --}}
|
||||
</div>
|
||||
@@ -1,53 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
<div class="flex flex-col">
|
||||
<section class="">
|
||||
<div class="px-10 pt-6 mx-auto max-w-7xl">
|
||||
<div class="w-full mx-auto text-left md:text-center">
|
||||
<h1 class="mb-6 text-5xl font-extrabold leading-none max-w-5xl mx-auto tracking-normal text-gray-900 sm:text-6xl md:text-6xl lg:text-7xl md:tracking-tight">
|
||||
<span
|
||||
class="w-full text-transparent bg-clip-text bg-gradient-to-r from-amber-400 via-amber-500 to-amber-500 lg:inline">{{ __('LNBits') }}</span>
|
||||
</h1>
|
||||
<p class="px-0 mb-6 text-lg text-gray-200 md:text-xl lg:px-24">
|
||||
{{ __('Enter the data of your LNBits instance here to receive sats for articles, for example.') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('settings.url')" :label="__('LNBits Url')">
|
||||
<x-input autocomplete="off" wire:model.debounce="settings.url"
|
||||
:placeholder="__('LNBits Url')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('settings.wallet_id')" :label="__('Wallet ID')">
|
||||
<x-input autocomplete="off" wire:model.debounce="settings.wallet_id"
|
||||
:placeholder="__('Wallet ID')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('settings.read_key')" :label="__('Invoice/read key')">
|
||||
<x-input autocomplete="off" wire:model.debounce="settings.read_key"
|
||||
:placeholder="__('Invoice/read key')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('save')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,109 +0,0 @@
|
||||
<div class="bg-21gray h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<section class="">
|
||||
<div class="px-10 pt-6 mx-auto max-w-7xl">
|
||||
<div class="w-full mx-auto text-left md:text-center">
|
||||
<h1 class="mb-6 text-5xl font-extrabold leading-none max-w-5xl mx-auto tracking-normal text-gray-900 sm:text-6xl md:text-6xl lg:text-7xl md:tracking-tight">
|
||||
<span
|
||||
class="w-full text-transparent bg-clip-text bg-gradient-to-r from-amber-400 via-amber-500 to-amber-500 lg:inline">{{ __('My meetups') }}</span>
|
||||
</h1>
|
||||
<p class="px-0 mb-6 text-lg text-gray-200 md:text-xl lg:px-24">
|
||||
{{ __('Select one or more meetup groups so that you can get access to these groups in the backend.') }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="max-w-7xl mx-auto grid grid-cols-1 sm:grid-cols-2">
|
||||
|
||||
<div class="p-4 w-full">
|
||||
<p class="px-0 mb-6 text-lg text-gray-200 md:text-xl">
|
||||
{{ __('Your current Meetup groups') }}
|
||||
</p>
|
||||
<div class="grid grid-cols-1 gap-2">
|
||||
@foreach($myMeetupNames as $myMeetup)
|
||||
<a href="{{ $myMeetup['link'] }}">
|
||||
<x-badge
|
||||
class="whitespace-nowrap" lg outline white
|
||||
label="{{ $myMeetup['name'] }}"/>
|
||||
</a>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="">
|
||||
<div class="px-10 pt-6 mx-auto max-w-7xl">
|
||||
<div class="bg-21gray p-6 rounded">
|
||||
|
||||
<div>
|
||||
<x-input wire:model="search" placeholder="{{ __('Search') }}"
|
||||
hint="{{ __('please limit your search here') }}">
|
||||
<x-slot name="append">
|
||||
<div class="absolute inset-y-0 right-0 flex items-center p-0.5">
|
||||
<x-button
|
||||
wire:click="$set('search', '')"
|
||||
class="h-full rounded-r-md"
|
||||
black
|
||||
flat
|
||||
squared
|
||||
>
|
||||
<i class="fa-thin fa-xmark"></i>
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
</x-input>
|
||||
</div>
|
||||
|
||||
<div class="mt-6 flow-root">
|
||||
|
||||
<ul role="list" class="-my-5 divide-y divide-gray-200">
|
||||
|
||||
@foreach($meetups as $meetup)
|
||||
|
||||
@php
|
||||
$activeClass = in_array($meetup->id, $myMeetups, true) ? 'font-bold text-amber-500' : 'text-gray-200';
|
||||
@endphp
|
||||
|
||||
<li class="py-4" wire:key="meetup_id_{{ $meetup->id }}">
|
||||
<div class="flex items-center space-x-4">
|
||||
<div class="flex-shrink-0">
|
||||
<img class="h-12 w-12 rounded object-cover"
|
||||
src="{{ $meetup->getFirstMediaUrl('logo') }}"
|
||||
alt="{{ $meetup->name }}">
|
||||
</div>
|
||||
<div class="min-w-0 flex-1">
|
||||
<p class="truncate text-sm font-medium {{ $activeClass }}">{{ $meetup->name }}</p>
|
||||
<p class="truncate text-sm {{ $activeClass }}">{{ $meetup->city->name }}</p>
|
||||
</div>
|
||||
<div>
|
||||
@if(in_array($meetup->id, $myMeetups, true))
|
||||
<x-button
|
||||
primary
|
||||
wire:click="signUpForMeetup({{ $meetup->id }})"
|
||||
>
|
||||
<i class="fa-thin fa-xmark"></i>
|
||||
{{ __('Deselect') }}
|
||||
</x-button>
|
||||
@else
|
||||
<x-button
|
||||
black
|
||||
wire:click="signUpForMeetup({{ $meetup->id }})"
|
||||
>
|
||||
<i class="fa-thin fa-check"></i>
|
||||
{{ __('Select') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,75 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Project Proposal') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for=" md5('image')" :label="__('Main picture')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($projectProposal->getFirstMediaUrl('main'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $projectProposal->getFirstMediaUrl('main') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('projectProposal.name')" :label="__('Name')">
|
||||
<x-input autocomplete="off" wire:model.debounce="projectProposal.name"
|
||||
:placeholder="__('Name')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('projectProposal.name')" :label="__('Intended support in sats')">
|
||||
<x-input type="number" autocomplete="off" wire:model.debounce="projectProposal.support_in_sats"
|
||||
:placeholder="__('Intended support in sats')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('projectProposal.description')">
|
||||
<x-slot name="label">
|
||||
<div>
|
||||
{{ __('Project description') }}
|
||||
</div>
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('Please write a detailed and understandable application text, so that the vote on a possible support can take place.') }}</div>
|
||||
</x-slot>
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="projectProposal.description"/>
|
||||
@error('projectProposal.description') <span
|
||||
class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('save')" label="">
|
||||
<x-button primary wire:click="save">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
|
||||
</div>
|
||||
@@ -1,22 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Submitted projects') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.project-proposal-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,240 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Voting') }}
|
||||
: {{ $projectProposal->name }}</h3>
|
||||
<img class="h-32" src="{{ $projectProposal->getFirstMediaUrl('main') }}" alt="{{ $projectProposal->name }}">
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="grid grid-cols-1 sm:grid-cols-2 gap-2">
|
||||
|
||||
<div class="px-12">
|
||||
<div class="border-b border-gray-200 bg-dark px-4 py-5 sm:px-6">
|
||||
<h3 class="text-base font-semibold leading-6 text-gray-200">{{ __('Submitted by') }}</h3>
|
||||
</div>
|
||||
|
||||
<div class="mx-auto max-w-prose text-base lg:grid lg:max-w-none lg:grid-cols-2 lg:gap-8">
|
||||
<div class="mt-6 flex items-center">
|
||||
<div class="flex-shrink-0">
|
||||
<div>
|
||||
<span class="sr-only text-gray-200">{{ $projectProposal->user->name }}</span>
|
||||
<img class="h-10 w-10 object-cover rounded"
|
||||
src="{{ $projectProposal->user->profile_photo_url }}"
|
||||
alt="{{ $projectProposal->user->name }}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<div class="text-sm font-medium text-gray-200">
|
||||
<div class="text-gray-200">{{ $projectProposal->user->name }}</div>
|
||||
</div>
|
||||
<div class="flex space-x-1 text-sm text-gray-300">
|
||||
<span class="font-bold">{{ __('This project requires') }} </span><span
|
||||
class="font-bold text-amber-500">{{ number_format($projectProposal->support_in_sats, 0, ',', '.') }} {{ __('sats') }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="border-b border-gray-200 bg-dark px-4 py-5 sm:px-6">
|
||||
<h3 class="text-base font-semibold leading-6 text-gray-200">{{ __('Description') }}</h3>
|
||||
</div>
|
||||
|
||||
<div class="prose prose-invert leading-normal">
|
||||
<x-markdown>
|
||||
{!! $projectProposal->description !!}
|
||||
</x-markdown>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sm:mt-5 space-y-6 sm:space-y-5">
|
||||
<div class="w-full flex space-x-4">
|
||||
<x-button lg positive wire:click="yes">
|
||||
{{ __('Yes, support it!') }}
|
||||
</x-button>
|
||||
<x-button lg negative wire:click="no">
|
||||
{{ __('No') }}
|
||||
</x-button>
|
||||
<div>
|
||||
<span class="text-amber-500">{{ __('Your vote') }}:</span>
|
||||
@php
|
||||
$myVote = $projectProposal->votes->where('user_id', auth()->id())->first();
|
||||
@endphp
|
||||
@if($myVote && $myVote->value)
|
||||
<x-badge green>{{ __('Yes') }}</x-badge>
|
||||
@endif
|
||||
@if($myVote && !$myVote->value)
|
||||
<x-badge red>{{ __('No') }}</x-badge>
|
||||
@endif
|
||||
@if(!$myVote)
|
||||
<x-badge>{{ __('not voted yet') }}</x-badge>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<x-input.group :for="md5('vote.reason')" :label="__('Reason')">
|
||||
<x-textarea autocomplete="off" wire:model.debounce="vote.reason"
|
||||
:placeholder="__('Reason')"/>
|
||||
</x-input.group>
|
||||
</div>
|
||||
|
||||
<div wire:ignore>
|
||||
<script src="https://cdn.jsdelivr.net/npm/apexcharts"></script>
|
||||
|
||||
<div
|
||||
x-data="{
|
||||
yes: [{{ $entitledVoters->pluck('votes')->collapse()->where('value', 1)->count() }},{{ $otherVoters->pluck('votes')->collapse()->where('value', 1)->count() }}],
|
||||
no: [{{ $entitledVoters->pluck('votes')->collapse()->where('value', 0)->count() }},{{ $otherVoters->pluck('votes')->collapse()->where('value', 0)->count() }}],
|
||||
labels: ['{{ __('Entitled voters') }}', '{{ __('Other voters') }}',],
|
||||
init() {
|
||||
let chart = new ApexCharts(this.$refs.chart, this.options)
|
||||
chart.render()
|
||||
this.$watch('valuesEligible', () => {
|
||||
chart.updateOptions(this.options)
|
||||
})
|
||||
this.$watch('valuesOther', () => {
|
||||
chart.updateOptions(this.options)
|
||||
})
|
||||
},
|
||||
get options() {
|
||||
return {
|
||||
theme: { palette: 'palette3' },
|
||||
chart: { type: 'bar', toolbar: true, height: 200, stacked: true, stackType: '100%'},
|
||||
xaxis: { categories: this.labels },
|
||||
plotOptions: { bar: { horizontal: true } },
|
||||
series: [
|
||||
{
|
||||
name: 'Yes',
|
||||
data: this.yes,
|
||||
},
|
||||
{
|
||||
name: 'No',
|
||||
data: this.no,
|
||||
},
|
||||
],
|
||||
}
|
||||
}
|
||||
}"
|
||||
class="w-full"
|
||||
>
|
||||
<div x-ref="chart" class="rounded-lg bg-white p-8"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-full grid grid-cols-2">
|
||||
|
||||
<div>
|
||||
<div class="border-b border-gray-200 bg-dark px-4 py-5 sm:px-6">
|
||||
<h3 class="text-base font-semibold leading-6 text-gray-200">{{ __('Entitled voters') }}</h3>
|
||||
</div>
|
||||
|
||||
<ul role="list" class="divide-y divide-gray-200">
|
||||
|
||||
@foreach($entitledVoters as $voter)
|
||||
@php
|
||||
$vote = $voter->votes->first();
|
||||
if (!$vote) {
|
||||
$text = __('not voted yet');
|
||||
} elseif ($vote && !$vote->value) {
|
||||
$text = __('Reason') . ': ' . $voter->votes->first()?->reason;
|
||||
} else {
|
||||
$text = '';
|
||||
}
|
||||
@endphp
|
||||
<li class="flex py-4" wire:key="entitled_vote_{{ $voter->id }}">
|
||||
<img class="h-10 w-10 rounded-full" src="{{ $voter->profile_photo_url }}"
|
||||
alt="">
|
||||
<div class="ml-3">
|
||||
<p class="text-sm font-medium text-gray-200">
|
||||
{{ $voter->name }}
|
||||
@if($voter->votes->first()?->value)
|
||||
<x-badge green>{{ __('Yes') }}</x-badge>
|
||||
@endif
|
||||
@if($voter->votes->first() && !$voter->votes->first()?->value)
|
||||
<x-badge red>{{ __('No') }}</x-badge>
|
||||
@endif
|
||||
</p>
|
||||
<p class="text-sm text-gray-300">
|
||||
{{ $text ?? '' }}
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="border-b border-gray-200 bg-dark px-4 py-5 sm:px-6">
|
||||
<h3 class="text-base font-semibold leading-6 text-gray-200">{{ __('Other voters') }}</h3>
|
||||
</div>
|
||||
|
||||
<ul role="list" class="divide-y divide-gray-200">
|
||||
|
||||
@foreach($otherVoters as $voter)
|
||||
@php
|
||||
$vote = $voter->votes->first();
|
||||
if (!$vote) {
|
||||
$text = __('not voted yet');
|
||||
} elseif ($vote && !$vote->value) {
|
||||
$text = __('Reason') . ': ' . $voter->votes->first()?->reason;
|
||||
} else {
|
||||
$text = '';
|
||||
}
|
||||
@endphp
|
||||
<li class="flex py-4" wire:key="other_vote_{{ $voter->id }}">
|
||||
<img class="h-10 w-10 rounded-full" src="{{ $voter->profile_photo_url }}"
|
||||
alt="">
|
||||
<div class="ml-3">
|
||||
<p class="text-sm font-medium text-gray-200">
|
||||
{{ $voter->name }}
|
||||
@if($voter->votes->first()?->value)
|
||||
<x-badge green>{{ __('Yes') }}</x-badge>
|
||||
@endif
|
||||
@if($voter->votes->first() && !$voter->votes->first()?->value)
|
||||
<x-badge red>{{ __('No') }}</x-badge>
|
||||
@endif
|
||||
</p>
|
||||
<p class="text-sm text-gray-300">
|
||||
{{ $text ?? '' }}
|
||||
</p>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_{{ str($projectProposal->slug)->replace('-', '_') }}"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,22 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('City search') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.city-table :country="$country->code" type="school"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,24 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Courses') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:school.search-by-tag-component :country="$country->code"/>
|
||||
{{-- <livewire:frontend.search-tabs :country="$country->code"/>--}}
|
||||
<livewire:tables.course-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,141 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="flex items-start">
|
||||
<div class="w-full sm:w-1/2">
|
||||
|
||||
@php
|
||||
$locale = \Illuminate\Support\Facades\Cookie::get('lang', 'de');
|
||||
@endphp
|
||||
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ asset('dist/js-year-calendar.min.css') }}"/>
|
||||
<script src="{{ asset('dist/js-year-calendar.min.js') }}"></script>
|
||||
<script src="{{ asset('dist/locales/js-year-calendar.'.$locale.'.js') }}"></script>
|
||||
|
||||
<style>
|
||||
.calendar .calendar-header {
|
||||
background-color: #F7931A;
|
||||
color: white;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.calendar table.month th.month-title {
|
||||
color: #F7931A;
|
||||
}
|
||||
|
||||
.calendar table.month th.day-header {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar table.month td.day .day-content {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar .calendar-header table th:hover {
|
||||
background: #222;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div
|
||||
wire:ignore
|
||||
x-data="{
|
||||
calendar: null,
|
||||
init() {
|
||||
let events = {{ Js::from($events) }};
|
||||
events = events.map(function(e){
|
||||
return {id: e.id, startDate: new Date(e.startDate), endDate: new Date(e.endDate), location: e.location, description: e.description}
|
||||
})
|
||||
|
||||
new Calendar(this.$refs.calendar, {
|
||||
style: 'background',
|
||||
language: '{{ $locale }}',
|
||||
startYear: {{ $year }},
|
||||
dataSource: events,
|
||||
yearChanged: function(e) {
|
||||
@this.set('year', e.currentYear);
|
||||
},
|
||||
clickDay: function(e) {
|
||||
if(e.events.length > 0) {
|
||||
var content = '';
|
||||
var ids = [];
|
||||
|
||||
for(var i in e.events) {
|
||||
ids.push(e.events[i].id);
|
||||
content += '<div class=\'event-tooltip-content\'>'
|
||||
+ '<div class=\'event-name\'>' + e.events[i].location + '</div>'
|
||||
+ '<div class=\'event-location\'>' + e.events[i].description + '</div>'
|
||||
+ '</div>';
|
||||
}
|
||||
console.log(content);
|
||||
|
||||
$wire.call('popover', content, ids.join(','));
|
||||
}
|
||||
},
|
||||
});
|
||||
},
|
||||
}"
|
||||
>
|
||||
<div x-ref="calendar"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hidden sm:inline sm:w-1/2">
|
||||
<div
|
||||
wire:ignore
|
||||
class="w-full flex justify-center"
|
||||
x-data="{
|
||||
init() {
|
||||
let markers = {{ Js::from($markers) }};
|
||||
console.log(markers);
|
||||
|
||||
$('#map').vectorMap({
|
||||
zoomButtons : true,
|
||||
zoomOnScroll: true,
|
||||
map: '{{ $country->code }}_merc',
|
||||
backgroundColor: 'transparent',
|
||||
markers: markers.map(function(h){ return {name: h.name, latLng: h.coords} }),
|
||||
onMarkerClick: function(event, index) {
|
||||
$wire.call('filterByMarker', markers[index].id)
|
||||
},
|
||||
markerStyle: {
|
||||
initial: {
|
||||
image: '{{ asset('img/btc.png') }}',
|
||||
}
|
||||
},
|
||||
regionStyle: {
|
||||
initial: {
|
||||
fill: '#a4a4a4'
|
||||
},
|
||||
hover: {
|
||||
'fill-opacity': 1,
|
||||
cursor: 'default'
|
||||
},
|
||||
}
|
||||
});
|
||||
}
|
||||
}"
|
||||
>
|
||||
<div id="map" style="width: 100%; height: 800px" class="bg-gray-900"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Course Events') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.event-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,127 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Course Event') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('course_id')" :label="__('Course')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Course') }}
|
||||
</div>
|
||||
<x-button xs href="{{ route('course.form.course') }}">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Register course') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
:clearable="false"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="courseEvent.course_id"
|
||||
:placeholder="__('Course')"
|
||||
:async-data="[
|
||||
'api' => route('api.courses.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
'params' => ['user_id' => auth()->id()], // default is []
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'image']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('venue_id')" :label="__('Venue')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('Venue') }}
|
||||
</div>
|
||||
<x-button xs href="{{ route('venue.form') }}">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('Create venue') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
:clearable="false"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="courseEvent.venue_id"
|
||||
:placeholder="__('Venue')"
|
||||
:async-data="[
|
||||
'api' => route('api.venues.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
'params' => ['user_id' => auth()->id()], // default is []
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'flag']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('courseEvent.from')" :label="__('From')">
|
||||
<x-datetime-picker
|
||||
:clearable="false"
|
||||
time-format="24"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="courseEvent.from"
|
||||
display-format="DD-MM-YYYY HH:mm"
|
||||
:placeholder="__('To')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('courseEvent.to')" :label="__('To')">
|
||||
<x-datetime-picker
|
||||
:clearable="false"
|
||||
time-format="24"
|
||||
timezone="UTC"
|
||||
user-timezone="{{ config('app.user-timezone') }}"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="courseEvent.to"
|
||||
display-format="DD-MM-YYYY HH:mm"
|
||||
:placeholder="__('To')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('courseEvent.link')" :label="__('Link')">
|
||||
<x-input autocomplete="off" wire:model.debounce="courseEvent.link"
|
||||
:placeholder="__('Link')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('save')" label="">
|
||||
<x-button primary wire:click="submit">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -1,107 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Course') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('image')" :label="__('Logo')">
|
||||
<div class="py-4">
|
||||
@if ($image && str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
@endif
|
||||
@if ($course->getFirstMediaUrl('logo'))
|
||||
<div class="text-gray-200">{{ __('Current picture') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $course->getFirstMediaUrl('logo') }}">
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" wire:model="image">
|
||||
@error('image') <span class="text-red-500">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('lecturer_id')" :label="__('Lecturer')">
|
||||
<x-select
|
||||
:clearable="false"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="course.lecturer_id"
|
||||
:placeholder="__('Lecturer')"
|
||||
:async-data="[
|
||||
'api' => route('api.lecturers.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
'params' => ['user_id' => auth()->id()], // default is []
|
||||
]"
|
||||
:template="[
|
||||
'name' => 'user-option',
|
||||
'config' => ['src' => 'image']
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('course.name')" :label="__('Name')">
|
||||
<x-input autocomplete="off" wire:model.debounce="course.name"
|
||||
:placeholder="__('Name')"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('selectedTags')" :label="__('Tags')">
|
||||
<div class="py-2 flex flex-wrap items-center space-x-1">
|
||||
@foreach($tags as $tag)
|
||||
<div class="cursor-pointer" wire:key="tag{{ $loop->index }}"
|
||||
wire:click="selectTag('{{ $tag->name }}')">
|
||||
@if(collect($selectedTags)->contains($tag->name))
|
||||
<x-badge
|
||||
amber>
|
||||
{{ $tag->name }}
|
||||
</x-badge>
|
||||
@else
|
||||
<x-badge
|
||||
black>
|
||||
{{ $tag->name }}
|
||||
</x-badge>
|
||||
@endif
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('course.description')" :label="__('Description')">
|
||||
<div
|
||||
class="text-amber-500 text-xs py-2">{{ __('For images in Markdown, please use eg. Imgur or another provider.') }}</div>
|
||||
<x-input.simple-mde wire:model.defer="course.description"/>
|
||||
@error('course.description') <span
|
||||
class="text-red-500 py-2">{{ $message }}</span> @enderror
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('save')" label="">
|
||||
<x-button primary wire:click="submit">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/easymde/dist/easymde.min.js"></script>
|
||||
</div>
|
||||
@@ -1,205 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12 mt-8">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4">
|
||||
<div class="flex flex-col sm:flex-row sm:space-x-6 justify-between">
|
||||
<div class="sm:w-2/3 flex flex-col">
|
||||
<h1 class="mb-6 text-xl font-extrabold leading-none tracking-normal text-gray-200 sm:text-6xl md:text-6xl lg:text-7xl md:tracking-tight">
|
||||
<span
|
||||
class="text-transparent bg-clip-text bg-gradient-to-r from-amber-400 via-amber-500 to-amber-200">{{ $lecturer->name }}</span><br
|
||||
class="lg:block hidden">
|
||||
{{ $lecturer->subtitle }}
|
||||
</h1>
|
||||
<div class="px-0 mb-6 text-lg text-gray-200 md:text-xl">
|
||||
{{ $lecturer->intro }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="sm:w-1/3 p-4">
|
||||
<img class="max-h-64" src="{{ $lecturer->getFirstMediaUrl('avatar') }}" alt="Avatar">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4">
|
||||
|
||||
<section class="h-auto px-10 py-16">
|
||||
<div class="max-w-3xl mx-auto space-y-4 sm:text-center">
|
||||
<h2 class="text-4xl sm:text-5xl font-semibold text-white">
|
||||
{{ __('Courses') }}
|
||||
</h2>
|
||||
<p class="text-gray-400 text-lg sm:text-xl leading-normal">
|
||||
{{ __('All courses of :name', ['name' => $lecturer->name]) }}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<ul role="list" class="grid grid-cols-1 gap-6 sm:grid-cols-2 md:grid-cols-3 xl:grid-cols-4">
|
||||
@foreach($courseEvents as $courseEvent)
|
||||
@php
|
||||
$activeClass = $activeEvent === $courseEvent->id ? 'bg-gradient-to-r from-amber-800 via-amber-600 to-amber-500' : 'bg-amber-500';
|
||||
@endphp
|
||||
<li id="courseEventId_{{ $courseEvent->id }}"
|
||||
class="{{ $activeClass }} col-span-1 flex flex-col divide-y divide-gray-200 rounded-lg text-center shadow-2xl">
|
||||
<div class="flex flex-1 flex-col p-8">
|
||||
<img class="mx-auto h-32 w-32 object-contain flex-shrink-0 rounded"
|
||||
src="{{ $courseEvent->venue->getFirstMediaUrl('images') }}"
|
||||
alt="{{ $courseEvent->course->name }}">
|
||||
<h3 class="mt-1 text-xl font-medium text-gray-900 truncate">{{ $courseEvent->from->asDate() }}</h3>
|
||||
<h3 class="mt-1 text-xl font-medium text-gray-900 truncate">{{ $courseEvent->venue->city->name }}</h3>
|
||||
<h3 class="mt-1 text-xl font-medium text-gray-900 truncate">{{ $courseEvent->venue->name }}</h3>
|
||||
<dl class="mt-1 flex flex-grow flex-col justify-between">
|
||||
<div x-data="{ active: 2 }" class="mx-auto max-w-3xl w-full space-y-4">
|
||||
<div x-data="{
|
||||
id: 1,
|
||||
get expanded() {
|
||||
return this.active === this.id
|
||||
},
|
||||
set expanded(value) {
|
||||
this.active = value ? this.id : null
|
||||
},
|
||||
}"
|
||||
role="region" class="rounded-lg bg-white shadow">
|
||||
<h2>
|
||||
<button
|
||||
x-on:click="expanded = !expanded"
|
||||
:aria-expanded="expanded"
|
||||
class="flex w-full items-center justify-between px-6 py-4 text-xl font-bold"
|
||||
>
|
||||
<span>{{ __('Description') }}</span>
|
||||
<span x-show="expanded" aria-hidden="true" class="ml-4">−</span>
|
||||
<span x-show="!expanded" aria-hidden="true" class="ml-4">+</span>
|
||||
</button>
|
||||
</h2>
|
||||
<div x-show="expanded" x-collapse>
|
||||
<div
|
||||
class="px-6 pb-4 text-left">{!! nl2br($courseEvent->course->description) !!}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<dd class="mt-3 flex flex-col space-y-1">
|
||||
@foreach($courseEvent->course->tags as $tag)
|
||||
<span
|
||||
class="rounded-full bg-21gray px-2 py-1 text-xs font-medium text-gray-200">{{ $tag->name }}</span>
|
||||
@endforeach
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<div>
|
||||
<div class="-mt-px flex divide-x divide-gray-200">
|
||||
<div class="-ml-px flex w-0 flex-1">
|
||||
<a target="_blank" href="{{ $courseEvent->link }}"
|
||||
class="relative inline-flex w-0 flex-1 items-center justify-center rounded-br-lg border border-transparent py-4 text-sm font-medium text-gray-700 hover:text-gray-500">
|
||||
<i class="text-gray-100 text-2xl fa-thin fa-right-to-bracket"></i>
|
||||
<span class="ml-3 text-gray-100 text-2xl">{{ __('Register') }}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<section class="h-auto px-10 py-16">
|
||||
<div class="max-w-3xl mx-auto space-y-4 sm:text-center">
|
||||
<h2 class="text-4xl sm:text-5xl font-semibold text-white">
|
||||
{{ __('Events') }}
|
||||
</h2>
|
||||
<p class="text-gray-400 text-lg sm:text-xl leading-normal">
|
||||
{{ __('Here you can see all events of :name.', ['name' => $lecturer->name]) }}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<div class="w-full">
|
||||
|
||||
@php
|
||||
$locale = \Illuminate\Support\Facades\Cookie::get('lang', 'de');
|
||||
@endphp
|
||||
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="{{ asset('dist/js-year-calendar.min.css') }}"/>
|
||||
<script src="{{ asset('dist/js-year-calendar.min.js') }}"></script>
|
||||
<script src="{{ asset('dist/locales/js-year-calendar.'.$locale.'.js') }}"></script>
|
||||
|
||||
<style>
|
||||
.calendar .calendar-header {
|
||||
background-color: #F7931A;
|
||||
color: white;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.calendar table.month th.month-title {
|
||||
color: #F7931A;
|
||||
}
|
||||
|
||||
.calendar table.month th.day-header {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar table.month td.day .day-content {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.calendar .calendar-header table th:hover {
|
||||
background: #222;
|
||||
}
|
||||
</style>
|
||||
<div
|
||||
wire:ignore
|
||||
x-data="{
|
||||
calendar: null,
|
||||
init() {
|
||||
let events = {{ Js::from($events) }};
|
||||
events = events.map(function(e){
|
||||
return {id: e.id, startDate: new Date(e.startDate), endDate: new Date(e.endDate), location: e.location, description: e.description}
|
||||
})
|
||||
|
||||
new Calendar(this.$refs.calendar, {
|
||||
style: 'background',
|
||||
language: '{{ $locale }}',
|
||||
startYear: {{ date('Y') }},
|
||||
dataSource: events,
|
||||
yearChanged: function(e) {
|
||||
@this.set('year', e.currentYear);
|
||||
},
|
||||
clickDay: function(e) {
|
||||
if(e.events.length > 0) {
|
||||
$wire.call('showEvent', e.events[0].id);
|
||||
document.getElementById('courseEventId_'+e.events[0].id).scrollIntoView();
|
||||
}
|
||||
},
|
||||
});
|
||||
},
|
||||
}"
|
||||
>
|
||||
<div x-ref="calendar"></div>
|
||||
</div>
|
||||
|
||||
<div class="p-4 w-full flex justify-end">
|
||||
<x-button :href="route('welcome')" primary lg class="whitespace-nowrap">
|
||||
<i class="fa fa-thin fa-arrow-left mr-2"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_lecturer_{{ str($lecturer->slug)->replace('-', '_') }}"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,22 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Lecturers/Content Creators') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.lecturer-table :country="$country->code"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,52 +0,0 @@
|
||||
<div
|
||||
class="flex overflow-auto relative flex-wrap gap-x-5 gap-y-6 justify-center p-0 mx-auto mt-8 mb-3 w-full font-normal leading-6 text-white align-baseline border-0 border-solid md:mx-auto md:mb-0 md:max-w-screen-md"
|
||||
style="max-width: 1350px; font-size: 128%; background-position: 0px center; max-height: 500px; list-style: outside;"
|
||||
>
|
||||
@foreach($tags->sortBy('name') as $tag)
|
||||
<div
|
||||
class="flex flex-1 justify-center p-0 m-0 leading-6 text-center align-baseline border-0 border-solid"
|
||||
style="font-size: 128%; background-position: 0px center; list-style: outside;"
|
||||
>
|
||||
@php
|
||||
$isActive = collect($courses)->pluck('tag')->collapse()->contains($tag->name);
|
||||
$activeClass = $isActive ? 'text-amber-500 bg-amber-500' : 'bg-blue-50 text-white hover:text-amber-500';
|
||||
@endphp
|
||||
<a
|
||||
class="{{ $activeClass }} flex relative flex-col flex-shrink-0 justify-between py-1 px-3 w-full h-20 border-0 border-solid duration-300 ease-in-out cursor-pointer bg-opacity-[0.07]"
|
||||
href="{{ $isActive ? '#table' : route('school.table.course', ['country' => $country, 'courses' => ['filters' => ['tag' => [$tag->name]]], '#table']) }}"
|
||||
>
|
||||
<div
|
||||
class="flex flex-1 items-center p-0 m-0 text-center align-baseline border-0 border-solid"
|
||||
>
|
||||
<div
|
||||
class="flex flex-shrink-0 justify-center p-0 my-0 mr-4 ml-0 align-baseline border-0 border-solid"
|
||||
>
|
||||
<i class="fa fa-thin fa-{{ $tag->icon }} text-4xl"></i>
|
||||
</div>
|
||||
<div
|
||||
class="flex justify-between p-0 m-0 w-full align-baseline border-0 border-solid md:block lg:w-auto"
|
||||
>
|
||||
<h2
|
||||
class="p-0 m-0 font-sans text-base font-semibold tracking-wide leading-tight text-left align-baseline border-0 border-solid"
|
||||
style="background-position: 0px center; list-style: outside;"
|
||||
>
|
||||
{{ $tag->name }}
|
||||
</h2>
|
||||
<div
|
||||
class="hidden p-0 m-0 text-sm leading-3 text-left text-blue-100 align-baseline border-0 border-solid md:block md:text-blue-100 whitespace-nowrap"
|
||||
>
|
||||
{{ __('Lecturers') }}
|
||||
<span
|
||||
class="inline-block relative top-px py-0 px-1 m-0 text-xs leading-4 align-baseline border-0 border-solid"
|
||||
>
|
||||
•
|
||||
</span>
|
||||
{{ __('Courses') }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</a
|
||||
>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@@ -1,22 +0,0 @@
|
||||
<div class="bg-21gray flex flex-col h-screen justify-between">
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="$country"/>
|
||||
{{-- MAIN --}}
|
||||
<section class="w-full mb-12">
|
||||
<div class="max-w-screen-2xl mx-auto px-2 sm:px-10 space-y-4" id="table">
|
||||
<div class="md:flex md:items-center md:justify-between">
|
||||
<div class="min-w-0 flex-1">
|
||||
<h2 class="text-2xl font-bold leading-7 text-white sm:truncate sm:text-3xl sm:tracking-tight">
|
||||
{{ __('Venues') }}
|
||||
</h2>
|
||||
</div>
|
||||
<div class="mt-4 flex md:mt-0 md:ml-4">
|
||||
{{----}}
|
||||
</div>
|
||||
</div>
|
||||
<livewire:tables.venue-table :country="$country->code" :manage="$manage"/>
|
||||
</div>
|
||||
</section>
|
||||
{{-- FOOTER --}}
|
||||
<livewire:frontend.footer/>
|
||||
</div>
|
||||
@@ -1,87 +0,0 @@
|
||||
<div class="grid min-h-full grid-cols-1 grid-rows-[1fr,auto,1fr] bg-white lg:grid-cols-[max(50%,36rem),1fr]">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vegas/2.5.4/vegas.min.css"
|
||||
integrity="sha512-fSKum0u74TzF+eAXxBS0oIp3LlON1gd++1rifA0ZnQWKP2JXbCdomS2k0BDEM7v0se7mQOpOwedRw/lRsSPAaA=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"/>
|
||||
|
||||
<header class="mx-auto w-full max-w-7xl px-6 pt-6 sm:pt-10 lg:col-span-2 lg:col-start-1 lg:row-start-1 lg:px-8">
|
||||
<a href="/">
|
||||
<span class="sr-only">Bitcoin Team 218 </span>
|
||||
<img class="h-10 w-auto sm:h-12" src="{{ asset('img/bsc/logo.jpg') }}"
|
||||
alt="logo">
|
||||
</a>
|
||||
</header>
|
||||
<main class="mx-auto w-full max-w-7xl px-6 py-4 sm:py-4 lg:col-span-2 lg:col-start-1 lg:row-start-2 lg:px-8">
|
||||
<div class="max-w-lg">
|
||||
<p class="text-base font-semibold leading-8 text-indigo-600">Start am 17.06.2023 09:30 Uhr</p>
|
||||
<h1 class="mt-4 text-3xl font-bold tracking-tight text-gray-900 sm:text-5xl">Baltic Sea Circle Rally
|
||||
Bitcoin Team 218</h1>
|
||||
<p class="mt-6 text-base leading-7 text-gray-600">Besucht das Bitcoin Team 218 von Daktari und
|
||||
Cercatrova.</p>
|
||||
<p class="mt-6 text-base leading-7 text-gray-600">Gut Barsthorst, Hamburg</p>
|
||||
<p class="mt-6 text-base leading-7 text-gray-600">
|
||||
<x-button primary lg href="https://t.me/rallyejukebox"
|
||||
target="_blank">
|
||||
<i class="fa-thin fa-music"></i>
|
||||
Musik Jukebox
|
||||
</x-button>
|
||||
</p>
|
||||
<p class="mt-6 text-base leading-7 text-gray-600">
|
||||
<x-button primary lg href="https://findpenguins.com/superlative-adventure-club/live?rallye=2023-bsc"
|
||||
target="_blank">
|
||||
<i class="fa-thin fa-map"></i>
|
||||
Tracking
|
||||
</x-button>
|
||||
</p>
|
||||
<div class="mt-6">
|
||||
<h1 class="mt-4 text-3xl font-bold tracking-tight text-gray-900 sm:text-5xl">⚡ Lightning Hupe</h1>
|
||||
<a href="lightning:LNURL1DP68GURN8GHJ7MRWVF5HGUEWV4EX26T8DE5HX6R0WF5H5MMWWSH8S7T69AKXUATJD3JX2ANFVDJJ7CTSDYHHVV30D3H82UNV9AZ5ZAZ9FEVKVNZSV3PYZEZRW3SK2WTHVF2KZ0MSD9HR6VFJYESK6MM4DE6R6VPW8QNXGATJV96XJMMW85ERZV332Q48N4">
|
||||
<img src="{{ asset('img/bsc/qr.png') }}" alt="qr">
|
||||
</a>
|
||||
<p class="text-xs">
|
||||
Proof Of Honk - LN Fanfare Team 218
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<div id="me" class="hidden lg:relative lg:col-start-2 lg:row-start-1 lg:row-end-4 lg:block">
|
||||
<div></div>
|
||||
</div>
|
||||
<script>
|
||||
document.addEventListener(
|
||||
'livewire:load',
|
||||
function () {
|
||||
$('#me')
|
||||
.vegas({
|
||||
delay: 10000,
|
||||
timer: true,
|
||||
shuffle: false,
|
||||
firstTransition: 'blur',
|
||||
firstTransitionDuration: 5000,
|
||||
transition: 'blur',
|
||||
transitionDuration: 2000,
|
||||
slides: [
|
||||
{ src: '/img/bsc/1.jpg' },
|
||||
{ src: '/img/bsc/2.jpg' },
|
||||
{ src: '/img/bsc/3.jpg' },
|
||||
{ src: '/img/bsc/4.jpg' }
|
||||
]
|
||||
})
|
||||
}
|
||||
)
|
||||
</script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/vegas/2.5.4/vegas.min.js"
|
||||
integrity="sha512-lYAcY5E6LZVeNB3Pky37SxbYKzo8A68MzKFoPg5oTuolhRm36D+YRvkrAQS4JuKsaGYeJ5KA5taMEtpNlPUeOA=="
|
||||
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
|
||||
@push('modals')
|
||||
<div wire:ignore class="z-50 hidden md:block">
|
||||
<script
|
||||
src="{{ asset('dist/einundzwanzig.chat.js') }}"
|
||||
data-website-owner-pubkey="daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6"
|
||||
data-chat-type="GLOBAL"
|
||||
data-chat-tags="#einundzwanzig_portal_bsc }}"
|
||||
data-relays="wss://nostr.einundzwanzig.space,wss://nostr.easify.de,wss://nostr.mom,wss://relay.damus.io,wss://relay.snort.social"
|
||||
></script>
|
||||
<link rel="stylesheet" href="{{ asset('dist/einundzwanzig.chat.css') }}">
|
||||
</div>
|
||||
@endpush
|
||||
</div>
|
||||
@@ -1,115 +0,0 @@
|
||||
<div>
|
||||
{{-- HEADER --}}
|
||||
<livewire:frontend.header :country="null"/>
|
||||
<div class="container p-4 mx-auto bg-21gray my-2">
|
||||
|
||||
<div class="pb-5 flex flex-row justify-between">
|
||||
<h3 class="text-lg font-medium leading-6 text-gray-200">{{ __('Venue') }}</h3>
|
||||
<div class="flex flex-row space-x-2 items-center">
|
||||
{{--<div>
|
||||
@if($venue->id)
|
||||
<x-button negative wire:click="deleteMe">
|
||||
<i class="fa fa-thin fa-trash"></i>
|
||||
{{ __('Delete') }}
|
||||
</x-button>
|
||||
@endif
|
||||
</div>--}}
|
||||
<div>
|
||||
<x-button :href="$fromUrl">
|
||||
<i class="fa fa-thin fa-arrow-left"></i>
|
||||
{{ __('Back') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="space-y-8 divide-y divide-gray-700 pb-24">
|
||||
<div class="space-y-8 divide-y divide-gray-700 sm:space-y-5">
|
||||
<div class="mt-6 sm:mt-5 space-y-6 sm:space-y-5">
|
||||
|
||||
<x-input.group :for="md5('image')" :label="__('Images')">
|
||||
<div class="py-4">
|
||||
@if ($images)
|
||||
<div class="grid grid-cols-4 gap-1">
|
||||
@foreach($images as $image)
|
||||
@if(str($image->getMimeType())->contains(['image/jpeg','image/jpg', 'image/png', 'image/gif', 'image/svg+xml', 'image/webp']))
|
||||
<div>
|
||||
<div class="text-gray-200">{{ __('Preview') }}:</div>
|
||||
<img class="h-48 object-contain" src="{{ $image->temporaryUrl() }}">
|
||||
</div>
|
||||
@endif
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
@if ($venue->getMedia('images'))
|
||||
<div class="text-gray-200">{{ __('Current pictures') }}:</div>
|
||||
<div class="grid grid-cols-4 gap-1">
|
||||
@foreach($venue->getMedia('images') as $image)
|
||||
<div class="space-y-2" wire:key="image_{{ $image->id }}"
|
||||
wire:click="deleteMedia({{ $image->id }})">
|
||||
<div class="flex justify-center">
|
||||
<img class="h-48 object-contain" src="{{ $image->getUrl() }}">
|
||||
</div>
|
||||
<div class="flex justify-center">
|
||||
<x-button xs>
|
||||
<i class="fa-thin fa-trash"></i>
|
||||
{{ __('Delete') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<input class="text-gray-200" type="file" multiple wire:model="images">
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('city_id')">
|
||||
<x-slot name="label">
|
||||
<div class="flex flex-row space-x-4 items-center">
|
||||
<div>
|
||||
{{ __('City') }}
|
||||
</div>
|
||||
<x-button xs href="{{ route('city.form') }}">
|
||||
<i class="fa fa-thin fa-plus"></i>
|
||||
{{ __('New City') }}
|
||||
</x-button>
|
||||
</div>
|
||||
</x-slot>
|
||||
<x-select
|
||||
:clearable="false"
|
||||
autocomplete="off"
|
||||
wire:model.debounce="venue.city_id"
|
||||
:placeholder="__('City/Area')"
|
||||
:async-data="[
|
||||
'api' => route('api.cities.index'),
|
||||
'method' => 'GET', // default is GET
|
||||
]"
|
||||
option-label="name"
|
||||
option-value="id"
|
||||
option-description="country.name"
|
||||
/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('venue.name')" :label="__('Name')">
|
||||
<x-input autocomplete="off" wire:model.debounce="venue.name"
|
||||
:placeholder="__('Name')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('venue.street')" :label="__('Address')">
|
||||
<x-input autocomplete="off" wire:model.debounce="venue.street"
|
||||
:placeholder="__('Address')"/>
|
||||
</x-input.group>
|
||||
|
||||
<x-input.group :for="md5('action')" :label="__('Action')">
|
||||
<x-button primary wire:click="submit">
|
||||
<i class="fa fa-thin fa-save"></i>
|
||||
{{ __('Save') }}
|
||||
</x-button>
|
||||
</x-input.group>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,104 +0,0 @@
|
||||
<x-jet-authentication-card>
|
||||
<x-slot name="logo">
|
||||
<x-jet-authentication-card-logo/>
|
||||
</x-slot>
|
||||
|
||||
<div>
|
||||
|
||||
<div>
|
||||
|
||||
<div class="text-center text-2xl text-gray-800 mt-6">
|
||||
{{ __('Now log in with a new wallet') }} ⚡
|
||||
</div>
|
||||
|
||||
<div class="rounded-md bg-red-50 p-4 my-2">
|
||||
<div class="flex">
|
||||
<div class="flex-shrink-0">
|
||||
<svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
|
||||
<path fill-rule="evenodd"
|
||||
d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="ml-3">
|
||||
<h3 class="text-sm font-medium text-red-800">{{ __('Caution') }}</h3>
|
||||
<div class="mt-2 text-sm text-red-700">
|
||||
<ul role="list" class="list-disc space-y-1 pl-5">
|
||||
<li>{{ __('You overwrite your user\'s public key and then have to log in with the wallet, which you now use to scan or log in.') }}</li>
|
||||
<li>{{ __('You are logged in as:') }} {{ auth()->user()->name }}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if(!$confirmed)
|
||||
<div>
|
||||
<x-button primary wire:click="confirm">
|
||||
<i class="fa-thin fa-check"></i>
|
||||
{{ __('Confirm') }}
|
||||
</x-button>
|
||||
<x-button secondary href="/">
|
||||
<i class="fa-thin fa-times"></i>
|
||||
{{ __('Cancel') }}
|
||||
</x-button>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@if($confirmed)
|
||||
<div class="flex justify-center" wire:key="qrcode">
|
||||
<a href="lightning:{{ $this->lnurl }}">
|
||||
<img src="{{ 'data:image/png;base64, '. $this->qrCode }}" alt="qrcode">
|
||||
</a>
|
||||
</div>
|
||||
<div class="my-2 flex justify-center font-mono break-all">
|
||||
<input class="w-full" readonly wire:key="lnurl" onClick="this.select();"
|
||||
value="lightning:{{ $this->lnurl }}"/>
|
||||
</div>
|
||||
<div class="flex justify-between w-full">
|
||||
<div
|
||||
x-data="{
|
||||
textToCopy: 'lightning:{{ $this->lnurl }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('URL copied!') }}',icon:'success'});"
|
||||
>
|
||||
<x-button
|
||||
black
|
||||
>
|
||||
<i class="fa fa-thin fa-clipboard"></i>
|
||||
{{ __('Copy') }}
|
||||
</x-button>
|
||||
</div>
|
||||
<div
|
||||
x-data="{
|
||||
textToCopy: 'lightning:{{ $this->lnurl }}',
|
||||
}"
|
||||
@click.prevent="window.navigator.clipboard.writeText(textToCopy);window.$wireui.notify({title:'{{ __('URL copied!') }}',icon:'success'});"
|
||||
>
|
||||
<x-button
|
||||
primary
|
||||
black
|
||||
:href="'lightning:'.$this->lnurl"
|
||||
>
|
||||
{{ __('Click to connect') }}
|
||||
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 512 512"
|
||||
height="1em" width="1em" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"
|
||||
d="M461.81 53.81a4.4 4.4 0 00-3.3-3.39c-54.38-13.3-180 34.09-248.13 102.17a294.9 294.9 0 00-33.09 39.08c-21-1.9-42-.3-59.88 7.5-50.49 22.2-65.18 80.18-69.28 105.07a9 9 0 009.8 10.4l81.07-8.9a180.29 180.29 0 001.1 18.3 18.15 18.15 0 005.3 11.09l31.39 31.39a18.15 18.15 0 0011.1 5.3 179.91 179.91 0 0018.19 1.1l-8.89 81a9 9 0 0010.39 9.79c24.9-4 83-18.69 105.07-69.17 7.8-17.9 9.4-38.79 7.6-59.69a293.91 293.91 0 0039.19-33.09c68.38-68 115.47-190.86 102.37-247.95zM298.66 213.67a42.7 42.7 0 1160.38 0 42.65 42.65 0 01-60.38 0z"></path>
|
||||
<path fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="32"
|
||||
d="M109.64 352a45.06 45.06 0 00-26.35 12.84C65.67 382.52 64 448 64 448s65.52-1.67 83.15-19.31A44.73 44.73 0 00160 402.32"></path>
|
||||
</svg>
|
||||
</x-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="pt-12">
|
||||
{{ __('Scan this code or copy & paste it to your lightning wallet. Or click to login with your wallet.') }}
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div wire:poll="checkAuth" wire:key="checkAuth"></div>
|
||||
</x-jet-authentication-card>
|
||||
Reference in New Issue
Block a user