- migrate to boostrap 5.3

- Fix messages not displayed when missing media description
This commit is contained in:
Thomas 2024-05-16 10:55:16 +02:00
parent 23ff8dd75b
commit defb279698
40 changed files with 28666 additions and 18357 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,57 +1,268 @@
/*! /*!
* Bootstrap Reboot v4.1.3 (https://getbootstrap.com/) * Bootstrap Reboot v5.3.3 (https://getbootstrap.com/)
* Copyright 2011-2018 The Bootstrap Authors * Copyright 2011-2024 The Bootstrap Authors
* Copyright 2011-2018 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/ */
:root,
[data-bs-theme=light] {
--bs-blue: #0d6efd;
--bs-indigo: #6610f2;
--bs-purple: #6f42c1;
--bs-pink: #d63384;
--bs-red: #dc3545;
--bs-orange: #fd7e14;
--bs-yellow: #ffc107;
--bs-green: #198754;
--bs-teal: #20c997;
--bs-cyan: #0dcaf0;
--bs-black: #000;
--bs-white: #fff;
--bs-gray: #6c757d;
--bs-gray-dark: #343a40;
--bs-gray-100: #f8f9fa;
--bs-gray-200: #e9ecef;
--bs-gray-300: #dee2e6;
--bs-gray-400: #ced4da;
--bs-gray-500: #adb5bd;
--bs-gray-600: #6c757d;
--bs-gray-700: #495057;
--bs-gray-800: #343a40;
--bs-gray-900: #212529;
--bs-primary: #0d6efd;
--bs-secondary: #6c757d;
--bs-success: #198754;
--bs-info: #0dcaf0;
--bs-warning: #ffc107;
--bs-danger: #dc3545;
--bs-light: #f8f9fa;
--bs-dark: #212529;
--bs-primary-rgb: 13, 110, 253;
--bs-secondary-rgb: 108, 117, 125;
--bs-success-rgb: 25, 135, 84;
--bs-info-rgb: 13, 202, 240;
--bs-warning-rgb: 255, 193, 7;
--bs-danger-rgb: 220, 53, 69;
--bs-light-rgb: 248, 249, 250;
--bs-dark-rgb: 33, 37, 41;
--bs-primary-text-emphasis: #052c65;
--bs-secondary-text-emphasis: #2b2f32;
--bs-success-text-emphasis: #0a3622;
--bs-info-text-emphasis: #055160;
--bs-warning-text-emphasis: #664d03;
--bs-danger-text-emphasis: #58151c;
--bs-light-text-emphasis: #495057;
--bs-dark-text-emphasis: #495057;
--bs-primary-bg-subtle: #cfe2ff;
--bs-secondary-bg-subtle: #e2e3e5;
--bs-success-bg-subtle: #d1e7dd;
--bs-info-bg-subtle: #cff4fc;
--bs-warning-bg-subtle: #fff3cd;
--bs-danger-bg-subtle: #f8d7da;
--bs-light-bg-subtle: #fcfcfd;
--bs-dark-bg-subtle: #ced4da;
--bs-primary-border-subtle: #9ec5fe;
--bs-secondary-border-subtle: #c4c8cb;
--bs-success-border-subtle: #a3cfbb;
--bs-info-border-subtle: #9eeaf9;
--bs-warning-border-subtle: #ffe69c;
--bs-danger-border-subtle: #f1aeb5;
--bs-light-border-subtle: #e9ecef;
--bs-dark-border-subtle: #adb5bd;
--bs-white-rgb: 255, 255, 255;
--bs-black-rgb: 0, 0, 0;
--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));
--bs-body-font-family: var(--bs-font-sans-serif);
--bs-body-font-size: 1rem;
--bs-body-font-weight: 400;
--bs-body-line-height: 1.5;
--bs-body-color: #212529;
--bs-body-color-rgb: 33, 37, 41;
--bs-body-bg: #fff;
--bs-body-bg-rgb: 255, 255, 255;
--bs-emphasis-color: #000;
--bs-emphasis-color-rgb: 0, 0, 0;
--bs-secondary-color: rgba(33, 37, 41, 0.75);
--bs-secondary-color-rgb: 33, 37, 41;
--bs-secondary-bg: #e9ecef;
--bs-secondary-bg-rgb: 233, 236, 239;
--bs-tertiary-color: rgba(33, 37, 41, 0.5);
--bs-tertiary-color-rgb: 33, 37, 41;
--bs-tertiary-bg: #f8f9fa;
--bs-tertiary-bg-rgb: 248, 249, 250;
--bs-heading-color: inherit;
--bs-link-color: #0d6efd;
--bs-link-color-rgb: 13, 110, 253;
--bs-link-decoration: underline;
--bs-link-hover-color: #0a58ca;
--bs-link-hover-color-rgb: 10, 88, 202;
--bs-code-color: #d63384;
--bs-highlight-color: #212529;
--bs-highlight-bg: #fff3cd;
--bs-border-width: 1px;
--bs-border-style: solid;
--bs-border-color: #dee2e6;
--bs-border-color-translucent: rgba(0, 0, 0, 0.175);
--bs-border-radius: 0.375rem;
--bs-border-radius-sm: 0.25rem;
--bs-border-radius-lg: 0.5rem;
--bs-border-radius-xl: 1rem;
--bs-border-radius-xxl: 2rem;
--bs-border-radius-2xl: var(--bs-border-radius-xxl);
--bs-border-radius-pill: 50rem;
--bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
--bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
--bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);
--bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);
--bs-focus-ring-width: 0.25rem;
--bs-focus-ring-opacity: 0.25;
--bs-focus-ring-color: rgba(13, 110, 253, 0.25);
--bs-form-valid-color: #198754;
--bs-form-valid-border-color: #198754;
--bs-form-invalid-color: #dc3545;
--bs-form-invalid-border-color: #dc3545;
}
[data-bs-theme=dark] {
color-scheme: dark;
--bs-body-color: #dee2e6;
--bs-body-color-rgb: 222, 226, 230;
--bs-body-bg: #212529;
--bs-body-bg-rgb: 33, 37, 41;
--bs-emphasis-color: #fff;
--bs-emphasis-color-rgb: 255, 255, 255;
--bs-secondary-color: rgba(222, 226, 230, 0.75);
--bs-secondary-color-rgb: 222, 226, 230;
--bs-secondary-bg: #343a40;
--bs-secondary-bg-rgb: 52, 58, 64;
--bs-tertiary-color: rgba(222, 226, 230, 0.5);
--bs-tertiary-color-rgb: 222, 226, 230;
--bs-tertiary-bg: #2b3035;
--bs-tertiary-bg-rgb: 43, 48, 53;
--bs-primary-text-emphasis: #6ea8fe;
--bs-secondary-text-emphasis: #a7acb1;
--bs-success-text-emphasis: #75b798;
--bs-info-text-emphasis: #6edff6;
--bs-warning-text-emphasis: #ffda6a;
--bs-danger-text-emphasis: #ea868f;
--bs-light-text-emphasis: #f8f9fa;
--bs-dark-text-emphasis: #dee2e6;
--bs-primary-bg-subtle: #031633;
--bs-secondary-bg-subtle: #161719;
--bs-success-bg-subtle: #051b11;
--bs-info-bg-subtle: #032830;
--bs-warning-bg-subtle: #332701;
--bs-danger-bg-subtle: #2c0b0e;
--bs-light-bg-subtle: #343a40;
--bs-dark-bg-subtle: #1a1d20;
--bs-primary-border-subtle: #084298;
--bs-secondary-border-subtle: #41464b;
--bs-success-border-subtle: #0f5132;
--bs-info-border-subtle: #087990;
--bs-warning-border-subtle: #997404;
--bs-danger-border-subtle: #842029;
--bs-light-border-subtle: #495057;
--bs-dark-border-subtle: #343a40;
--bs-heading-color: inherit;
--bs-link-color: #6ea8fe;
--bs-link-hover-color: #8bb9fe;
--bs-link-color-rgb: 110, 168, 254;
--bs-link-hover-color-rgb: 139, 185, 254;
--bs-code-color: #e685b5;
--bs-highlight-color: #dee2e6;
--bs-highlight-bg: #664d03;
--bs-border-color: #495057;
--bs-border-color-translucent: rgba(255, 255, 255, 0.15);
--bs-form-valid-color: #75b798;
--bs-form-valid-border-color: #75b798;
--bs-form-invalid-color: #ea868f;
--bs-form-invalid-border-color: #ea868f;
}
*, *,
*::before, *::before,
*::after { *::after {
box-sizing: border-box; box-sizing: border-box;
} }
html { @media (prefers-reduced-motion: no-preference) {
font-family: sans-serif; :root {
line-height: 1.15; scroll-behavior: smooth;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
-ms-overflow-style: scrollbar;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
} }
@-ms-viewport {
width: device-width;
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
} }
body { body {
margin: 0; margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; font-family: var(--bs-body-font-family);
font-size: 1rem; font-size: var(--bs-body-font-size);
font-weight: 400; font-weight: var(--bs-body-font-weight);
line-height: 1.5; line-height: var(--bs-body-line-height);
color: #212529; color: var(--bs-body-color);
text-align: left; text-align: var(--bs-body-text-align);
background-color: #fff; background-color: var(--bs-body-bg);
} -webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
[tabindex="-1"]:focus {
outline: 0 !important;
} }
hr { hr {
box-sizing: content-box; margin: 1rem 0;
height: 0; color: inherit;
overflow: visible; border: 0;
border-top: var(--bs-border-width) solid;
opacity: 0.25;
} }
h1, h2, h3, h4, h5, h6 { h6, h5, h4, h3, h2, h1 {
margin-top: 0; margin-top: 0;
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
color: var(--bs-heading-color);
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
} }
p { p {
@ -59,13 +270,12 @@ p {
margin-bottom: 1rem; margin-bottom: 1rem;
} }
abbr[title], abbr[title] {
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted; -webkit-text-decoration: underline dotted;
text-decoration: underline dotted; text-decoration: underline dotted;
cursor: help; cursor: help;
border-bottom: 0; -webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
} }
address { address {
@ -74,6 +284,11 @@ address {
line-height: inherit; line-height: inherit;
} }
ol,
ul {
padding-left: 2rem;
}
ol, ol,
ul, ul,
dl { dl {
@ -93,7 +308,7 @@ dt {
} }
dd { dd {
margin-bottom: .5rem; margin-bottom: 0.5rem;
margin-left: 0; margin-left: 0;
} }
@ -101,118 +316,139 @@ blockquote {
margin: 0 0 1rem; margin: 0 0 1rem;
} }
dfn {
font-style: italic;
}
b, b,
strong { strong {
font-weight: bolder; font-weight: bolder;
} }
small { small {
font-size: 80%; font-size: 0.875em;
}
mark {
padding: 0.1875em;
color: var(--bs-highlight-color);
background-color: var(--bs-highlight-bg);
} }
sub, sub,
sup { sup {
position: relative; position: relative;
font-size: 75%; font-size: 0.75em;
line-height: 0; line-height: 0;
vertical-align: baseline; vertical-align: baseline;
} }
sub { sub {
bottom: -.25em; bottom: -0.25em;
} }
sup { sup {
top: -.5em; top: -0.5em;
} }
a { a {
color: #007bff; color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));
text-decoration: none;
background-color: transparent;
-webkit-text-decoration-skip: objects;
}
a:hover {
color: #0056b3;
text-decoration: underline; text-decoration: underline;
} }
a:hover {
a:not([href]):not([tabindex]) { --bs-link-color-rgb: var(--bs-link-hover-color-rgb);
color: inherit;
text-decoration: none;
} }
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;
} }
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre, pre,
code, code,
kbd, kbd,
samp { samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-family: var(--bs-font-monospace);
font-size: 1em; font-size: 1em;
} }
pre { pre {
display: block;
margin-top: 0; margin-top: 0;
margin-bottom: 1rem; margin-bottom: 1rem;
overflow: auto; overflow: auto;
-ms-overflow-style: scrollbar; font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: var(--bs-code-color);
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.1875rem 0.375rem;
font-size: 0.875em;
color: var(--bs-body-bg);
background-color: var(--bs-body-color);
border-radius: 0.25rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
} }
figure { figure {
margin: 0 0 1rem; margin: 0 0 1rem;
} }
img { img,
vertical-align: middle;
border-style: none;
}
svg { svg {
overflow: hidden;
vertical-align: middle; vertical-align: middle;
} }
table { table {
caption-side: bottom;
border-collapse: collapse; border-collapse: collapse;
} }
caption { caption {
padding-top: 0.75rem; padding-top: 0.5rem;
padding-bottom: 0.75rem; padding-bottom: 0.5rem;
color: #6c757d; color: var(--bs-secondary-color);
text-align: left; text-align: left;
caption-side: bottom;
} }
th { th {
text-align: inherit; text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
} }
label { label {
display: inline-block; display: inline-block;
margin-bottom: 0.5rem;
} }
button { button {
border-radius: 0; border-radius: 0;
} }
button:focus { button:focus:not(:focus-visible) {
outline: 1px dotted; outline: 0;
outline: 5px auto -webkit-focus-ring-color;
} }
input, input,
@ -226,46 +462,45 @@ textarea {
line-height: inherit; line-height: inherit;
} }
button,
input {
overflow: visible;
}
button, button,
select { select {
text-transform: none; text-transform: none;
} }
button, [role=button] {
html [type="button"], cursor: pointer;
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
} }
button::-moz-focus-inner, select {
[type="button"]::-moz-focus-inner, word-wrap: normal;
[type="reset"]::-moz-focus-inner, }
[type="submit"]::-moz-focus-inner { select:disabled {
opacity: 1;
}
[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {
display: none !important;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0; padding: 0;
border-style: none; border-style: none;
} }
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea { textarea {
overflow: auto;
resize: vertical; resize: vertical;
} }
@ -277,34 +512,55 @@ fieldset {
} }
legend { legend {
display: block; float: left;
width: 100%; width: 100%;
max-width: 100%;
padding: 0; padding: 0;
margin-bottom: .5rem; margin-bottom: 0.5rem;
font-size: 1.5rem; font-size: calc(1.275rem + 0.3vw);
line-height: inherit; line-height: inherit;
color: inherit; }
white-space: normal; @media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
} }
progress { ::-webkit-datetime-edit-fields-wrapper,
vertical-align: baseline; ::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
} }
[type="number"]::-webkit-inner-spin-button, ::-webkit-inner-spin-button {
[type="number"]::-webkit-outer-spin-button {
height: auto; height: auto;
} }
[type="search"] { [type=search] {
-webkit-appearance: textfield;
outline-offset: -2px; outline-offset: -2px;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
} }
[type="search"]::-webkit-search-cancel-button, ::-webkit-color-swatch-wrapper {
[type="search"]::-webkit-search-decoration { padding: 0;
-webkit-appearance: none;
} }
::-webkit-file-upload-button { ::-webkit-file-upload-button {
@ -312,20 +568,30 @@ progress {
-webkit-appearance: button; -webkit-appearance: button;
} }
::file-selector-button {
font: inherit;
-webkit-appearance: button;
}
output { output {
display: inline-block; display: inline-block;
} }
iframe {
border: 0;
}
summary { summary {
display: list-item; display: list-item;
cursor: pointer; cursor: pointer;
} }
template { progress {
display: none; vertical-align: baseline;
} }
[hidden] { [hidden] {
display: none !important; display: none !important;
} }
/*# sourceMappingURL=bootstrap-reboot.css.map */ /*# sourceMappingURL=bootstrap-reboot.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

14
public/css/bootstrap-toggle.min.css vendored Normal file
View file

@ -0,0 +1,14 @@
/* Copyright Notice
* bootstrap5-toggle v5.1.0
* https://palcarazm.github.io/bootstrap5-toggle/
* @author 2011-2014 Min Hur (https://github.com/minhur)
* @author 2018-2019 Brent Ely (https://github.com/gitbrent)
* @author 2022 Pablo Alcaraz Martínez (https://github.com/palcarazm)
* @funding GitHub Sponsors
* @see https://github.com/sponsors/palcarazm
* @license MIT
* @see https://github.com/palcarazm/bootstrap5-toggle/blob/master/LICENSE
*/
.btn-group-xs>.btn,.btn-xs{padding:.35rem .4rem .25rem .4rem;font-size:.875rem;line-height:.5;border-radius:.2rem}.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-1.25rem;margin-right:.35rem}.toggle{position:relative;overflow:hidden}.toggle:focus>.toggle-group>.btn,.toggle:hover>.toggle-group>.btn{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.toggle:focus>.toggle-group>.toggle-handle,.toggle:hover>.toggle-group>.toggle-handle{background-color:var(--bs-light);opacity:.5}.toggle>input[type=checkbox]{display:none}.toggle>.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;user-select:none;-moz-user-select:none;-webkit-user-select:none}.toggle>.toggle-group>span{cursor:pointer}.toggle.off>.toggle-group{left:-100%}.toggle.indeterminate>.toggle-group{left:-50%}.toggle>.toggle-group>.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}.toggle>.toggle-group>.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0;box-shadow:none}.toggle>.toggle-group>.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px;background-color:var(--bs-light);border-color:var(--bs-light)}.input-group .toggle>.toggle-group>.toggle-off,.input-group .toggle>.toggle-group>.toggle-on{position:absolute}.toggle:not(:hover):not(:focus).btn-outline-primary>.toggle-group>.toggle-handle{background-color:var(--bs-primary);border-color:var(--bs-primary)}.toggle:not(:hover):not(:focus).btn-outline-secondary>.toggle-group>.toggle-handle{background-color:var(--bs-secondary);border-color:var(--bs-secondary)}.toggle:not(:hover):not(:focus).btn-outline-success>.toggle-group>.toggle-handle{background-color:var(--bs-success);border-color:var(--bs-success)}.toggle:not(:hover):not(:focus).btn-outline-danger>.toggle-group>.toggle-handle{background-color:var(--bs-danger);border-color:var(--bs-danger)}.toggle:not(:hover):not(:focus).btn-outline-warning>.toggle-group>.toggle-handle{background-color:var(--bs-warning);border-color:var(--bs-warning)}.toggle:not(:hover):not(:focus).btn-outline-info>.toggle-group>.toggle-handle{background-color:var(--bs-info);border-color:var(--bs-info)}.toggle:not(:hover):not(:focus).btn-outline-light>.toggle-group>.toggle-handle{background-color:var(--bs-light);border-color:var(--bs-light)}.toggle:not(:hover):not(:focus).btn-outline-dark>.toggle-group>.toggle-handle{background-color:var(--bs-dark);border-color:var(--bs-dark)}.toggle.btn{min-width:3.7rem;min-height:2.15rem}.toggle>.toggle-group>.toggle-on.btn{padding-right:1.5rem}.toggle>.toggle-group>.toggle-off.btn{padding-left:1.5rem}.toggle.btn-lg{min-width:5rem;min-height:2.815rem}.toggle>.toggle-group>.toggle-on.btn-lg{padding-right:2rem}.toggle>.toggle-group>.toggle-off.btn-lg{padding-left:2rem}.toggle>.toggle-group>.toggle-handle.btn-lg{width:2.5rem}.toggle.btn-sm{min-width:3.125rem;min-height:1.938rem}.toggle>.toggle-group>.toggle-on.btn-sm{padding-right:1rem}.toggle>.toggle-group>.toggle-off.btn-sm{padding-left:1rem}.toggle.btn-xs{min-width:2.19rem;min-height:1.375rem}.toggle>.toggle-group>.toggle-on.btn-xs{padding-right:.8rem}.toggle>.toggle-group>.toggle-off.btn-xs{padding-left:.8rem}
/*# sourceMappingURL=bootstrap5-toggle.min.css.map */

16329
public/css/bootstrap.css vendored

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,42 +0,0 @@
/*\
|*| ========================================================================
|*| Bootstrap Toggle: bootstrap4-toggle.css v3.5.0
|*| https://gitbrent.github.io/bootstrap-toggle/
|*| ========================================================================
|*| Copyright 2018-2019 Brent Ely
|*| Licensed under MIT
|*| ========================================================================
\*/
.btn-group-xs>.btn,.btn-xs{padding:.35rem .4rem .25rem;font-size:.875rem;line-height:.5;border-radius:.2rem}
.checkbox label .toggle,.checkbox-inline .toggle{margin-left:-1.25rem;margin-right:.35rem}
.toggle{position:relative;overflow:hidden}
.toggle.btn.btn-light,.toggle.btn.btn-outline-light{border-color:rgba(0,0,0,.15)}
.toggle input[type=checkbox]{display:none}
.toggle-group{position:absolute;width:200%;top:0;bottom:0;left:0;transition:left .35s;-webkit-transition:left .35s;-moz-user-select:none;-webkit-user-select:none}
.toggle-group label,.toggle-group span{cursor:pointer}
.toggle.off .toggle-group{left:-100%}
.toggle-on{position:absolute;top:0;bottom:0;left:0;right:50%;margin:0;border:0;border-radius:0}
.toggle-off{position:absolute;top:0;bottom:0;left:50%;right:0;margin:0;border:0;border-radius:0;box-shadow:none}
.toggle-handle{position:relative;margin:0 auto;padding-top:0;padding-bottom:0;height:100%;width:0;border-width:0 1px;background-color:#fff}
.toggle.btn-outline-primary .toggle-handle{background-color:var(--primary);border-color:var(--primary)}
.toggle.btn-outline-secondary .toggle-handle{background-color:var(--secondary);border-color:var(--secondary)}
.toggle.btn-outline-success .toggle-handle{background-color:var(--success);border-color:var(--success)}
.toggle.btn-outline-danger .toggle-handle{background-color:var(--danger);border-color:var(--danger)}
.toggle.btn-outline-warning .toggle-handle{background-color:var(--warning);border-color:var(--warning)}
.toggle.btn-outline-info .toggle-handle{background-color:var(--info);border-color:var(--info)}
.toggle.btn-outline-light .toggle-handle{background-color:var(--light);border-color:var(--light)}
.toggle.btn-outline-dark .toggle-handle{background-color:var(--dark);border-color:var(--dark)}
.toggle[class*=btn-outline]:hover .toggle-handle{background-color:var(--light);opacity:.5}
.toggle.btn{min-width:3.7rem;min-height:2.15rem}
.toggle-on.btn{padding-right:1.5rem}
.toggle-off.btn{padding-left:1.5rem}
.toggle.btn-lg{min-width:5rem;min-height:2.815rem}
.toggle-on.btn-lg{padding-right:2rem}
.toggle-off.btn-lg{padding-left:2rem}
.toggle-handle.btn-lg{width:2.5rem}
.toggle.btn-sm{min-width:3.125rem;min-height:1.938rem}
.toggle-on.btn-sm{padding-right:1rem}
.toggle-off.btn-sm{padding-left:1rem}
.toggle.btn-xs{min-width:2.19rem;min-height:1.375rem}
.toggle-on.btn-xs{padding-right:.8rem}
.toggle-off.btn-xs{padding-left:.8rem}

14
public/js/bootstrap-toggle.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

4447
public/js/bootstrap.esm.js vendored Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

7
public/js/bootstrap.esm.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7144
public/js/bootstrap.js vendored

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,11 +0,0 @@
/*\
|*| ========================================================================
|*| Bootstrap Toggle: bootstrap4-toggle.js v3.5.0
|*| https://gitbrent.github.io/bootstrap-toggle/
|*| ========================================================================
|*| Copyright 2018-2019 Brent Ely
|*| Licensed under MIT
|*| ========================================================================
\*/
+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.toggle"),f="object"==typeof b&&b;e||d.data("bs.toggle",e=new c(this,f)),"string"==typeof b&&e[b]&&e[b]()})}var c=function(b,c){this.$element=a(b),this.options=a.extend({},this.defaults(),c),this.render()};c.VERSION="3.5.0",c.DEFAULTS={on:"On",off:"Off",onstyle:"primary",offstyle:"light",size:"normal",style:"",width:null,height:null},c.prototype.defaults=function(){return{on:this.$element.attr("data-on")||c.DEFAULTS.on,off:this.$element.attr("data-off")||c.DEFAULTS.off,onstyle:this.$element.attr("data-onstyle")||c.DEFAULTS.onstyle,offstyle:this.$element.attr("data-offstyle")||c.DEFAULTS.offstyle,size:this.$element.attr("data-size")||c.DEFAULTS.size,style:this.$element.attr("data-style")||c.DEFAULTS.style,width:this.$element.attr("data-width")||c.DEFAULTS.width,height:this.$element.attr("data-height")||c.DEFAULTS.height}},c.prototype.render=function(){this._onstyle="btn-"+this.options.onstyle,this._offstyle="btn-"+this.options.offstyle;var b="large"===this.options.size||"lg"===this.options.size?"btn-lg":"small"===this.options.size||"sm"===this.options.size?"btn-sm":"mini"===this.options.size||"xs"===this.options.size?"btn-xs":"",c=a('<label class="btn">').html(this.options.on).addClass(this._onstyle+" "+b),d=a('<label class="btn">').html(this.options.off).addClass(this._offstyle+" "+b),e=a('<span class="toggle-handle btn btn-light">').addClass(b),f=a('<div class="toggle-group">').append(c,d,e),g=a('<div class="toggle btn" data-toggle="toggle" role="button">').addClass(this.$element.prop("checked")?this._onstyle:this._offstyle+" off").addClass(b).addClass(this.options.style);this.$element.wrap(g),a.extend(this,{$toggle:this.$element.parent(),$toggleOn:c,$toggleOff:d,$toggleGroup:f}),this.$toggle.append(f);var h=this.options.width||Math.max(c.outerWidth(),d.outerWidth())+e.outerWidth()/2,i=this.options.height||Math.max(c.outerHeight(),d.outerHeight());c.addClass("toggle-on"),d.addClass("toggle-off"),this.$toggle.css({width:h,height:i}),this.options.height&&(c.css("line-height",c.height()+"px"),d.css("line-height",d.height()+"px")),this.update(!0),this.trigger(!0)},c.prototype.toggle=function(){this.$element.prop("checked")?this.off():this.on()},c.prototype.on=function(a){if(this.$element.prop("disabled"))return!1;this.$toggle.removeClass(this._offstyle+" off").addClass(this._onstyle),this.$element.prop("checked",!0),a||this.trigger()},c.prototype.off=function(a){if(this.$element.prop("disabled"))return!1;this.$toggle.removeClass(this._onstyle).addClass(this._offstyle+" off"),this.$element.prop("checked",!1),a||this.trigger()},c.prototype.enable=function(){this.$toggle.removeAttr("disabled"),this.$element.prop("disabled",!1)},c.prototype.disable=function(){this.$toggle.attr("disabled","disabled"),this.$element.prop("disabled",!0)},c.prototype.update=function(a){this.$element.prop("disabled")?this.disable():this.enable(),this.$element.prop("checked")?this.on(a):this.off(a)},c.prototype.trigger=function(b){this.$element.off("change.bs.toggle"),b||this.$element.change(),this.$element.on("change.bs.toggle",a.proxy(function(){this.update()},this))},c.prototype.destroy=function(){this.$element.off("change.bs.toggle"),this.$toggleGroup.remove(),this.$element.removeData("bs.toggle"),this.$element.unwrap()};var d=a.fn.bootstrapToggle;a.fn.bootstrapToggle=b,a.fn.bootstrapToggle.Constructor=c,a.fn.toggle.noConflict=function(){return a.fn.bootstrapToggle=d,this},a(function(){a("input[type=checkbox][data-toggle^=toggle]").bootstrapToggle()}),a(document).on("click.bs.toggle","div[data-toggle^=toggle]",function(b){a(this).find("input[type=checkbox]").bootstrapToggle("toggle"),b.preventDefault()})}(jQuery);
//# sourceMappingURL=bootstrap4-toggle.min.js.map

View file

@ -254,8 +254,9 @@ class FediPlanController extends AbstractController
$form = $this->createForm(ComposeType::class, $compose, ['user' => $this->getUser()]); $form = $this->createForm(ComposeType::class, $compose, ['user' => $this->getUser()]);
} }
} }
$user = $this->getUser();
/** @var $user MastodonAccount */ /** @var $user MastodonAccount */
$user = $this->getUser();
return $this->render("fediplan/schedule.html.twig", [ return $this->render("fediplan/schedule.html.twig", [
'form' => $form->createView(), 'form' => $form->createView(),
@ -284,7 +285,7 @@ class FediPlanController extends AbstractController
)] )]
public function loadMoreAction(Mastodon_api $mastodon_api, string $max_id = null): JsonResponse public function loadMoreAction(Mastodon_api $mastodon_api, string $max_id = null): JsonResponse
{ {
/** @var $user MastodonAccount */
$user = $this->getUser(); $user = $this->getUser();
$mastodon_api->set_url("https://" . $user->getInstance()); $mastodon_api->set_url("https://" . $user->getInstance());
$token = explode(" ", $user->getToken())[1]; $token = explode(" ", $user->getToken())[1];
@ -295,7 +296,7 @@ class FediPlanController extends AbstractController
$params['max_id'] = $max_id; $params['max_id'] = $max_id;
} }
$scheduled_reply = $mastodon_api->get_scheduled($params); $scheduled_reply = $mastodon_api->get_scheduled($params);
$statuses = $mastodon_api->getScheduledStatuses($scheduled_reply['response'], $this->getUser()); $statuses = $mastodon_api->getScheduledStatuses($scheduled_reply['response'], $user);
$data['max_id'] = $scheduled_reply['max_id']; $data['max_id'] = $scheduled_reply['max_id'];
$data['html'] = $this->renderView('fediplan/Ajax/layout.html.twig', ['statuses' => $statuses]); $data['html'] = $this->renderView('fediplan/Ajax/layout.html.twig', ['statuses' => $statuses]);
return new JsonResponse($data); return new JsonResponse($data);

View file

@ -1556,6 +1556,8 @@ class Mastodon_api
$attachment->setMeta(serialize($_m['meta'])); $attachment->setMeta(serialize($_m['meta']));
if ($_m['description']) if ($_m['description'])
$attachment->setDescription($_m['description']); $attachment->setDescription($_m['description']);
else
$attachment->setDescription("");
$media_attachments[] = $attachment; $media_attachments[] = $attachment;
} }
$status->setMediaAttachments($media_attachments); $status->setMediaAttachments($media_attachments);

View file

@ -1,6 +1,6 @@
{% trans_default_domain 'fediplan' %} {% trans_default_domain 'fediplan' %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="{{ app.request.locale }}" {% if app.request.locale == 'ar'%}dir="rtl"{% endif %}>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
@ -42,18 +42,18 @@
<footer class="footer"> <footer class="footer">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="col-md-4" style="text-align: center;"> <div class="col-4" style="text-align: center;">
<img src="{{ asset('img/FediPlan.png') }}" width="80" style=" border-radius: 5%;margin-top: 10px; margin-bottom: 10px; "><br/> <img src="{{ asset('img/FediPlan.png') }}" width="80" style=" border-radius: 5%;margin-top: 10px; margin-bottom: 10px; "><br/>
FediPlan -{{ "now"|date("Y") }} FediPlan -{{ "now"|date("Y") }}
</div> </div>
<div class="col-md-4" style="margin-top: 10px; text-align: center;"> <div class="col-4" style="margin-top: 10px; text-align: center;">
{{ 'common.author'|trans }}: Thomas<br/> {{ 'common.author'|trans }}: Thomas<br/>
Mastodon: <a href="https://toot.fedilab.app/@apps" target="_blank">@apps</a><br/> Mastodon: <a href="https://toot.fedilab.app/@apps" target="_blank">@apps</a><br/>
Framagit: <a href="https://framagit.org/tom79/" target="_blank">@tom79</a><br/> Framagit: <a href="https://framagit.org/tom79/" target="_blank">@tom79</a><br/>
Codeberg: <a href="https://codeberg.org/tom79/" target="_blank">@tom79</a><br/> Codeberg: <a href="https://codeberg.org/tom79/" target="_blank">@tom79</a><br/>
Github: <a href="https://github.com/stom79/" target="_blank">@stom79</a><br/> Github: <a href="https://github.com/stom79/" target="_blank">@stom79</a><br/>
</div> </div>
<div class="col-md-4" style="margin-top: 10px; text-align: center;"> <div class="col-4" style="margin-top: 10px; text-align: center;">
{{ 'common.license'|trans }}: <a href="https://www.gnu.org/licenses/gpl-3.0.fr.html" target="_blank">GPL 3</a><br/> {{ 'common.license'|trans }}: <a href="https://www.gnu.org/licenses/gpl-3.0.fr.html" target="_blank">GPL 3</a><br/>
<a href="https://framagit.org/tom79/fediplan" target="_blank">{{ 'common.source_code'|trans}}</a> <a href="https://framagit.org/tom79/fediplan" target="_blank">{{ 'common.source_code'|trans}}</a>
</div> </div>
@ -67,6 +67,7 @@
{% block javascripts %} {% block javascripts %}
<script src="{{ asset('js/jquery.min.js') }}"></script> <script src="{{ asset('js/jquery.min.js') }}"></script>
<script src="{{ asset('js/bootstrap.min.js') }}"></script> <script src="{{ asset('js/bootstrap.min.js') }}"></script>
<script src="{{ asset('js/bootstrap.bundle.min.js') }}"></script>
{% endblock %} {% endblock %}
</body> </body>
</html> </html>

View file

@ -6,7 +6,7 @@
{% include 'nav.html.twig' %} {% include 'nav.html.twig' %}
<div class="row"> <div class="row">
<div class="col-md-12" style="text-align: center;line-height: normal;margin-top: 100px;"> <pre> <div class=""col-12" style="text-align: center;line-height: normal;margin-top: 100px;"> <pre>
██╗ ██╗ ██████╗ ██╗ ██╗ ██╗ ██╗ ██████╗ ██╗ ██╗
██║ ██║██╔═████╗██║ ██║ ██║ ██║██╔═████╗██║ ██║
███████║██║██╔██║███████║ ███████║██║██╔██║███████║
@ -19,7 +19,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12" style="text-align: center"> <div class=""col-12" style="text-align: center">
--> <a href="{{ path('index') }}">200</a> <-- --> <a href="{{ path('index') }}">200</a> <--
</div> </div>
</div> </div>

View file

@ -6,7 +6,7 @@
{% include 'nav.html.twig' %} {% include 'nav.html.twig' %}
<div class="row"> <div class="row">
<div class="col-md-12" style="text-align: center;line-height: normal;margin-top: 100px;"> <pre> <div class=""col-12" style="text-align: center;line-height: normal;margin-top: 100px;"> <pre>
███████╗ ██████╗ ██████╗ ███████╗ ██████╗ ██████╗
██╔════╝██╔═████╗██╔═████╗ ██╔════╝██╔═████╗██╔═████╗
███████╗██║██╔██║██║██╔██║ ███████╗██║██╔██║██║██╔██║
@ -18,7 +18,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12" style="text-align: center"> <div class=""col-12" style="text-align: center">
--> <a href="{{ path('index') }}">200</a> <-- --> <a href="{{ path('index') }}">200</a> <--
</div> </div>
</div> </div>

View file

@ -2,7 +2,7 @@
{% for status in statuses %} {% for status in statuses %}
<div class="row" id="message_container_{{ status.getId() }}" style="margin-bottom: 20px;"> <div class="row" id="message_container_{{ status.getId() }}" style="margin-bottom: 20px;">
<div class="col-md-8"> <div class=""col-8">
<div class="card"> <div class="card">
<div class="card-horizontal" style=" display: flex;flex: 1 1 auto;"> <div class="card-horizontal" style=" display: flex;flex: 1 1 auto;">
<div class="img-square-wrapper"> <div class="img-square-wrapper">
@ -26,16 +26,16 @@
{% for media in status.getMediaAttachments() %} {% for media in status.getMediaAttachments() %}
<img class="" width="150" src="{{ media.url }}" <img class="" width="150" src="{{ media.url }}"
style=" border-radius: 5%; margin: 5px;" style=" border-radius: 5%; margin: 5px;"
{% if media.getDescription is not null %} {% if media.description is defined and media.description is not empty %}
alt="{{ media.getDescription() }}" alt="{{ media.description }}"
title="{{ media.getDescription() }}" title="{{ media.description }}"
{% endif %} {% endif %}
/> />
{% endfor %} {% endfor %}
</div> </div>
</div> </div>
{% endif %} {% endif %}
<div class="card-footer"> <div class="card-footer text-body-secondary">
<small class="text-muted"> <small class="text-muted">
{% if status.visibility == "public" %} {% if status.visibility == "public" %}
<i class="fa fa-globe"></i> <i class="fa fa-globe"></i>
@ -47,7 +47,7 @@
<i class="fa fa-envelope"></i> <i class="fa fa-envelope"></i>
{% endif %} {% endif %}
</small> - {{ status.scheduledAt | date('d/m/y H:i') }} </small> - {{ status.scheduledAt | date('d/m/y H:i') }}
<button class="btn btn-danger small" data-record-id="{{ status.getId() }}" style="position: absolute;right: 5px;bottom: 5px;" <button class="btn btn-danger btn-sm" data-record-id="{{ status.getId() }}" style="position: absolute;right: 5px;bottom: 5px;"
{% if status.content is not null %} {% if status.content is not null %}
data-record-title="{{ status.content }} - {{ status.scheduledAt | date('d/m/y H:m') }}" data-record-title="{{ status.content }} - {{ status.scheduledAt | date('d/m/y H:m') }}"
@ -55,7 +55,7 @@
data-record-title="{{ status.scheduledAt | date('d/m/y H:m') }}" data-record-title="{{ status.scheduledAt | date('d/m/y H:m') }}"
{% endif %} {% endif %}
data-toggle="modal" data-target="#confirm-delete" data-bs-toggle="modal" data-bs-target="#confirm-delete"
>X</button> >X</button>
</div> </div>
</div> </div>

View file

@ -6,27 +6,27 @@
{% include 'nav.html.twig' %} {% include 'nav.html.twig' %}
<h1>{{ 'common.about'|trans }}</h1> <h1>{{ 'common.about'|trans }}</h1>
<div class="row well"> <div class="row ">
<div class="col-md-8 jumbotron"> <div class="col-8 alert alert-secondary" role="alert">
{{ 'page.about.scheduling'|trans |raw}} {{ 'page.about.scheduling'|trans |raw}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-8 alert alert-primary" role="alert"> <div class="col-8 alert alert-primary" role="alert">
{{ 'page.about.data'|trans |raw}} {{ 'page.about.data'|trans |raw}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-8 alert alert-success" role="alert"> <div class="col-8 alert alert-success" role="alert">
{{ 'page.about.issues'|trans |raw}} {{ 'page.about.issues'|trans |raw}}
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-8 alert alert-info" role="alert"> <div class="col-8 alert alert-info" role="alert">
You can help to translate the project into your language with <b>Crowdin</b> at <a title="Crowdin" target="_blank" href="https://crowdin.com/project/fediplan"><img src="https://badges.crowdin.net/fediplan/localized.svg"></a> You can help to translate the project into your language with <b>Crowdin</b> at <a title="Crowdin" target="_blank" href="https://crowdin.com/project/fediplan"><img src="https://badges.crowdin.net/fediplan/localized.svg"></a>
</div> </div>
</div> </div>

View file

@ -12,13 +12,11 @@
{{ form_errors(form) }} {{ form_errors(form) }}
{% if flow.getCurrentStepNumber() == 1 %} {% if flow.getCurrentStepNumber() == 1 %}
<div class="row"> <div class="row">
<div class=" col-md-4"> <div class=" col-4">
<div class="form-group has-feedback"> <div class="form-group has-feedback">
{{ form_label(form.host) }} {{ form_label(form.host) }}
<div class="input-group"> <div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fa fa-globe"></i></span> <span class="input-group-text" id="basic-addon1"><i class="fa fa-globe"></i></span>
</div>
{{ form_widget(form.host, {'attr': {'class': 'form-control'}}) }} {{ form_widget(form.host, {'attr': {'class': 'form-control'}}) }}
</div> </div>
{% if not form.host.vars.errors is empty %} {% if not form.host.vars.errors is empty %}
@ -33,21 +31,19 @@
</div> </div>
{% elseif flow.getCurrentStepNumber() == 2 %} {% elseif flow.getCurrentStepNumber() == 2 %}
<div class="row"> <div class="row">
<div class="col-md-6"> <div class=""col-6">
<div class="alert alert-warning"> <div class="alert alert-warning">
{{ 'messages.login_authorization'|trans }} {{ 'messages.login_authorization'|trans }}
</div> </div>
<a href="{{ urlToMastodon }}" target="_blank" class="btn btn-default"> {{ 'messages.authorization_get'|trans }}</a> <a href="{{ urlToMastodon }}" target="_blank" class="btn btn-secondary"> {{ 'messages.authorization_get'|trans }}</a>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class=" col-md-4"> <div class=" col-md-4">
<div class="form-group has-feedback"> <div class="form-group has-feedback">
{{ form_label(form.code) }} {{ form_label(form.code) }}
<div class="input-group"> <div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1"><i class="fa fa-key"></i></span> <span class="input-group-text" id="basic-addon1"><i class="fa fa-key"></i></span>
</div>
{{ form_widget(form.code, {'attr': {'class': 'form-control'}}) }} {{ form_widget(form.code, {'attr': {'class': 'form-control'}}) }}
</div> </div>
@ -66,7 +62,7 @@
{% endif %} {% endif %}
{{ form_widget(form) }} {{ form_widget(form) }}
<div class="row"> <div class="row">
<div class="col-md-2"> <div class=""col-2">
<input type="submit" class="btn btn-primary btn-block btn-flat" value="{{ 'common.next'|trans }}"/> <input type="submit" class="btn btn-primary btn-block btn-flat" value="{{ 'common.next'|trans }}"/>
</div> </div>
</div> </div>

View file

@ -28,7 +28,7 @@
{{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }} {{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }}
<div class="row" style="margin-top: 30px;"> <div class="row" style="margin-top: 30px;">
<div class="col-md-12"> <div class=""col-12">
<div class="form-group has-feedback"> <div class="form-group has-feedback">
{{ form_label(form.content_warning) }} {{ form_label(form.content_warning) }}
{{ form_widget(form.content_warning, {'attr': {'class': 'form-control', 'data-emojiable':'true'}}) }} {{ form_widget(form.content_warning, {'attr': {'class': 'form-control', 'data-emojiable':'true'}}) }}
@ -54,7 +54,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-4 col-4" style="margin-top: 20px;"> <div class=""col-4 col-4" style="margin-top: 20px;">
<div class="form-inline has-feedback"> <div class="form-inline has-feedback">
<label for="count">{{ 'common.counter'|trans }}</label>&nbsp;&nbsp;<span id="count" >0</span> <label for="count">{{ 'common.counter'|trans }}</label>&nbsp;&nbsp;<span id="count" >0</span>
&nbsp;/{{ instanceConfiguration.statuses.maxCharacters }} &nbsp;/{{ instanceConfiguration.statuses.maxCharacters }}
@ -76,7 +76,7 @@
<div class=" col-md-4 col-4" style="margin-top: 20px;"> <div class=" col-md-4 col-4" style="margin-top: 20px;">
<div class="form-inline has-feedback"> <div class="form-inline has-feedback">
{{ form_label(form.sensitive) }}&nbsp;&nbsp; {{ form_label(form.sensitive) }}&nbsp;&nbsp;
{{ form_widget(form.sensitive, {'attr': {'class': 'form-control','data-toggle':'toggle', 'data-on': 'common.yes'|trans , 'data-off':'common.no'|trans}}) }} {{ form_widget(form.sensitive, {'attr': {'class': 'form-control','data-toggle':'toggle', 'data-onlabel': 'common.yes'|trans , 'data-offlabel':'common.no'|trans}}) }}
{% if not form.sensitive.vars.errors is empty %} {% if not form.sensitive.vars.errors is empty %}
<span class="badge badge-danger"> <span class="badge badge-danger">
{% for errorItem in form.sensitive.vars.errors %} {% for errorItem in form.sensitive.vars.errors %}
@ -114,7 +114,7 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="col-md-2 col-2"> <div class=""col-2 col-2">
<label for="count">{{ 'common.poll'|trans }}</label>&nbsp;&nbsp; <label for="count">{{ 'common.poll'|trans }}</label>&nbsp;&nbsp;
<span id="poll_switch" class="form-control" style="text-align: center;cursor:pointer;" > <i class="fa fa-tasks fa-fw"></i></span> <span id="poll_switch" class="form-control" style="text-align: center;cursor:pointer;" > <i class="fa fa-tasks fa-fw"></i></span>
@ -140,7 +140,7 @@
<div class="row"> <div class="row">
<div class=" col-md-4"> <div class=" col-md-4">
{{ form_label(form.poll_multiple) }} {{ form_label(form.poll_multiple) }}
{{ form_widget(form.poll_multiple, {'attr': {'class': 'form-control','data-toggle':'toggle', 'data-on': 'common.yes'|trans , 'data-off':'common.no'|trans}}) }} {{ form_widget(form.poll_multiple, {'attr': {'class': 'form-control','data-toggle':'toggle', 'data-onlabel': 'common.yes'|trans , 'data-offlabel':'common.no'|trans}}) }}
{% if not form.poll_multiple.vars.errors is empty %} {% if not form.poll_multiple.vars.errors is empty %}
<span class="badge badge-danger"> <span class="badge badge-danger">
{% for errorItem in form.poll_multiple.vars.errors %} {% for errorItem in form.poll_multiple.vars.errors %}
@ -171,7 +171,7 @@
<div class="container" style="margin-bottom: 30px;" id="media_container"></div> <div class="container" style="margin-bottom: 30px;margin-top: 50px;" id="media_container"></div>
</div> </div>
@ -236,11 +236,12 @@
<link rel="stylesheet" href="{{ asset('js/jQuery-File-Upload-10.1.0/css/doka.min.css') }}"> <link rel="stylesheet" href="{{ asset('js/jQuery-File-Upload-10.1.0/css/doka.min.css') }}">
<link rel="stylesheet" href="{{ asset('js/jQuery-File-Upload-10.1.0/css/blueimp-gallery.min.css') }}"> <link rel="stylesheet" href="{{ asset('js/jQuery-File-Upload-10.1.0/css/blueimp-gallery.min.css') }}">
<link rel="stylesheet" href="{{ asset('js/jQuery-File-Upload-10.1.0/css/jquery.fileupload.css') }}"> <link rel="stylesheet" href="{{ asset('js/jQuery-File-Upload-10.1.0/css/jquery.fileupload.css') }}">
<link rel="stylesheet" href="{{ asset('css/bootstrap4-toggle.min.css') }}"> <link rel="stylesheet" href="{{ asset('css/bootstrap-toggle.min.css') }}">
<link rel="stylesheet" href="{{ asset('css/emojionearea.css') }}"> <link rel="stylesheet" href="{{ asset('css/emojionearea.css') }}">
{% endblock %} {% endblock %}
{% block javascripts %} {% block javascripts %}
{{ parent() }}
<!-- The blueimp Gallery widget --> <!-- The blueimp Gallery widget -->
<div <div
id="blueimp-gallery" id="blueimp-gallery"
@ -277,7 +278,7 @@
<td> <td>
{% if (!o.options.autoUpload && o.options.edit && o.options.loadImageFileTypes.test(file.type)) { %} {% if (!o.options.autoUpload && o.options.edit && o.options.loadImageFileTypes.test(file.type)) { %}
<button class="btn btn-success edit" data-index="{%=i%}" disabled <button class="btn btn-success edit" data-index="{%=i%}" disabled
data-toggle="tooltip" data-placement="top" title="{% endverbatim %}{{ 'page.schedule.form.edit_media'|trans }} {% verbatim %}" data-bs-toggle="tooltip" data-placement="top" title="{% endverbatim %}{{ 'page.schedule.form.edit_media'|trans }} {% verbatim %}"
> >
<i class="glyphicon glyphicon-edit"></i> <i class="glyphicon glyphicon-edit"></i>
<span>{% endverbatim %}{{ 'common.edit'|trans }} {% verbatim %}</span> <span>{% endverbatim %}{{ 'common.edit'|trans }} {% verbatim %}</span>
@ -285,7 +286,7 @@
{% } %} {% } %}
{% if (!i && !o.options.autoUpload) { %} {% if (!i && !o.options.autoUpload) { %}
<button class="btn btn-primary start" disabled <button class="btn btn-primary start" disabled
data-toggle="tooltip" data-placement="top" title="{% endverbatim %}{{ 'page.schedule.form.upload_media'|trans }} {% verbatim %}" data-bs-toggle="tooltip" data-placement="top" title="{% endverbatim %}{{ 'page.schedule.form.upload_media'|trans }} {% verbatim %}"
> >
<i class="glyphicon glyphicon-upload"></i> <i class="glyphicon glyphicon-upload"></i>
<span> {% endverbatim %} {{ 'common.start'|trans }} {% verbatim %} </span> <span> {% endverbatim %} {{ 'common.start'|trans }} {% verbatim %} </span>
@ -344,14 +345,12 @@
</script> </script>
{% endverbatim %} {% endverbatim %}
<span id="data_api" data-token="{{ token }}" data-instance="{{ instance }}"></span> <span id="data_api" data-token="{{ token }}" data-instance="{{ instance }}"></span>
<script src="{{ asset('js/jquery.min.js') }}"></script>
<script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/vendor/jquery.ui.widget.js') }}"></script> <script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/vendor/jquery.ui.widget.js') }}"></script>
<script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/tmpl.min.js') }}"></script> <script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/tmpl.min.js') }}"></script>
<script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/load-image.all.min.js') }}"></script> <script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/load-image.all.min.js') }}"></script>
<script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/canvas-to-blob.min.js') }}"></script> <script src="{{ asset('js/jQuery-File-Upload-10.1.0/js/canvas-to-blob.min.js') }}"></script>
<script src="{{ asset('js/bootstrap4-toggle.min.js') }}"></script> <script src="{{ asset('js/bootstrap-toggle.min.js') }}"></script>
<script src="{{ asset('js/bootstrap.min.js') }}"></script>
@ -419,14 +418,14 @@
var message = "{{ 'common.delete'|trans }}"; var message = "{{ 'common.delete'|trans }}";
var content; var content;
content = ' <div class="row" id="media_container_'+data.id+'">\n' + content = ' <div class="row" id="media_container_'+data.id+'">\n' +
' <div class="col-md-4">\n' + ' <div class=""col-4">\n' +
' <img src="'+data.preview_url+'" style="width:100%;max-width:200px;" id="media_preview_'+data.id+'"/>\n' + ' <img src="'+data.preview_url+'" style="width:100%;max-width:200px;" id="media_preview_'+data.id+'"/>\n' +
' </div>\n' + ' </div>\n' +
' <div class="col-md-6">\n' + ' <div class=""col-6">\n' +
' <textarea name="media_description_'+data.id+'" class="form-control"></textarea>\n' + ' <textarea name="media_description_'+data.id+'" class="form-control"></textarea>\n' +
' </div>\n' + ' </div>\n' +
' <input type="hidden" name="media_id_'+data.id+'" value="'+data.id+'"/>\n' + ' <input type="hidden" name="media_id_'+data.id+'" value="'+data.id+'"/>\n' +
' <div class="col-md-2">\n' + ' <div class=""col-2">\n' +
' <button type="button" class="btn btn-danger delete_media" data-id="'+data.id+'">\n' + ' <button type="button" class="btn btn-danger delete_media" data-id="'+data.id+'">\n' +
' <i class="glyphicon glyphicon-trash"></i>\n' + ' <i class="glyphicon glyphicon-trash"></i>\n' +
' <span>'+message+'</span>\n' + ' <span>'+message+'</span>\n' +

View file

@ -9,31 +9,30 @@
<div class="row container"> <div class="row container">
<div class="col-md-12" id="content"></div> <div class=""col-12" id="content"></div>
</div> </div>
<div class="row container hide" id="loader" style="text-align: center;margin-top: 50px;"><div class="lds-ring"><div></div><div></div><div></div><div></div></div></div> <div class="row container hide" id="loader" style="text-align: center;margin-top: 50px;"><div class="lds-ring"><div></div><div></div><div></div><div></div></div></div>
<div class="row hide" id="no_content" style="margin-top: 50px;"> <div class="row hide" id="no_content" style="margin-top: 50px;">
<div class="col-md-offset-3 col-md-6"> <div class=""col-offset-3 col-md-6">
<div class="alert alert-warning" style="font-size: 1.5em;text-align: center;">{{ 'common.no_results_found'|trans }}</div> <div class="alert alert-warning" style="font-size: 1.5em;text-align: center;">{{ 'common.no_results_found'|trans }}</div>
</div> </div>
</div> </div>
<div class="modal fade" id="confirm-delete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal fade" id="confirm-delete" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h1 class="modal-title fs-5" id="myModalLabel">{{ 'common.confirm_delete'|trans }}</h1>
<h4 class="modal-title" id="myModalLabel">{{ 'common.confirm_delete'|trans }}</h4> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p>{{ 'common.delete_message'|trans }} <b><i class="title"></i></b></p> <p>{{ 'common.delete_message'|trans }} <b><i class="title"></i></b></p>
<p>{{ 'common.proceed_confirm'|trans }}</p> <p>{{ 'common.proceed_confirm'|trans }}</p>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">{{ 'common.cancel'|trans }}</button> <button type="button" class="btn btn-secondary" data-dismiss="modal">{{ 'common.cancel'|trans }}</button>
<button type="button" class="btn btn-danger btn-ok">{{ 'common.delete'|trans }}</button> <button type="button" class="btn btn-danger btn-ok">{{ 'common.delete'|trans }}</button>
</div> </div>
</div> </div>
@ -86,6 +85,7 @@
.done(function(data) { .done(function(data) {
$("#message_container_"+id).remove(); $("#message_container_"+id).remove();
$('#confirm-delete').modal('hide'); $('#confirm-delete').modal('hide');
$('.modal-backdrop').remove();
$modalDiv.modal('hide').removeClass('loading'); $modalDiv.modal('hide').removeClass('loading');
}) })
.fail(function() { .fail(function() {

View file

@ -1,13 +1,25 @@
{% trans_default_domain 'fediplan' %} {% trans_default_domain 'fediplan' %}
<header> <header>
<!-- Fixed navbar --> <!-- Fixed navbar -->
<nav class="navbar navbar-expand-md navbar-light fixed-top bg-light"> <nav class="navbar fixed-top navbar-expand-lg bg-body-tertiary">
<a class="navbar-brand" href="#">FediPlan</a> <div class="container-fluid">
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation"> <a class="navbar-brand" href="#">
<img src="{{ asset('img/FediPlan.png') }}" alt="Logo" width="24" height="24" class="d-inline-block align-text-top"/>
FediPlan
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasNavbar" aria-controls="offcanvasNavbar" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarCollapse"> <div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasNavbar" aria-labelledby="offcanvasNavbarLabel">
<ul class="navbar-nav mr-auto"> <div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasNavbarLabel">
<img src="{{ asset('img/FediPlan.png') }}" alt="Logo" width="24" height="24" class="d-inline-block align-text-top"/>
FediPlan
</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<ul class="navbar-nav flex-grow-1 pe-3">
{% if not is_granted('ROLE_USER') %} {% if not is_granted('ROLE_USER') %}
<li class="nav-item {% if app.request.attributes.get('_route') == 'index' %} active {% endif %}"> <li class="nav-item {% if app.request.attributes.get('_route') == 'index' %} active {% endif %}">
<a class="nav-link" href="{{ path('index') }}">{{ 'common.login'|trans }} <span class="sr-only">(current)</span></a> <a class="nav-link" href="{{ path('index') }}">{{ 'common.login'|trans }} <span class="sr-only">(current)</span></a>
@ -33,10 +45,10 @@
<a class="nav-link" href="https://fedilab.app/page/donations/" tabindex="-1" >{{ 'common.support_my_work'|trans }}</a> <a class="nav-link" href="https://fedilab.app/page/donations/" tabindex="-1" >{{ 'common.support_my_work'|trans }}</a>
</li> </li>
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{ getLanguage(app.request.locale) }} {{ getLanguage(app.request.locale) }}
</a> </a>
<div class="dropdown-menu scrollable-menu"> <ul class="dropdown-menu scrollable-menu">
{% set route = app.request.attributes.get('_route') %} {% set route = app.request.attributes.get('_route') %}
{% if route == "app_fediplan_about" %} {% if route == "app_fediplan_about" %}
{% set route = "about" %} {% set route = "about" %}
@ -44,22 +56,24 @@
{% if route | length < 5 %} {% if route | length < 5 %}
{% set route = "index" %} {% set route = "index" %}
{% endif %} {% endif %}
<a class="dropdown-item" href="{{ path(route, {'_locale':'en' }) }}">English</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'en' }) }}">English</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'fr' }) }}">Français</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'fr' }) }}">Français</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'de' }) }}">Deutsch</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'de' }) }}">Deutsch</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'nl' }) }}">Nederlands</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'nl' }) }}">Nederlands</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'ar' }) }}">العربية</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'ar' }) }}">العربية</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'it' }) }}">Italiano</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'it' }) }}">Italiano</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'pt-PT' }) }}">Português</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'pt-PT' }) }}">Português</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'pt-BR' }) }}">Brasil</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'pt-BR' }) }}">Brasil</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'ca' }) }}">Català</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'ca' }) }}">Català</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'ja' }) }}">日本語</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'ja' }) }}">日本語</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'pl' }) }}">Polski</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'pl' }) }}">Polski</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'ru' }) }}">Русский</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'ru' }) }}">Русский</a></li>
<a class="dropdown-item" href="{{ path(route, {'_locale':'uk' }) }}">Украïна</a> <li><a class="dropdown-item" href="{{ path(route, {'_locale':'uk' }) }}">Украïна</a></li>
</div> </ul>
</li> </li>
</ul> </ul>
</div> </div>
</div>
</div>
</nav> </nav>
</header> </header>

View file

@ -48,15 +48,15 @@ error:
mastodon_account_already_used: This account is already managed by someone else! mastodon_account_already_used: This account is already managed by someone else!
page: page:
index: index:
about: FediPlan is an open source application (<a href="https://framagit.org/tom79/fediplan" target="_blank">source code</a>) built for scheduling your messages with <a href="https://joinmastodon.org/" target="_blank">Mastodon</a> or <a href="https://pleroma.social/" target="_blank">Pleroma</a> (2.7+). about: FediPlan is an open source application (<a href="https://framagit.org/tom79/fediplan" target="_blank">source code</a>) built for scheduling your messages with <a href="https://joinmastodon.org/" target="_blank">Mastodon</a> or <a href="https://pleroma.social/" target="_blank">Pleroma</a> (2.0.7+).
data: It <b>does not store any data</b> (token or messages), that is why you need to create a new Token when your session expired. data: It <b>does not store any data</b> (token or messages), that is why you need to create a new Token when your session expired.
form: form:
code: Your authorization code code: Your authorization code
instance: Your instance instance: Your instance
about: about:
scheduling: FediPlan allows users to schedule messages for Mastodon and Pleroma (with media attachments).<br/> The scheduled date must be at least 5 minutes into the future. At most, 300 messages can be scheduled at the same time. Only 50 messages can be scheduled for any given day. scheduling: FediPlan allows users to schedule messages for Mastodon and Pleroma (with media attachments).<br/> The scheduled date must be at least 5 minutes into the future. At most, 300 messages can be scheduled at the same time. Only 50 messages can be scheduled for any given day.
data: 'FediPlan does not store your scheduled messages nor your credentials. It only uses the Mastodon API for <a href="https://docs.joinmastodon.org/api/rest/statuses/#scheduled-status" target="_blank">scheduling messages</a>' data: 'FediPlan does not store your scheduled messages nor your credentials. It only uses the Mastodon API for <a href="https://docs.joinmastodon.org/methods/scheduled_statuses/" target="_blank">scheduling messages</a>'
issues: You can report issues or ask improvements on <a href="https://github.com/stom79/FediPlan/issues" target="_blank">Github</a> or <a href="https://framagit.org/tom79/fediplan/issues" target="_blank">Framagit</a>. issues: You can report issues or ask improvements on <a href="https://framagit.org/tom79/fediplan/issues" target="_blank">Framagit</a>.
schedule: schedule:
form: form:
content_warning: Content warning content_warning: Content warning