Compare commits

..

11 Commits

Author SHA1 Message Date
James Cole
37d7dc7e3e Merge branch 'main' into develop 2024-04-01 08:37:57 +02:00
James Cole
95a3a194b8 Better instructions 2024-04-01 08:37:49 +02:00
James Cole
3542387188 Merge branch 'main' into develop 2024-04-01 08:36:25 +02:00
James Cole
da1b002a64 Clean up and expand normal release 2024-04-01 08:36:15 +02:00
James Cole
46daee28e7 Merge branch 'main' into develop 2024-04-01 08:33:02 +02:00
James Cole
9ade5635d4 Add file with revision of the used branch. 2024-04-01 08:32:51 +02:00
James Cole
e14e80f33c Merge branch 'main' into develop 2024-04-01 08:31:32 +02:00
github-actions
0c824e21c8 Auto commit for release 'develop' on 2024-04-01 2024-04-01 05:10:33 +02:00
James Cole
fab1c68569 Merge branch 'develop' of github.com:firefly-iii/firefly-iii into develop 2024-03-31 19:32:00 +02:00
James Cole
c1534657f2 Fix the installation template. 2024-03-31 19:31:52 +02:00
James Cole
43a720b62b It helps when you actually add 1 2024-03-31 17:06:37 +02:00
12 changed files with 275 additions and 99 deletions

View File

@@ -4,7 +4,7 @@ on:
workflow_dispatch:
inputs:
version:
description: 'Version to release'
description: 'Release "v1.2.3" or "develop"'
required: true
default: 'develop'
schedule:
@@ -136,20 +136,23 @@ jobs:
.ci/phpcs.sh
- name: Release
run: |
# do some configuration
sudo timedatectl set-timezone Europe/Amsterdam
git config user.name github-actions
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
git config advice.addIgnoredFile false
# set some variables
releaseName=$version
originalName=$version
tarName=FireflyIII-$version.tar.gz
# update composer (again)
composer validate --strict
composer update --no-dev --no-scripts --no-plugins
composer dump-autoload
releaseName=$version
originalName=$version
tarName=FireflyIII-$version.tar.gz
# if this is a develop build, slightly different variable names.
if [[ "develop" == "$version" ]]; then
[[ -z $(git status --untracked-files=normal --porcelain) ]] && echo "this branch is clean, no need to push..." && exit 0;
releaseName=$version-$(date +'%Y%m%d')
@@ -167,6 +170,7 @@ jobs:
echo "Tag $releaseName exists already."
releaseName="$originalName"."$tagCount"
echo "Tag for release is now $releaseName"
tagCount=$((tagCount+1))
else
echo "Tag $releaseName does not exist, can continue"
tagFound=false
@@ -174,6 +178,7 @@ jobs:
done
echo "Will use tag and release name $releaseName."
# add all content, except output.txt (this contains the changelog and/or the download instructions)
git add -A
if test -f "output.txt"; then
git reset output.txt
@@ -190,6 +195,7 @@ jobs:
sha256sum -b $zipName > $zipName.sha256
sha256sum -b $tarName > $tarName.sha256
# create a development (nightly) release:
if [[ "develop" == "$version" ]]; then
# add text to output.txt (instructions)
rm output.txt
@@ -218,8 +224,10 @@ jobs:
gh release upload $releaseName $zipName.sha256
gh release upload $releaseName $tarName.sha256
# rm output.txt again
rm output.txt
# get current HEAD and add as file to the release
HEAD=$(git rev-parse HEAD)
echo $HEAD > HEAD.txt
gh release upload $releaseName HEAD.txt
else
# add text to output.txt (more instructions)
echo '' >> output.txt
@@ -232,13 +240,29 @@ jobs:
git tag -a $releaseName -m "Here be changelog"
git push origin $releaseName
gh release create $releaseName -F output.txt -t "$releaseName" --verify-tag
# add zip file to release.
# add archive files to release
gh release upload $releaseName $zipName
# add sha256 sum to release
gh release upload $releaseName $tarName
# add sha256 sums to release
gh release upload $releaseName $zipName.sha256
gh release upload $releaseName $tarName.sha256
# get current HEAD and add as file to the release
HEAD=$(git rev-parse HEAD)
echo $HEAD > HEAD.txt
gh release upload $releaseName HEAD.txt
# remove all temporary files
rm output.txt
rm HEAD.txt
rm $zipName
rm $zipName.sha256
rm $tarName
rm $tarName.sha256
# merge main back into develop
git checkout develop
git merge main
git push

12
composer.lock generated
View File

@@ -8897,16 +8897,16 @@
"packages-dev": [
{
"name": "barryvdh/laravel-debugbar",
"version": "v3.12.2",
"version": "v3.12.3",
"source": {
"type": "git",
"url": "https://github.com/barryvdh/laravel-debugbar.git",
"reference": "43555503052443964ce2c1c1f3b0378e58219eb8"
"reference": "aac8f08b73af8c5d2ab6595c8823ddb26d1453f1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/43555503052443964ce2c1c1f3b0378e58219eb8",
"reference": "43555503052443964ce2c1c1f3b0378e58219eb8",
"url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/aac8f08b73af8c5d2ab6595c8823ddb26d1453f1",
"reference": "aac8f08b73af8c5d2ab6595c8823ddb26d1453f1",
"shasum": ""
},
"require": {
@@ -8965,7 +8965,7 @@
],
"support": {
"issues": "https://github.com/barryvdh/laravel-debugbar/issues",
"source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.12.2"
"source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.12.3"
},
"funding": [
{
@@ -8977,7 +8977,7 @@
"type": "github"
}
],
"time": "2024-03-13T09:50:34+00:00"
"time": "2024-03-31T18:35:30+00:00"
},
{
"name": "barryvdh/laravel-ide-helper",

View File

@@ -117,7 +117,7 @@ return [
'expression_engine' => false,
// see cer.php for exchange rates feature flag.
],
'version' => 'develop/2024-03-31',
'version' => 'develop/2024-04-01',
'api_version' => '2.0.13',
'db_version' => 23,

View File

@@ -19,10 +19,7 @@
*/
$(function () {
"use strict";
//var status = $('#status-box');
// set HTML to "migrating...":
document.addEventListener("DOMContentLoaded", (event) => {
console.log('Starting...');
startRunningCommands(0);
});
@@ -30,57 +27,81 @@ $(function () {
function startRunningCommands(index) {
console.log('Now in startRunningCommands with index' + index);
if (0 === index) {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Running first command...');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Running first command...';
}
runCommand(index);
}
function runCommand(index) {
console.log('Now in runCommand(' + index + '): ' + runCommandUrl);
$.post(runCommandUrl, {_token: token, index: parseInt(index)}).done(function (data) {
if (data.error === false) {
// increase index
index++;
if(data.hasNextCommand) {
// inform user
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Just executed ' + data.previous + '...');
console.log('Will call next command.');
runCommand(index);
fetch(runCommandUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token, index: parseInt(index)}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
index++;
if (response.hasNextCommand) {
// inform user
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Just executed ' + response.previous + '...';
console.log('Will call next command.');
runCommand(index);
} else {
completeDone();
console.log('Finished!');
}
} else {
completeDone();
console.log('Finished!');
displaySoftFail(response.errorMessage);
console.error(response);
}
} else {
displaySoftFail(data.errorMessage);
console.error(data);
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Command failed! See log files :(');
});
})
}
function startMigration() {
console.log('Now in startMigration');
$.post(migrateUrl, {_token: token}).done(function (data) {
if (data.error === false) {
fetch(migrateUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
// move to decrypt routine.
startDecryption();
} else {
displaySoftFail(data.message);
displaySoftFail(response.message);
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Migration failed! See log files :(');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Migration failed! See log files :(';
});
}
function startDecryption() {
console.log('Now in startDecryption');
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Setting up DB #2...');
$.post(decryptUrl, {_token: token}).done(function (data) {
if (data.error === false) {
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Setting up DB #2...';
fetch(decryptUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
// move to decrypt routine.
startPassport();
} else {
@@ -88,7 +109,7 @@ function startDecryption() {
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Migration failed! See log files :(');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Migration failed! See log files :(';
});
}
@@ -96,16 +117,25 @@ function startDecryption() {
*
*/
function startPassport() {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Setting up OAuth2...');
$.post(keysUrl, {_token: token}).done(function (data) {
if (data.error === false) {
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Setting up OAuth2...';
fetch(keysUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
startUpgrade();
} else {
displaySoftFail(data.message);
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> OAuth2 failed! See log files :(');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> OAuth2 failed! See log files :(';
});
}
@@ -113,15 +143,24 @@ function startPassport() {
*
*/
function startUpgrade() {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Upgrading database...');
$.post(upgradeUrl, {_token: token}).done(function (data) {
if (data.error === false) {
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Upgrading database...';
fetch(upgradeUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
startVerify();
} else {
displaySoftFail(data.message);
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Upgrade failed! See log files :(');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Upgrade failed! See log files :(';
});
}
@@ -129,15 +168,24 @@ function startUpgrade() {
*
*/
function startVerify() {
$('#status-box').html('<span class="fa fa-spin fa-spinner"></span> Verify database integrity...');
$.post(verifyUrl, {_token: token}).done(function (data) {
if (data.error === false) {
document.querySelector('#status-box').innerHTML = '<span class="fa fa-spin fa-spinner"></span> Verify database integrity...';
fetch(veifyUrl, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({_token: token}),
})
.then(response => response.json())
.then(response => {
if (response.error === false) {
completeDone();
} else {
displaySoftFail(data.message);
}
}).fail(function () {
$('#status-box').html('<span class="fa fa-warning"></span> Verification failed! See log files :(');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> Verification failed! See log files :(';
});
}
@@ -145,14 +193,14 @@ function startVerify() {
*
*/
function completeDone() {
$('#status-box').html('<span class="fa fa-thumbs-up"></span> Installation + upgrade complete! Wait to be redirected...');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-thumbs-up"></span> Installation + upgrade complete! Wait to be redirected...';
setTimeout(function () {
window.location = homeUrl;
}, 3000);
}
function displaySoftFail(message) {
$('#status-box').html('<span class="fa fa-warning"></span> ' + message + '<br /><br />Please read the ' +
'<a href="https://docs.firefly-iii.org/">' +
'documentation</a> about this, and upgrade by hand.');
document.querySelector('#status-box').innerHTML = '<span class="fa fa-warning"></span> ' + message + '<br /><br />Please read the ' +
'<a href="https://docs.firefly-iii.org/">' +
'documentation</a> about this, and upgrade by hand.';
}

View File

@@ -2,7 +2,7 @@
"config": {
"html_language": "hu",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"month_and_day_fns": "HHHH n, \u00e9",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"validation": {

View File

@@ -2,7 +2,7 @@
"config": {
"html_language": "hu",
"date_time_fns": "MMMM do, yyyy @ HH:mm:ss",
"month_and_day_fns": "MMMM d, y",
"month_and_day_fns": "HHHH n, \u00e9",
"date_time_fns_short": "MMMM do, yyyy @ HH:mm"
},
"validation": {

View File

@@ -41,7 +41,7 @@ return [
// 'month_and_day' => '%B %e, %Y',
'month_and_day_moment_js' => 'YYYY. MMM. D.',
'month_and_day_fns' => 'MMMM d, y',
'month_and_day_fns' => 'HHHH n, é',
'month_and_day_js' => 'YYYY. MMMM DD.',
// 'month_and_date_day' => '%A %B %e, %Y',

View File

@@ -1419,28 +1419,28 @@ return [
// Financial administrations
'administration_index' => 'Finančna administracija',
'administrations_index_menu' => 'Finančna administracija',
'administrations_breadcrumb' => 'Financial administrations',
'administrations_page_title' => 'Financial administrations',
'administrations_page_sub_title' => 'Overview',
'administrations_breadcrumb' => 'Finančna administracija',
'administrations_page_title' => 'Finančna administracija',
'administrations_page_sub_title' => 'Pregled',
'create_administration' => 'Create new administration',
'administration_owner' => 'Administration owner: {{email}}',
'administration_you' => 'Your role: {{role}}',
'administration_you' => 'Vaša vloga: {{role}}',
'other_users_in_admin' => 'Other users in this administration',
// roles
'administration_role_owner' => 'Owner',
'administration_role_ro' => 'Read-only',
'administration_role_owner' => 'Lastnik',
'administration_role_ro' => 'Samo za branje',
'administration_role_mng_trx' => 'Manage transactions',
'administration_role_mng_meta' => 'Manage classification and meta-data',
'administration_role_mng_budgets' => 'Manage budgets',
'administration_role_mng_piggies' => 'Manage piggy banks',
'administration_role_mng_subscriptions' => 'Manage subscriptions',
'administration_role_mng_rules' => 'Manage rules',
'administration_role_mng_recurring' => 'Manage recurring transactions ',
'administration_role_mng_subscriptions' => 'Upravljanje naročnin',
'administration_role_mng_rules' => 'Upravljaj pravila',
'administration_role_mng_recurring' => 'Upravljaj ponavljajoče transakcije',
'administration_role_mng_webhooks' => 'Manage webhooks',
'administration_role_mng_currencies' => 'Manage currencies',
'administration_role_view_reports' => 'View reports',
'administration_role_full' => 'Full access',
'administration_role_mng_currencies' => 'Upravljanje valut',
'administration_role_view_reports' => 'Prikaz poročil',
'administration_role_full' => 'Neomejen dostop',
// profile:
'purge_data_title' => 'Čiščenje podatkov iz Firefly III',

View File

@@ -1015,7 +1015,7 @@ return [
'rule_trigger_external_url_ends' => 'External URL ends with ":trigger_value"',
'rule_trigger_external_url_starts_choice' => 'External URL starts with..',
'rule_trigger_external_url_starts' => 'External URL starts with ":trigger_value"',
'rule_trigger_has_no_attachments_choice' => 'Has no attachments',
'rule_trigger_has_no_attachments_choice' => 'Har inga bilagor',
'rule_trigger_has_no_attachments' => 'Transaction has no attachments',
'rule_trigger_recurrence_id_choice' => 'Recurring transaction ID is..',
'rule_trigger_recurrence_id' => 'Recurring transaction ID is ":trigger_value"',
@@ -1424,22 +1424,22 @@ return [
'administrations_page_sub_title' => 'Overview',
'create_administration' => 'Create new administration',
'administration_owner' => 'Administration owner: {{email}}',
'administration_you' => 'Your role: {{role}}',
'administration_you' => 'Din roll: {{role}}',
'other_users_in_admin' => 'Other users in this administration',
// roles
'administration_role_owner' => 'Owner',
'administration_role_ro' => 'Read-only',
'administration_role_mng_trx' => 'Manage transactions',
'administration_role_mng_trx' => 'Hantera transaktioner',
'administration_role_mng_meta' => 'Manage classification and meta-data',
'administration_role_mng_budgets' => 'Manage budgets',
'administration_role_mng_piggies' => 'Manage piggy banks',
'administration_role_mng_subscriptions' => 'Manage subscriptions',
'administration_role_mng_rules' => 'Manage rules',
'administration_role_mng_recurring' => 'Manage recurring transactions ',
'administration_role_mng_piggies' => 'Hantera spargrisar',
'administration_role_mng_subscriptions' => 'Hantera prenumerationer',
'administration_role_mng_rules' => 'Hantera regler',
'administration_role_mng_recurring' => 'Hantera återkommande transaktioner ',
'administration_role_mng_webhooks' => 'Manage webhooks',
'administration_role_mng_currencies' => 'Manage currencies',
'administration_role_view_reports' => 'View reports',
'administration_role_mng_currencies' => 'Hantera valutor',
'administration_role_view_reports' => 'Visa rapporter',
'administration_role_full' => 'Full access',
// profile:
@@ -1453,7 +1453,7 @@ return [
'permanent_delete_stuff' => 'You can delete stuff from Firefly III. Using the buttons below means that your items will be removed from view and hidden. There is no undo-button for this, but the items may remain in the database where you can salvage them if necessary.',
'other_sessions_logged_out' => 'Alla dina andra sessioner har loggats ut.',
'delete_unused_accounts' => 'Deleting unused accounts will clean your auto-complete lists.',
'delete_all_unused_accounts' => 'Delete unused accounts',
'delete_all_unused_accounts' => 'Radera oanvända konton',
'deleted_all_unused_accounts' => 'All unused accounts are deleted',
'delete_all_budgets' => 'Ta bort ALLA dina budgetar',
'delete_all_categories' => 'Ta bort ALLA dina kategorier',
@@ -1663,8 +1663,8 @@ return [
'create_new_revenue' => 'Skapa ett nytt intäktskonto',
'create_new_piggy_bank' => 'Skapa en ny spargris',
'create_new_bill' => 'Skapa en ny nota',
'create_new_subscription' => 'Create new subscription',
'create_new_rule' => 'Create new rule',
'create_new_subscription' => 'Skapa ny prenumeration',
'create_new_rule' => 'Skapa ny regel',
// currencies:
'create_currency' => 'Skapa en ny valuta',
@@ -1773,7 +1773,7 @@ return [
'remove_budgeted_amount' => 'Ta bort budgeterat belopp i :currency',
// bills:
'subscription' => 'Subscription',
'subscription' => 'Prenumeration',
'not_expected_period' => 'Inte väntat denna period',
'subscriptions_in_group' => 'Subscriptions in group "%{title}"',
'subscr_expected_x_times' => 'Expect to pay %{amount} %{times} times this period',
@@ -1831,7 +1831,7 @@ return [
'bill_repeats_half-year_skip' => 'Upprepas varje {skip} halvår',
'bill_repeats_yearly_skip' => 'Upprepas varje {skip} år',
'subscriptions' => 'Prenumerationer',
'go_to_subscriptions' => 'Go to your subscriptions',
'go_to_subscriptions' => 'Gå till dina prenumerationer',
'forever' => 'För alltid',
'extension_date_is' => 'Tillägg datum är {date}',
@@ -2455,7 +2455,7 @@ return [
'invite_is_deleted' => 'Inbjudan till ":address" har tagits bort.',
'invite_new_user_title' => 'Invite new user',
'invite_new_user_text' => 'As an administrator, you can invite users to register on your Firefly III administration. Using the direct link you can share with them, they will be able to register an account. The invited user and their invite link will appear in the table below. You are free to share the invitation link with them.',
'invited_user_mail' => 'Email address',
'invited_user_mail' => 'E-postadress',
'invite_user' => 'Invite user',
'user_is_invited' => 'Email address ":address" was invited to Firefly III',
'administration' => 'Administration',
@@ -2508,7 +2508,7 @@ return [
'admin_notification_check_invite_created' => 'A user is invited to Firefly III',
'admin_notification_check_invite_redeemed' => 'A user invitation is redeemed',
'all_invited_users' => 'All invited users',
'save_notification_settings' => 'Save settings',
'save_notification_settings' => 'Spara inställningar',
'notification_settings_saved' => 'The notification settings have been saved',
'split_transaction_title' => 'Beskrivning av delad transaktion',
@@ -2792,8 +2792,8 @@ return [
'ale_action_update_transaction_type' => 'Changed transaction type',
'ale_action_update_notes' => 'Changed notes',
'ale_action_update_description' => 'Changed description',
'ale_action_add_to_piggy' => 'Piggy bank',
'ale_action_remove_from_piggy' => 'Piggy bank',
'ale_action_add_to_piggy' => 'Spargris',
'ale_action_remove_from_piggy' => 'Spargris',
'ale_action_add_tag' => 'Added tag',
'ale_action_update_amount' => 'Updated amount',

View File

@@ -219,7 +219,7 @@ return [
'login_name' => 'Logga in',
'is_owner' => 'Admin?',
'url' => 'Länk',
'bill_end_date' => 'End date',
'bill_end_date' => 'Slutdatum',
// import
'apply_rules' => 'Tillämpa regler',

View File

@@ -21,6 +21,6 @@
var runCommandUrl = '{{ route('installer.runCommand') }}';
var homeUrl = '{{ route('flush') }}';
</script>
<script type="text/javascript" src="v1/js/ff/install/index.js" nonce="{{ JS_NONCE }}"></script>
<script type="text/javascript" src="v1/js/ff/install/Xindex.js" nonce="{{ JS_NONCE }}"></script>
{% endblock %}

View File

@@ -0,0 +1,104 @@
<!DOCTYPE html>
<html lang="en">
<head>
<base href="{{ route('index') }}/"/>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Firefly III - Installation and update</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Firefly III - Installation and update">
<!-- copy of head.blade.php -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="csrf-token" content="{{ csrf_token() }}">
<meta name="robots" content="noindex, nofollow, noarchive, noodp, NoImageIndex, noydir">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="color-scheme" content="light dark">
<script type="text/javascript" nonce="{{ $JS_NONCE }}">
/*!
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
* Copyright 2011-2023 The Bootstrap Authors
* Licensed under the Creative Commons Attribution 3.0 Unported License.
*/
(() => {
'use strict'
// todo store just happens to store in localStorage but if not, this would break.
const getStoredTheme = () => JSON.parse(localStorage.getItem('darkMode'))
const getPreferredTheme = () => {
const storedTheme = getStoredTheme()
if (storedTheme) {
return storedTheme
}
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
}
const setTheme = theme => {
if (theme === 'browser' && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.setAttribute('data-bs-theme', 'dark')
window.theme = 'dark';
return;
}
if (theme === 'browser' && window.matchMedia('(prefers-color-scheme: light)').matches) {
window.theme = 'light';
document.documentElement.setAttribute('data-bs-theme', 'light')
return;
}
document.documentElement.setAttribute('data-bs-theme', theme)
window.theme = theme;
}
setTheme(getPreferredTheme())
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
const storedTheme = getStoredTheme()
if (storedTheme !== 'light' && storedTheme !== 'dark') {
setTheme(getPreferredTheme())
}
})
})()
</script>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
@vite(['resources/assets/v2/sass/app.scss'])
</head>
<body class="container bg-body-secondary">
<div class="row">
<div class="col mt-3">
<img src="images/logo-session.png" width="68" height="100" alt="Firefly III Logo" title="Firefly III"/><br>
</div>
</div>
<div class="row">
<div class="col">
<h1><strong>Firefly</strong> III - <code>Installation and update</code></h1>
</div>
</div>
<div class="row">
<div class="col-xl-4 col-lg-4 col-md-6 col-sm-12">
<div class="card">
<div class="card-body">
<p>The upgrade and installation is ongoing. Please track its progress through the box below.</p>
<div class="row">
<div class="col-lg-12">
<div id="status-box" style="border:1px #ddd solid;padding:5px;">
<span class="fa fa-spin fa-spinner"></span> Waiting to start...
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@yield('scripts')
<script type="text/javascript" nonce="{{ $JS_NONCE }}">
var token = '{{ csrf_token() }}';
var index = 0;
var runCommandUrl = '{{ route('installer.runCommand') }}';
var homeUrl = '{{ route('flush') }}';
</script>
<script type="text/javascript" src="v1/js/ff/install/index.js" nonce="{{ $JS_NONCE }}"></script>
</body>
</html>