mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Added warning when leaving page with unsaved work
This commit is contained in:
parent
016b21584e
commit
a6bd9d30be
4
.gitignore
vendored
4
.gitignore
vendored
@ -12,12 +12,10 @@
|
|||||||
/bootstrap/environment.php
|
/bootstrap/environment.php
|
||||||
/vendor
|
/vendor
|
||||||
/.env.development.php
|
/.env.development.php
|
||||||
/composer.phar
|
|
||||||
/composer.lock
|
|
||||||
/.DS_Store
|
/.DS_Store
|
||||||
/Thumbs.db
|
/Thumbs.db
|
||||||
/ninja.sublime-project
|
/ninja.sublime-project
|
||||||
/ninja.sublime-workspace
|
/ninja.sublime-workspace
|
||||||
/tests/_log
|
/tests/_log
|
||||||
.idea
|
.idea
|
||||||
.project
|
.project
|
@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddRememberToken extends Migration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('users', function($table)
|
||||||
|
{
|
||||||
|
$table->string('remember_token', 100)->nullable();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('users', function($table)
|
||||||
|
{
|
||||||
|
$table->dropColumn('remember_token');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -310,5 +310,7 @@ return array(
|
|||||||
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -310,4 +310,6 @@ return array(
|
|||||||
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -309,5 +309,7 @@ return array(
|
|||||||
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -309,6 +309,8 @@ return array(
|
|||||||
'pro_plan_product' => 'Plan Pro',
|
'pro_plan_product' => 'Plan Pro',
|
||||||
'pro_plan_description' => 'Inscription d\'une durée d\'un an au Plan Pro d\'Invoice ninja',
|
'pro_plan_description' => 'Inscription d\'une durée d\'un an au Plan Pro d\'Invoice ninja',
|
||||||
'pro_plan_success' => 'Merci pour votre inscription ! Une fois la facture réglée, votre adhésion au Plan Pro commencera.',
|
'pro_plan_success' => 'Merci pour votre inscription ! Une fois la facture réglée, votre adhésion au Plan Pro commencera.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -310,5 +310,7 @@ return array(
|
|||||||
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -310,5 +310,7 @@ return array(
|
|||||||
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -298,5 +298,7 @@ return array(
|
|||||||
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
'pro_plan_description' => 'One year enrollment in the Invoice Ninja Pro Plan.',
|
||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -17,6 +17,11 @@ class Utils
|
|||||||
return $_SERVER['SERVER_NAME'] == 'www.invoiceninja.com';
|
return $_SERVER['SERVER_NAME'] == 'www.invoiceninja.com';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function isNinjaDev()
|
||||||
|
{
|
||||||
|
return isset($_ENV['NINJA_DEV']) && $_ENV['NINJA_DEV'];
|
||||||
|
}
|
||||||
|
|
||||||
public static function basePath()
|
public static function basePath()
|
||||||
{
|
{
|
||||||
return substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/') + 1);
|
return substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/') + 1);
|
||||||
|
@ -138,4 +138,19 @@ class User extends ConfideUser implements UserInterface, RemindableInterface
|
|||||||
{
|
{
|
||||||
return $this->isPro() ? MAX_NUM_CLIENTS_PRO : MAX_NUM_CLIENTS;
|
return $this->isPro() ? MAX_NUM_CLIENTS_PRO : MAX_NUM_CLIENTS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getRememberToken()
|
||||||
|
{
|
||||||
|
return $this->remember_token;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRememberToken($value)
|
||||||
|
{
|
||||||
|
$this->remember_token = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRememberTokenName()
|
||||||
|
{
|
||||||
|
return 'remember_token';
|
||||||
|
}
|
||||||
}
|
}
|
@ -312,6 +312,4 @@ if (Auth::check() && Auth::user()->id === 1)
|
|||||||
{
|
{
|
||||||
Auth::loginUsingId(1);
|
Auth::loginUsingId(1);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//dd(Session::has(REQUESTED_PRO_PLAN));
|
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
{{ Former::open_for_files()->addClass('col-md-10 col-md-offset-1')->rules(array(
|
{{ Former::open_for_files()->addClass('col-md-10 col-md-offset-1 warn-on-exit')->rules(array(
|
||||||
'name' => 'required',
|
'name' => 'required',
|
||||||
'email' => 'email|required'
|
'email' => 'email|required'
|
||||||
)); }}
|
)); }}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
@parent
|
@parent
|
||||||
|
|
||||||
{{ Former::open('company/import_export') }}
|
{{ Former::open('company/import_export')->addClass('warn-on-exit') }}
|
||||||
{{ Former::legend('import_clients') }}
|
{{ Former::legend('import_clients') }}
|
||||||
|
|
||||||
@if ($headers)
|
@if ($headers)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
@parent
|
@parent
|
||||||
|
|
||||||
{{ Former::open()->addClass('col-md-8 col-md-offset-2') }}
|
{{ Former::open()->addClass('col-md-8 col-md-offset-2 warn-on-exit') }}
|
||||||
{{ Former::populate($account) }}
|
{{ Former::populate($account) }}
|
||||||
{{ Former::populateField('notify_sent', intval(Auth::user()->notify_sent)) }}
|
{{ Former::populateField('notify_sent', intval(Auth::user()->notify_sent)) }}
|
||||||
{{ Former::populateField('notify_viewed', intval(Auth::user()->notify_viewed)) }}
|
{{ Former::populateField('notify_viewed', intval(Auth::user()->notify_viewed)) }}
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
@parent
|
@parent
|
||||||
|
|
||||||
{{ Former::open()->addClass('col-md-8 col-md-offset-2') }}
|
{{ Former::open()->addClass('col-md-8 col-md-offset-2 warn-on-exit') }}
|
||||||
{{ Former::populate($account) }}
|
{{ Former::populate($account) }}
|
||||||
|
|
||||||
{{ Former::legend('Payment Gateway') }}
|
{{ Former::legend('Payment Gateway') }}
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<!--<h3>{{ $title }} Client</h3>-->
|
<!--<h3>{{ $title }} Client</h3>-->
|
||||||
|
|
||||||
{{ Former::open($url)->addClass('col-md-12 main_form')->method($method)->rules(array(
|
{{ Former::open($url)->addClass('col-md-12 warn-on-exit')->method($method)->rules(array(
|
||||||
'email' => 'email|required'
|
'email' => 'email|required'
|
||||||
)); }}
|
)); }}
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
|
|
||||||
{{ Former::open($url)->addClass('col-md-10 col-md-offset-1 main_form')->method($method)->rules(array(
|
{{ Former::open($url)->addClass('col-md-10 col-md-offset-1 warn-on-exit')->method($method)->rules(array(
|
||||||
'client' => 'required',
|
'client' => 'required',
|
||||||
'amount' => 'required',
|
'amount' => 'required',
|
||||||
)); }}
|
)); }}
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
var currency = currencies[i];
|
var currency = currencies[i];
|
||||||
currencyMap[currency.id] = currency;
|
currencyMap[currency.id] = currency;
|
||||||
}
|
}
|
||||||
var NINJA = {};
|
var NINJA = NINJA || {};
|
||||||
NINJA.parseFloat = function(str) {
|
NINJA.parseFloat = function(str) {
|
||||||
if (!str) return '';
|
if (!str) return '';
|
||||||
str = (str+'').replace(/[^0-9\.\-]/g, '');
|
str = (str+'').replace(/[^0-9\.\-]/g, '');
|
||||||
@ -319,7 +319,7 @@ Want something changed? We're {{ link_to('https://github.com/hillelcoren/invoice
|
|||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if (!Utils::isNinjaProd())
|
@if (!Utils::isNinjaProd() && !Utils::isNinjaDev())
|
||||||
<div class="container">{{ trans('texts.powered_by') }} <a href="https://www.invoiceninja.com/" target="_blank">InvoiceNinja.com</a></div>
|
<div class="container">{{ trans('texts.powered_by') }} <a href="https://www.invoiceninja.com/" target="_blank">InvoiceNinja.com</a></div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@ -435,8 +435,7 @@ Want something changed? We're {{ link_to('https://github.com/hillelcoren/invoice
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$(function()
|
$(function() {
|
||||||
{
|
|
||||||
$('#search').focus(function(){
|
$('#search').focus(function(){
|
||||||
if (!window.hasOwnProperty('searchData')) {
|
if (!window.hasOwnProperty('searchData')) {
|
||||||
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
$.get('{{ URL::route('getSearchData') }}', function(data) {
|
||||||
@ -482,13 +481,6 @@ Want something changed? We're {{ link_to('https://github.com/hillelcoren/invoice
|
|||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
/*
|
|
||||||
$(window).on('beforeunload', function() {
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
$('form').submit(function() { $(window).off('beforeunload') });
|
|
||||||
$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
|
|
||||||
*/
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@if (false && Session::has('message'))
|
@if (false && Session::has('message'))
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
</ol>
|
</ol>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
{{ Former::open($url)->method($method)->addClass('main_form')->rules(array(
|
{{ Former::open($url)->method($method)->addClass('warn-on-exit')->rules(array(
|
||||||
'client' => 'required',
|
'client' => 'required',
|
||||||
'email' => 'required',
|
'email' => 'required',
|
||||||
'product_key' => 'max:20',
|
'product_key' => 'max:20',
|
||||||
@ -274,7 +274,7 @@
|
|||||||
<iframe id="theFrame" style="display:none" frameborder="1" width="100%" height="1180"></iframe>
|
<iframe id="theFrame" style="display:none" frameborder="1" width="100%" height="1180"></iframe>
|
||||||
<canvas id="theCanvas" style="display:none;width:100%;border:solid 1px #CCCCCC;"></canvas>
|
<canvas id="theCanvas" style="display:none;width:100%;border:solid 1px #CCCCCC;"></canvas>
|
||||||
|
|
||||||
@if (false && !Auth::user()->account->isPro())
|
@if (Utils::isNinjaDev() && !Auth::user()->account->isPro())
|
||||||
{{ trans('texts.pro_plan.remove_logo', ['link'=>'<a href="#" onclick="showProPlan()">'.trans('texts.pro_plan.remove_logo_link').'</a>']) }}
|
{{ trans('texts.pro_plan.remove_logo', ['link'=>'<a href="#" onclick="showProPlan()">'.trans('texts.pro_plan.remove_logo_link').'</a>']) }}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@ -443,9 +443,9 @@
|
|||||||
|
|
||||||
<div style="background-color: #fff; padding-left: 16px; padding-right: 16px" id="proPlanDiv">
|
<div style="background-color: #fff; padding-left: 16px; padding-right: 16px" id="proPlanDiv">
|
||||||
|
|
||||||
|
{{-- trans('texts.') --}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div style="padding-left:40px;padding-right:40px;display:none;min-height:130px" id="proPlanWorking">
|
<div style="padding-left:40px;padding-right:40px;display:none;min-height:130px" id="proPlanWorking">
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
@else
|
@else
|
||||||
{{ die('Error: Failed to find jQuery') }}
|
{{ die('Error: Failed to find jQuery') }}
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.onerror = function(e) {
|
window.onerror = function(e) {
|
||||||
try {
|
try {
|
||||||
@ -52,20 +52,36 @@
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
@if (App::environment() == ENV_PRODUCTION && isset($_ENV['ANALYTICS_KEY']) && $_ENV['ANALYTICS_KEY'])
|
@if (App::environment() == ENV_PRODUCTION && isset($_ENV['ANALYTICS_KEY']) && $_ENV['ANALYTICS_KEY'])
|
||||||
<script>
|
<script>
|
||||||
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
ga('create', '{{ $_ENV['ANALYTICS_KEY'] }}');
|
ga('create', '{{ $_ENV['ANALYTICS_KEY'] }}');
|
||||||
ga('send', 'pageview');
|
ga('send', 'pageview');
|
||||||
</script>
|
</script>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@yield('body')
|
@yield('body')
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var NINJA = NINJA || {};
|
||||||
|
NINJA.formIsChanged = false;
|
||||||
|
$(function() {
|
||||||
|
$('form.warn-on-exit input, form.warn-on-exit textarea, form.warn-on-exit select').on('change', function() {
|
||||||
|
NINJA.formIsChanged = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$(window).on('beforeunload', function() {
|
||||||
|
if (NINJA.formIsChanged) {
|
||||||
|
return "{{ trans('texts.unsaved_changes') }}";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
|
||||||
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
@ -8,7 +8,7 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
|
|
||||||
{{ Former::open($url)->addClass('col-md-10 col-md-offset-1 main_form')->method($method)->rules(array(
|
{{ Former::open($url)->addClass('col-md-10 col-md-offset-1 warn-on-exit')->method($method)->rules(array(
|
||||||
'client' => 'required',
|
'client' => 'required',
|
||||||
'invoice' => 'required',
|
'invoice' => 'required',
|
||||||
'amount' => 'required',
|
'amount' => 'required',
|
||||||
|
@ -41,16 +41,14 @@
|
|||||||
<p class="blue-text">Co-Founder, CEO</p>
|
<p class="blue-text">Co-Founder, CEO</p>
|
||||||
<p>Shalom has specialized in small business development for nearly 10 years. In addition to InvoiceNinja.com Shalom is CEO of a leading tour agency in Israel.</p>
|
<p>Shalom has specialized in small business development for nearly 10 years. In addition to InvoiceNinja.com Shalom is CEO of a leading tour agency in Israel.</p>
|
||||||
<p><span class="social"><a href="https://twitter.com/shalomstark" target="_blank"><img src="images/twitter.svg" alt="Twitter"></a></span>
|
<p><span class="social"><a href="https://twitter.com/shalomstark" target="_blank"><img src="images/twitter.svg" alt="Twitter"></a></span>
|
||||||
<span class="social"><a href="https://twitter.com/shalomstark" target="_blank"><img src="images/linkedin.svg" alt="LinkedIn"></a></span>
|
|
||||||
</p>
|
</p>
|
||||||
<p class="blue-text" style="margin-bottom: 2px;"><a href="http://shalomisraeltours.com/">shalomisraeltours.com</a></p>
|
<p class="blue-text" style="margin-bottom: 2px;"><a href="http://shalomisraeltours.com/" target="_blank">shalomisraeltours.com</a></p>
|
||||||
<p class="blue-text"><a href="http://shalomholytours.com/" target="_blank">shalomholytours.com</a></p>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<img src="images/hillelcoren.jpg" alt="Hillel Coren" class="img-circle">
|
<img src="images/hillelcoren.jpg" alt="Hillel Coren" class="img-circle">
|
||||||
<h2>HILLEL COREN</h2>
|
<h2>HILLEL COREN</h2>
|
||||||
<p class="blue-text">Co-Founder, CTO</p>
|
<p class="blue-text">Co-Founder, CTO</p>
|
||||||
<p>Hillel has been developing enterprise applications for nearly 15 years. His open-source <a href="http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&extid=1721530">AutoComplete component</a> has been used by thousands of developers around the world.</p>
|
<p>Hillel has been developing enterprise applications for 15 years. His open-source <a href="http://www.adobe.com/cfusion/exchange/index.cfm?event=extensionDetail&extid=1721530" target="_blank">AutoComplete</a> component has been used by thousands of developers around the world.</p>
|
||||||
<p><span class="social"><a href="https://twitter.com/hillelcoren" target="_blank"><img src="images/twitter.svg" alt="Twitter"></a></span>
|
<p><span class="social"><a href="https://twitter.com/hillelcoren" target="_blank"><img src="images/twitter.svg" alt="Twitter"></a></span>
|
||||||
<span class="social"><a href="http://www.linkedin.com/profile/view?id=105143214" target="_blank"><img src="images/linkedin.svg" alt="LinkedIn"></a></span>
|
<span class="social"><a href="http://www.linkedin.com/profile/view?id=105143214" target="_blank"><img src="images/linkedin.svg" alt="LinkedIn"></a></span>
|
||||||
</p>
|
</p>
|
||||||
@ -72,7 +70,7 @@
|
|||||||
<img src="images/benjacobson.jpg" alt="Ben Jacobsen" class="img-circle">
|
<img src="images/benjacobson.jpg" alt="Ben Jacobsen" class="img-circle">
|
||||||
<h2>BEN JACOBSON</h2>
|
<h2>BEN JACOBSON</h2>
|
||||||
<p class="blue-text">Marketing</p>
|
<p class="blue-text">Marketing</p>
|
||||||
<p>A veteran digital marketer and content strategist, Ben specializes in building communities around brands that make business easier for freelancers, SMBs and micro-entrepreneurs. Ben issues electronic invoices like they were free.
|
<p>A veteran digital marketer and content strategist, Ben specializes in building communities around brands that make business easier for freelancers, SMBs and micro-entrepreneurs.
|
||||||
</p>
|
</p>
|
||||||
<p><span class="social"><a href="https://twitter.com/osbennn" target="_blank"><img src="images/twitter.svg" alt="Twitter"></a></span>
|
<p><span class="social"><a href="https://twitter.com/osbennn" target="_blank"><img src="images/twitter.svg" alt="Twitter"></a></span>
|
||||||
<span class="social"><a href="https://www.linkedin.com/pub/razi-kantorp/35/368/973" target="_blank"><img src="images/linkedin.svg" alt="LinkedIn"></a></span>
|
<span class="social"><a href="https://www.linkedin.com/pub/razi-kantorp/35/368/973" target="_blank"><img src="images/linkedin.svg" alt="LinkedIn"></a></span>
|
||||||
|
5055
composer.lock
generated
Normal file
5055
composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user