1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-20 16:31:33 +02:00
invoiceninja/resources/views/master.blade.php

319 lines
12 KiB
PHP
Raw Normal View History

2013-11-26 13:45:07 +01:00
<!DOCTYPE html>
2015-06-16 00:15:09 +02:00
<html lang="{{App::getLocale()}}">
2015-02-18 23:34:36 +01:00
<head>
<!-- Source: https://github.com/invoiceninja/invoiceninja -->
<!-- Version: {{ NINJA_VERSION }} -->
2017-07-13 08:31:00 +02:00
@if (env('MULTI_DB_ENABLED'))
<!-- Authenticated: {{ Auth::check() ? 'Yes' : 'No' }} -->
<!-- Server: {{ session(SESSION_DB_SERVER, 'Unset') }} -->
@endif
<meta charset="utf-8">
2018-03-10 21:07:15 +01:00
@if (Utils::isWhiteLabel() && ! auth()->check())
2015-11-18 22:37:11 +01:00
<title>{{ trans('texts.client_portal') }}</title>
<link href="{{ asset('ic_cloud_circle.png') }}" rel="shortcut icon" type="image/png">
2015-11-18 22:37:11 +01:00
@else
2016-06-02 21:03:59 +02:00
<title>{{ isset($title) ? ($title . ' | Invoice Ninja') : ('Invoice Ninja | ' . trans('texts.app_title')) }}</title>
<meta name="description" content="{{ isset($description) ? $description : trans('texts.app_description') }}"/>
2015-12-21 20:57:55 +01:00
<link href="{{ asset('favicon-v2.png') }}" rel="shortcut icon" type="image/png">
2014-06-02 18:21:47 +02:00
<meta property="og:site_name" content="Invoice Ninja"/>
<meta property="og:url" content="{{ SITE_URL }}"/>
<meta property="og:title" content="Invoice Ninja"/>
<meta property="og:image" content="{{ SITE_URL }}/images/round_logo.png"/>
<meta property="og:description" content="Simple, Intuitive Invoicing."/>
2014-05-25 20:38:40 +02:00
<!-- http://realfavicongenerator.net -->
<link rel="apple-touch-icon" sizes="180x180" href="{{ url('apple-touch-icon.png') }}">
<link rel="icon" type="image/png" href="{{ url('favicon-32x32.png') }}" sizes="32x32">
<link rel="icon" type="image/png" href="{{ url('favicon-16x16.png') }}" sizes="16x16">
<link rel="manifest" href="{{ url('manifest.json') }}">
<link rel="mask-icon" href="{{ url('safari-pinned-tab.svg') }}" color="#3bc65c">
<link rel="shortcut icon" href="{{ url('favicon.ico') }}">
<meta name="apple-mobile-web-app-title" content="Invoice Ninja">
<meta name="application-name" content="Invoice Ninja">
<meta name="theme-color" content="#ffffff">
@endif
2016-07-27 15:00:32 +02:00
2016-06-05 17:50:41 +02:00
<!-- http://stackoverflow.com/questions/19012698/browser-cache-issues-in-laravel-4-application -->
<meta http-equiv="cache-control" content="max-age=0"/>
<meta http-equiv="cache-control" content="no-cache"/>
<meta http-equiv="cache-control" content="no-store"/>
<meta http-equiv="cache-control" content="must-revalidate"/>
<meta http-equiv="expires" content="0"/>
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache"/>
2016-06-05 17:50:41 +02:00
<meta name="viewport" content="width=device-width, initial-scale=1.0">
2015-05-22 12:52:49 +02:00
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="canonical" href="{{ NINJA_APP_URL }}/{{ Request::path() }}"/>
2015-02-18 23:34:36 +01:00
2017-06-13 14:55:34 +02:00
@yield('head_css')
2016-06-02 21:03:59 +02:00
<script src="{{ asset('built.js') }}?no_cache={{ NINJA_VERSION }}" type="text/javascript"></script>
2014-01-02 14:21:15 +01:00
<script type="text/javascript">
2015-10-14 22:56:17 +02:00
var NINJA = NINJA || {};
NINJA.fontSize = 9;
2016-01-31 20:36:50 +01:00
NINJA.isRegistered = {{ \Utils::isRegistered() ? 'true' : 'false' }};
2018-02-21 16:54:58 +01:00
NINJA.loggedErrorCount = 0;
2016-06-02 21:03:59 +02:00
2016-01-31 20:36:50 +01:00
window.onerror = function (errorMsg, url, lineNumber, column, error) {
2018-02-21 16:54:58 +01:00
if (NINJA.loggedErrorCount > 5) {
return;
}
NINJA.loggedErrorCount++;
2017-08-16 12:37:28 +02:00
// Error in hosted third party library
2016-01-31 20:36:50 +01:00
if (errorMsg.indexOf('Script error.') > -1) {
return;
}
2017-08-16 12:37:28 +02:00
// Error due to incognito mode
if (errorMsg.indexOf('DOM Exception 22') > -1) {
return;
}
2018-01-08 14:59:10 +01:00
// Less than IE9 https://stackoverflow.com/a/14835682/497368
if (! document.addEventListener) {
return;
}
2015-02-18 23:34:36 +01:00
try {
2016-06-02 21:03:59 +02:00
// Use StackTraceJS to parse the error context
2016-01-31 20:36:50 +01:00
if (error) {
StackTrace.fromError(error).then(function (result) {
2016-01-31 20:36:50 +01:00
var gps = new StackTraceGPS();
gps.findFunctionName(result[0]).then(function (result) {
2016-01-31 20:36:50 +01:00
logError(errorMsg + ': ' + JSON.stringify(result));
});
2018-01-08 14:59:10 +01:00
}).catch(function () {
logError(errorMsg);
2016-01-31 20:36:50 +01:00
});
} else {
logError(errorMsg);
}
2016-06-02 21:03:59 +02:00
2016-04-14 09:32:48 +02:00
trackEvent('/error', errorMsg);
2017-09-25 11:22:19 +02:00
} catch (exception) {
console.log('Failed to log error');
console.log(exception);
}
2016-01-31 20:36:50 +01:00
2015-02-18 23:34:36 +01:00
return false;
}
2015-02-18 23:34:36 +01:00
2016-01-31 20:36:50 +01:00
function logError(message) {
$.ajax({
type: 'GET',
url: '{{ URL::to('log_error') }}',
data: 'error=' + encodeURIComponent(message) + '&url=' + encodeURIComponent(window.location)
2016-01-31 20:36:50 +01:00
});
}
2016-07-28 18:55:23 +02:00
// http://t4t5.github.io/sweetalert/
2018-02-12 20:21:49 +01:00
function sweetConfirm(successCallback, text, title, cancelCallback) {
2016-07-28 18:55:23 +02:00
title = title || "{!! trans("texts.are_you_sure") !!}";
swal({
2016-08-15 06:51:56 +02:00
//type: "warning",
//confirmButtonColor: "#DD6B55",
2016-07-28 18:55:23 +02:00
title: title,
text: text,
cancelButtonText: "{!! trans("texts.no") !!}",
confirmButtonText: "{!! trans("texts.yes") !!}",
showCancelButton: true,
2016-09-12 11:51:24 +02:00
closeOnConfirm: false,
allowOutsideClick: true,
2016-10-25 17:24:59 +02:00
}).then(function() {
2018-02-12 20:21:49 +01:00
successCallback();
2016-07-28 18:55:23 +02:00
swal.close();
2018-02-12 20:21:49 +01:00
}).catch(function() {
if (cancelCallback) {
cancelCallback();
}
2016-07-28 18:55:23 +02:00
});
}
2015-02-18 23:34:36 +01:00
/* Set the defaults for DataTables initialisation */
$.extend(true, $.fn.dataTable.defaults, {
2015-02-18 23:34:36 +01:00
"bSortClasses": false,
2016-11-18 14:31:43 +01:00
"sDom": "t<'row-fluid'<'span6 dt-left'i><'span6 dt-right'p>>l",
2015-02-18 23:34:36 +01:00
"sPaginationType": "bootstrap",
"bInfo": true,
"oLanguage": {
'sEmptyTable': "{{ trans('texts.empty_table') }}",
2017-12-07 11:33:46 +01:00
'sInfoEmpty': "{{ trans('texts.empty_table_footer') }}",
2015-04-28 22:13:52 +02:00
'sLengthMenu': '_MENU_ {{ trans('texts.rows') }}',
'sInfo': "{{ trans('texts.datatable_info', ['start' => '_START_', 'end' => '_END_', 'total' => '_TOTAL_']) }}",
2015-02-18 23:34:36 +01:00
'sSearch': ''
}
});
2016-06-02 21:03:59 +02:00
/* This causes problems with some languages. ie, fr_CA
var appLocale = '{{App::getLocale()}}';
*/
@if (env('FACEBOOK_PIXEL'))
<!-- Facebook Pixel Code -->
!function (f, b, e, v, n, t, s) {
if (f.fbq)return;
n = f.fbq = function () {
n.callMethod ?
n.callMethod.apply(n, arguments) : n.queue.push(arguments)
};
if (!f._fbq)f._fbq = n;
n.push = n;
n.loaded = !0;
n.version = '2.0';
n.queue = [];
t = b.createElement(e);
t.async = !0;
t.src = v;
s = b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t, s)
}(window,
document, 'script', '//connect.facebook.net/en_US/fbevents.js');
fbq('init', '{{ env('FACEBOOK_PIXEL') }}');
fbq('track', "PageView");
(function () {
var _fbq = window._fbq || (window._fbq = []);
if (!_fbq.loaded) {
var fbds = document.createElement('script');
fbds.async = true;
fbds.src = '//connect.facebook.net/en_US/fbds.js';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(fbds, s);
_fbq.loaded = true;
}
})();
2016-06-02 21:03:59 +02:00
@else
function fbq() {
// do nothing
}
;
@endif
window._fbq = window._fbq || [];
2016-06-02 21:03:59 +02:00
2014-01-02 14:21:15 +01:00
</script>
2015-10-02 10:32:13 +02:00
2013-11-26 13:45:07 +01:00
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
2015-02-18 23:34:36 +01:00
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
2013-11-26 13:45:07 +01:00
<![endif]-->
2013-12-07 19:45:00 +01:00
@yield('head')
2015-02-18 23:34:36 +01:00
</head>
2013-11-26 13:45:07 +01:00
<body class="body">
2017-07-19 16:34:09 +02:00
@if (request()->phantomjs)
<script>
function trackEvent(category, action) {
}
</script>
@elseif (Utils::isNinjaProd() && isset($_ENV['TAG_MANAGER_KEY']) && $_ENV['TAG_MANAGER_KEY'])
2015-02-18 23:34:36 +01:00
<!-- Google Tag Manager -->
<noscript>
<iframe src="//www.googletagmanager.com/ns.html?id={{ $_ENV['TAG_MANAGER_KEY'] }}"
height="0" width="0" style="display:none;visibility:hidden"></iframe>
</noscript>
<script>(function (w, d, s, l, i) {
w[l] = w[l] || [];
w[l].push({
'gtm.start': new Date().getTime(), event: 'gtm.js'
});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : '';
j.async = true;
j.src =
'//www.googletagmanager.com/gtm.js?id=' + i + dl;
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'dataLayer', '{{ $_ENV['TAG_MANAGER_KEY'] }}');</script>
2015-02-18 23:34:36 +01:00
<!-- End Google Tag Manager -->
<script>
function trackEvent(category, action) {
}
2015-02-18 23:34:36 +01:00
</script>
2016-08-15 18:39:34 +02:00
@elseif (Utils::isNinjaProd() && isset($_ENV['ANALYTICS_KEY']) && $_ENV['ANALYTICS_KEY'])
2015-02-18 23:34:36 +01:00
<script>
(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),
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');
2015-02-18 23:34:36 +01:00
2016-06-02 21:03:59 +02:00
ga('create', '{{ $_ENV['ANALYTICS_KEY'] }}', 'auto');
2014-05-13 16:05:26 +02:00
ga('send', 'pageview');
2015-02-18 23:34:36 +01:00
2015-05-31 14:37:29 +02:00
function trackEvent(category, action) {
ga('send', 'event', category, action, this.src);
2014-05-13 16:05:26 +02:00
}
2015-02-18 23:34:36 +01:00
</script>
@else
2015-02-18 23:34:36 +01:00
<script>
function trackEvent(category, action) {
}
2015-02-18 23:34:36 +01:00
</script>
@endif
2016-06-02 21:03:59 +02:00
2015-02-18 23:34:36 +01:00
@yield('body')
2013-11-26 13:45:07 +01:00
2015-02-18 23:34:36 +01:00
<script type="text/javascript">
2015-09-20 23:05:02 +02:00
NINJA.formIsChanged = {{ isset($formIsChanged) && $formIsChanged ? 'true' : 'false' }};
2018-02-21 14:21:27 +01:00
NINJA.formIsSubmitted = false;
$(function () {
$('form.warn-on-exit input, form.warn-on-exit textarea, form.warn-on-exit select').change(function () {
2015-09-20 23:05:02 +02:00
NINJA.formIsChanged = true;
2016-06-02 21:03:59 +02:00
});
2015-06-03 19:55:48 +02:00
2017-03-21 09:34:52 +01:00
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
2015-06-03 19:55:48 +02:00
@if (Session::has('trackEventCategory') && Session::has('trackEventAction'))
2015-10-09 07:57:37 +02:00
@if (Session::get('trackEventAction') === '/buy_pro_plan')
2016-09-14 15:01:07 +02:00
fbq('track', 'Purchase', {value: '{{ session('trackEventAmount') }}', currency: 'USD'});
@endif
2015-06-03 19:55:48 +02:00
@endif
2015-11-01 19:21:11 +01:00
2017-07-31 18:56:04 +02:00
$('[data-toggle="tooltip"]').tooltip();
2015-11-01 19:21:11 +01:00
@if (Session::has('onReady'))
{{ Session::get('onReady') }}
2015-11-01 19:21:11 +01:00
@endif
2015-02-18 23:34:36 +01:00
});
$('form').submit(function () {
2014-04-18 10:57:31 +02:00
NINJA.formIsChanged = false;
2015-02-18 23:34:36 +01:00
});
$(window).on('beforeunload', function () {
if (NINJA.formIsChanged) {
2015-02-18 23:34:36 +01:00
return "{{ trans('texts.unsaved_changes') }}";
2014-04-25 15:04:57 +02:00
} else {
2015-02-18 23:34:36 +01:00
return undefined;
}
2016-06-02 21:03:59 +02:00
});
2015-02-18 23:34:36 +01:00
function openUrl(url, track) {
2015-06-01 15:06:18 +02:00
trackEvent('/view_link', track ? track : url);
2015-02-18 23:34:36 +01:00
window.open(url, '_blank');
}
2016-06-02 21:03:59 +02:00
</script>
2015-02-18 23:34:36 +01:00
</body>
2013-11-26 13:45:07 +01:00
2016-02-09 10:57:25 +01:00
</html>