diff --git a/data/www/css/compiled/main-studio.css b/data/www/css/compiled/main-studio.css index 1211f3d..fdd457a 100644 --- a/data/www/css/compiled/main-studio.css +++ b/data/www/css/compiled/main-studio.css @@ -1 +1 @@ -*{font-family:Roboto,Arial,"sans-serif"}html{height:100vh;margin:0;padding:0;display:flex;background-color:#0f0035;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}body{margin:0;padding:0;flex:1;background-color:#0f0035;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}.invisible{visibility:hidden!important}.hidden{display:none!important}.tac{text-align:center}a{text-decoration:none}header{text-align:center;display:flex;justify-content:flex-start;align-items:center;align-self:stretch;padding:0 25px}header .logo{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}header .logo a{color:inherit;display:flex;justify-content:center;align-items:center}header .logo img{width:32px;height:32px;margin-right:10px}header nav{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex:1}header nav ul{list-style:none;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}header nav ul li{margin:0 15px}header nav ul li.user-menu{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;border:1px solid rgb(14,239,95);padding:5px 15px;border-radius:4px;background:#0eef5f33}header nav ul li.user-menu .logout{color:#fff}header nav ul li.user-menu .username{margin-right:20px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;font-weight:700;color:#0eef5f}header nav ul li.user-menu .username i{margin-right:5px;font-size:12px}header nav ul li a{color:#fff9;text-decoration:none}header nav ul li a:hover,header nav ul li.active a{color:#fff}footer{align-self:stretch;justify-content:center;align-items:center;flex-direction:column;display:flex;padding:20px}footer .version{opacity:.3}.container{background:#0000001a;margin:auto;display:flex;align-self:stretch;flex-direction:column;justify-content:flex-start;align-items:center;flex:1;min-width:70%}@media only screen and (max-width: 1200px){.container{min-width:95%}}.container.expand{min-width:100%}@media only screen and (max-width: 1200px){.container.expand{min-width:100%}}select.select-item-picker,a.btn,button{background-color:#fff;border-radius:5px;border:1px solid rgb(188,72,255);color:#251142;padding:10px 30px;text-decoration:none;margin:10px;cursor:pointer;display:flex;flex-direction:row;justify-content:center;align-items:center;font-weight:400;font-size:14px;transition:.2s linear all}a.btn:hover,button:hover{color:#bc48ff}select.select-item-picker,button.purple{font-weight:700;border:1px solid rgb(105,47,189);color:#fff;background:#692fbd;background:linear-gradient(90deg,#bc48ff,#692fbd)}button.green{font-weight:700;color:#fff;border:1px solid rgb(14,239,95);background:linear-gradient(90deg,#3cf47e,#0bbf4c)}button.normal:hover{color:#fff;border-color:#692fbd;background:#692fbd;background:linear-gradient(90deg,#bc48ff,#692fbd)}button.green:hover,button.purple:hover{border:1px solid rgb(255,255,255)}.alert{margin:10px 30px 20px;padding:20px 50px;align-self:stretch;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:4px}.alert-info{color:#464646;border:1px solid rgb(70,70,70);background:#46464633}.alert-success{color:#0eef5f;border:1px solid rgb(14,239,95);background:#0eef5f33}.alert-error{color:#ef0e5d;border:1px solid rgb(239,14,93);background:#ef0e5d33}.alert-icon{border-radius:4px;padding:3px 4px;min-width:18px;text-align:center}.modals{position:fixed;background:#0006;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.modals-outer{min-width:30%;display:flex;flex-direction:column;overflow:auto}.modals-outer .modal-close{color:#fff;font-size:30px;display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-bottom:20px;margin-top:0}.modals-inner{background:#fff;border-radius:10px;color:#333}.modals-inner .modal h2{border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}.modals-inner .modal h3{align-self:stretch;border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}.panel{background:#ffffff26;border-radius:5px;padding:0 25px 80px;margin:10px 25px;border-left:5px solid rgb(14,239,95);align-self:stretch}.panel.no-border{border:none}.panel h3{color:#fff}.panel-inactive{background:#fff;color:#999;border-color:#999}.panel-inactive h3{color:#1a1a1a}.panel table{width:100%;margin-top:30px;border-collapse:collapse;text-align:left;font-weight:400}.panel th{border-bottom:1px solid rgb(255,255,255);border-collapse:collapse;padding:10px;font-weight:400}.panel-inactive th{border-color:#999}.panel td{border-collapse:collapse;padding:10px}.panel td a.item.sort{cursor:move}.panel td a.item-name{color:#fff}.panel-inactive td a.item-name{color:#999}.panel td a.item-name:hover{text-decoration:underline}.panel td.actions a{background:#fff;color:#333;border:1px solid rgb(153,153,153);border-radius:4px;padding:2px;width:35px;display:inline-block;text-align:center;margin:0 2px}.panel td.actions a:hover{color:#0eef5f;border-color:#0eef5f}.panel td.actions a.item-edit:hover{color:#bc48ff;border-color:#bc48ff}.panel td.actions a.item-delete:hover{color:#ef0e5d;border-color:#ef0e5d}.panel td.infos{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start}.panel td .inner{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.panel td div.badge{margin-right:5px;font-size:10px;font-weight:700}.panel a{color:#0eef5f;text-decoration:none}.panel a:hover{color:#0bbf4c}.panel.panel-menu{display:flex;flex:1;flex-direction:column;align-self:stretch;margin-right:0;border-color:#692fbd}.panel.panel-menu ul{flex:1;max-width:250px;display:flex;flex-direction:column;align-self:stretch;list-style:none;margin:0;padding:0}.panel.panel-menu ul li{margin:3px 0}.panel.panel-menu ul li a{padding:5px 15px;color:inherit;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex:1}.panel.panel-menu ul li:hover{color:#464646;font-weight:700}.panel.panel-menu ul li.active{color:#692fbd;background:#692fbd57;border-radius:4px;font-weight:700;border:1px solid rgb(105,47,189)}.panel.panel-menu ul li.active a{color:inherit}.pure-material-switch{z-index:0;position:relative;display:inline-block}.pure-material-switch>input{appearance:none;-moz-appearance:none;-webkit-appearance:none;z-index:-1;position:absolute;right:6px;top:-8px;display:block;margin:0;border-radius:50%;width:40px;height:40px;background-color:#00000061;outline:none;opacity:0;transform:scale(1);pointer-events:none;transition:opacity .3s .1s,transform .2s .1s}.pure-material-switch>span{display:inline-block;width:100%;cursor:pointer}.pure-material-switch>span:before{content:"";float:right;display:inline-block;margin:5px 0 5px 10px;border-radius:7px;width:36px;height:14px;background-color:#00000061;vertical-align:top;transition:background-color .2s,opacity .2s}.pure-material-switch>span:after{content:"";position:absolute;top:2px;right:16px;border-radius:50%;width:20px;height:20px;background-color:#fff;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:background-color .2s,transform .2s}.pure-material-switch>input:checked{right:-10px;background-color:#0eef5f}.pure-material-switch>input:checked+span:before{background-color:#0eef5f99}.pure-material-switch>input:checked+span:after{background-color:#0eef5f;transform:translate(16px)}.pure-material-switch:hover>input{opacity:.04}.pure-material-switch>input:focus{opacity:.12}.pure-material-switch:hover>input:focus{opacity:.16}.pure-material-switch>input:active{opacity:1;transform:scale(0);transition:transform 0s,opacity 0s}.pure-material-switch>input:active+span:before{background-color:#0eef5f99}.pure-material-switch>input:checked:active+span:before{background-color:#00000061}.pure-material-switch>input:disabled{opacity:0}.pure-material-switch>input:disabled+span{color:#000;opacity:.38;cursor:default}.pure-material-switch>input:disabled+span:before{background-color:#00000061}.pure-material-switch>input:checked:disabled+span:before{background-color:#0eef5f99}.login-page{max-width:600px;padding-top:50px}.card{background:#fff;border-radius:6px;padding:50px;color:#333}.card .form{padding:0}.card .form .form-group{margin:0 0 30px;padding:0}.card .form .form-group .widget{flex:1}.card .form .form-group label{text-align:left}.card button[type=submit]{margin:0 auto}.card h3{text-align:center;font-size:36px;margin:0 0 40px}span.empty{text-transform:uppercase;opacity:.5;color:#999}a.badge,.badge{display:flex;flex-direction:row;justify-content:center;align-items:center;padding:5px;border-radius:4px;font-size:12px;background:#ffffff1a;border:1px solid transparent;color:#fff}a.badge:hover{color:#fff;border:1px solid rgba(255,255,255,.4)}.panel-inactive .badge{background:#9999991a;color:#999}.panel-inactive a.badge:hover{color:#999;border:1px solid rgba(153,153,153,.2)}.badge.anonymous{opacity:.2}.explorer{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;align-self:stretch}.explorer .left{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;flex:1}.explorer .right{flex:3;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.explorer .panel-active{background:#fff;color:#999;border-color:#999}.explorer .panel-active h3{color:#0eef5f}.explorer .panel-inactive{background:#fff;color:#999;border-color:#999}.toolbar{display:flex;flex-direction:row;padding:0 25px;align-self:stretch}.toolbar h2{padding:0 25px 0 0}.toolbar .toolbar-actions{flex:1;display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.icon-right{margin:0 0 0 10px}.icon-left{margin:0 10px 0 0}.form{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:20px}.form .form-group{margin:10px 20px 5px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1}.form .form-group label{flex:1;padding:10px;text-align:right;margin-right:20px}.form .form-group .widget{flex:3;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch}.form .form-group input,.form .form-group select,.form .form-group textarea{flex:1;padding:10px 5px;border:1px solid #e6e6e6;border-radius:4px;width:auto}.form .form-group input[type=checkbox]{flex:0}.form .form-group .trigger{margin-right:10px}.form .form-group select.trigger{max-width:120px}.form .form-group span{margin-left:10px}.form .actions{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-top:10px;align-self:stretch}.form .actions button.green,.form .actions button{font-size:18px}.form .actions button.green:hover{background:#fff;color:#0eef5f;border-color:#0eef5f}.form .actions button.btn-normal{color:#999;border-color:#999;font-size:18px;margin:0}.form .actions button.btn-normal:hover{color:#464646;border-color:#464646}.plugin-description{font-size:14px;margin-left:34px;color:#999}.panel-logs{padding-bottom:20px}.panel-logs pre{background:#000000e6;border:1px solid rgb(70,70,70);border-radius:4px;font-family:monospace;color:#f2f2f2;padding:20px;min-height:200px;max-height:500px;overflow:auto} +*{font-family:Roboto,Arial,"sans-serif"}html{height:100vh;margin:0;padding:0;display:flex;background-color:#0f0035;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}body{margin:0;padding:0;flex:1;background-color:#0f0035;color:#fff;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch}.invisible{visibility:hidden!important}.hidden{display:none!important}.tac{text-align:center}a{text-decoration:none}header{text-align:center;display:flex;justify-content:flex-start;align-items:center;align-self:stretch;padding:0 25px}header .logo{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}header .logo a{color:inherit;display:flex;justify-content:center;align-items:center}header .logo img{width:32px;height:32px;margin-right:10px}header nav{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;flex:1}header nav ul{list-style:none;display:flex;flex-direction:row;justify-content:flex-start;align-items:center}header nav ul li{margin:0 15px}header nav ul li.user-menu{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;border:1px solid rgb(14,239,95);padding:5px 15px;border-radius:4px;background:#0eef5f33}header nav ul li.user-menu .logout{color:#fff}header nav ul li.user-menu .username{margin-right:20px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;font-weight:700;color:#0eef5f}header nav ul li.user-menu .username i{margin-right:5px;font-size:12px}header nav ul li a{color:#fff9;text-decoration:none}header nav ul li a:hover,header nav ul li.active a{color:#fff}footer{align-self:stretch;justify-content:center;align-items:center;flex-direction:column;display:flex;padding:20px}footer .version{opacity:.3}.container{background:#0000001a;margin:auto;display:flex;align-self:stretch;flex-direction:column;justify-content:flex-start;align-items:center;flex:1;min-width:70%}@media only screen and (max-width: 1200px){.container{min-width:95%}}.container.expand{min-width:100%}@media only screen and (max-width: 1200px){.container.expand{min-width:100%}}select.select-item-picker,.btn,button{background-color:#fff;border-radius:5px;border:1px solid rgb(188,72,255);color:#251142;padding:10px 30px;text-decoration:none;margin:10px;cursor:pointer;display:flex;flex-direction:row;justify-content:center;align-items:center;font-weight:400;font-size:14px;transition:.2s linear all}a.btn:hover,button:hover{color:#bc48ff}select.select-item-picker,button.purple{font-weight:700;border:1px solid rgb(105,47,189);color:#fff;background:#692fbd;background:linear-gradient(90deg,#bc48ff,#692fbd)}button.green{font-weight:700;color:#fff;border:1px solid rgb(14,239,95);background:linear-gradient(90deg,#3cf47e,#0bbf4c)}button.normal:hover{color:#fff;border-color:#692fbd;background:#692fbd;background:linear-gradient(90deg,#bc48ff,#692fbd)}button.green:hover,button.purple:hover{border:1px solid rgb(255,255,255)}.alert{margin:10px 30px 20px;padding:20px 50px;align-self:stretch;display:flex;flex-direction:row;justify-content:center;align-items:center;border-radius:4px}.alert-info{color:#464646;border:1px solid rgb(70,70,70);background:#46464633}.alert-success{color:#0eef5f;border:1px solid rgb(14,239,95);background:#0eef5f33}.alert-error{color:#ef0e5d;border:1px solid rgb(239,14,93);background:#ef0e5d33}.alert-icon{border-radius:4px;padding:3px 4px;min-width:18px;text-align:center}.modals{position:fixed;background:#0006;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;justify-content:center;align-items:center}.modals-outer{min-width:30%;display:flex;flex-direction:column;overflow:auto}.modals-outer .modal-close{color:#fff;font-size:30px;display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-bottom:20px;margin-top:0}.modals-inner{background:#fff;border-radius:10px;color:#333}.modals-inner .modal h2{border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}.modals-inner .modal h3{align-self:stretch;border-bottom:1px solid rgb(153,153,153);padding:15px;margin:0}.panel{background:#ffffff26;border-radius:5px;padding:0 25px 80px;margin:10px 25px;border-left:5px solid rgb(14,239,95);align-self:stretch}.panel.no-border{border:none}.panel h3{color:#fff}.panel-inactive{background:#fff;color:#999;border-color:#999}.panel-inactive h3{color:#1a1a1a}.panel table{width:100%;margin-top:30px;border-collapse:collapse;text-align:left;font-weight:400}.panel th{border-bottom:1px solid rgb(255,255,255);border-collapse:collapse;padding:10px;font-weight:400}.panel-inactive th{border-color:#999}.panel td{border-collapse:collapse;padding:10px}.panel td .td-secondary{font-size:14px;opacity:.6;margin-left:3px}.panel td a.item.sort{cursor:move}.panel td a.item-name{color:#fff}.panel-inactive td a.item-name{color:#999}.panel td a.item-name:hover{text-decoration:underline}.panel td.actions a{background:#fff;color:#333;border:1px solid rgb(153,153,153);border-radius:4px;padding:2px;width:35px;display:inline-block;text-align:center;margin:0 2px}.panel td.actions a:hover{color:#0eef5f;border-color:#0eef5f}.panel td.actions a.item-edit:hover{color:#bc48ff;border-color:#bc48ff}.panel td.actions a.item-delete:hover{color:#ef0e5d;border-color:#ef0e5d}.panel td.infos{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start}.panel td .inner{display:flex;flex-direction:row;justify-content:flex-start;align-items:center}.panel td div.badge{margin-right:5px;font-size:10px;font-weight:700}.panel a{color:#0eef5f;text-decoration:none}.panel a:hover{color:#0bbf4c}.panel.panel-menu{display:flex;flex:1;flex-direction:column;align-self:stretch;margin-right:0;border-color:#692fbd}.panel.panel-menu ul{flex:1;max-width:250px;display:flex;flex-direction:column;align-self:stretch;list-style:none;margin:0;padding:0}.panel.panel-menu ul li{margin:3px 0}.panel.panel-menu ul li a{padding:5px 15px;color:inherit;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;flex:1}.panel.panel-menu ul li:hover{color:#464646;font-weight:700}.panel.panel-menu ul li.active{color:#692fbd;background:#692fbd57;border-radius:4px;font-weight:700;border:1px solid rgb(105,47,189)}.panel.panel-menu ul li.active a{color:inherit}.pure-material-switch{z-index:0;position:relative;display:inline-block}.pure-material-switch>input{appearance:none;-moz-appearance:none;-webkit-appearance:none;z-index:-1;position:absolute;right:6px;top:-8px;display:block;margin:0;border-radius:50%;width:40px;height:40px;background-color:#00000061;outline:none;opacity:0;transform:scale(1);pointer-events:none;transition:opacity .3s .1s,transform .2s .1s}.pure-material-switch>span{display:inline-block;width:100%;cursor:pointer}.pure-material-switch>span:before{content:"";float:right;display:inline-block;margin:5px 0 5px 10px;border-radius:7px;width:36px;height:14px;background-color:#00000061;vertical-align:top;transition:background-color .2s,opacity .2s}.pure-material-switch>span:after{content:"";position:absolute;top:2px;right:16px;border-radius:50%;width:20px;height:20px;background-color:#fff;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;transition:background-color .2s,transform .2s}.pure-material-switch>input:checked{right:-10px;background-color:#0eef5f}.pure-material-switch>input:checked+span:before{background-color:#0eef5f99}.pure-material-switch>input:checked+span:after{background-color:#0eef5f;transform:translate(16px)}.pure-material-switch:hover>input{opacity:.04}.pure-material-switch>input:focus{opacity:.12}.pure-material-switch:hover>input:focus{opacity:.16}.pure-material-switch>input:active{opacity:1;transform:scale(0);transition:transform 0s,opacity 0s}.pure-material-switch>input:active+span:before{background-color:#0eef5f99}.pure-material-switch>input:checked:active+span:before{background-color:#00000061}.pure-material-switch>input:disabled{opacity:0}.pure-material-switch>input:disabled+span{color:#000;opacity:.38;cursor:default}.pure-material-switch>input:disabled+span:before{background-color:#00000061}.pure-material-switch>input:checked:disabled+span:before{background-color:#0eef5f99}.login-page{max-width:600px;padding-top:50px}.card{background:#fff;border-radius:6px;padding:50px;color:#333}.card .form{padding:0}.card .form .form-group{margin:0 0 30px;padding:0}.card .form .form-group .widget{flex:1}.card .form .form-group label{text-align:left}.card button[type=submit]{margin:0 auto}.card h3{text-align:center;font-size:36px;margin:0 0 40px}span.empty{text-transform:uppercase;opacity:.5;color:#999}a.badge,.badge{display:flex;flex-direction:row;justify-content:center;align-items:center;padding:5px;border-radius:4px;font-size:12px;background:#ffffff1a;border:1px solid transparent;color:#fff}a.badge:hover{color:#fff;border:1px solid rgba(255,255,255,.4)}.panel-inactive .badge{background:#9999991a;color:#999}.panel-inactive a.badge:hover{color:#999;border:1px solid rgba(153,153,153,.2)}.badge.anonymous{opacity:.2}.explorer{display:flex;flex-direction:row;justify-content:flex-start;align-items:flex-start;align-self:stretch}.explorer .left{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;align-self:stretch;flex:1}.explorer .right{flex:3;display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start}.explorer .panel-active{background:#fff;color:#999;border-color:#999}.explorer .panel-active h3{color:#0eef5f}.explorer .panel-inactive{background:#fff;color:#999;border-color:#999}.toolbar{display:flex;flex-direction:row;padding:0 25px;align-self:stretch}.toolbar h2{padding:0 25px 0 0}.toolbar .toolbar-actions{flex:1;display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.icon-right{margin:0 0 0 10px}.icon-left{margin:0 10px 0 0}.form{display:flex;flex-direction:column;justify-content:flex-start;align-items:flex-start;padding:20px}.form .form-group{margin:10px 20px 5px;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch;flex:1}.form .form-group label{flex:1;padding:10px;text-align:right;margin-right:20px}.form .form-group .widget{flex:3;display:flex;flex-direction:row;justify-content:flex-start;align-items:center;align-self:stretch}.form .form-group input,.form .form-group select,.form .form-group textarea{flex:1;padding:10px 5px;border:1px solid #e6e6e6;border-radius:4px;width:auto}.form .form-group input[type=checkbox]{flex:0}.form .form-group .trigger{margin-right:10px}.form .form-group select.trigger{max-width:120px}.form .form-group span{margin-left:10px}.form .actions{display:flex;flex-direction:row;justify-content:flex-end;align-items:center;margin-top:10px;align-self:stretch}.form .actions button.green,.form .actions button{font-size:18px}.form .actions button.green:hover{background:#fff;color:#0eef5f;border-color:#0eef5f}.form .actions button.btn-normal{color:#999;border-color:#999;font-size:18px;margin:0}.form .actions button.btn-normal:hover{color:#464646;border-color:#464646}.plugin-description{font-size:14px;margin-left:34px;color:#999}.panel-logs{padding-bottom:20px}.panel-logs pre{background:#000000e6;border:1px solid rgb(70,70,70);border-radius:4px;font-family:monospace;color:#f2f2f2;padding:20px;min-height:200px;max-height:500px;overflow:auto} diff --git a/data/www/js/slideshow/slides.js b/data/www/js/slideshow/slides.js index 646032a..1501a18 100644 --- a/data/www/js/slideshow/slides.js +++ b/data/www/js/slideshow/slides.js @@ -2,23 +2,19 @@ jQuery(document).ready(function ($) { const $tableActive = $('table.active-slides'); const $tableInactive = $('table.inactive-slides'); - const getCronDateTime = function(cronExpression) { - const [minutes, hours, day, month, _, year] = cronExpression.split(' '); - return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')} ${hours.padStart(2, '0')}:${minutes.padStart(2, '0')}`; - }; - const loadDateTimePicker = function($els) { + const d = new Date(); + $els.each(function() { var $el = $(this); - if (!$el.val()) { - $el.val(prettyTimestamp(Date.now()).slice(0, -4)); - } $el.flatpickr({ enableTime: true, time_24hr: true, allowInput: false, allowInvalidPreload: false, dateFormat: 'Y-m-d H:i', + defaultHour: d.getHours(), + defaultMinute: d.getMinutes(), onChange: function(selectedDates, dateStr, instance) { const d = selectedDates[0]; const $target = $el.parents('.widget:eq(0)').find('.target'); @@ -81,6 +77,7 @@ jQuery(document).ready(function ($) { const $scheduleStartGroup = $modal.find('.slide-schedule-group'); const $scheduleEndGroup = $modal.find('.slide-schedule-end-group'); const $durationGroup = $modal.find('.slide-duration-group'); + const $isNotificationGroup = $modal.find('.slide-notification-group'); const $triggerStart = $scheduleStartGroup.find('.trigger'); const $triggerEnd = $scheduleEndGroup.find('.trigger'); @@ -90,42 +87,88 @@ jQuery(document).ready(function ($) { const $datetimepickerStart = $scheduleStartGroup.find('.datetimepicker'); const $datetimepickerEnd = $scheduleEndGroup.find('.datetimepicker'); + const $isNotification = $isNotificationGroup.find('.trigger'); + + const isNotification = $isNotification.prop('checked'); + let isLoopStart = $triggerStart.val() === 'loop'; + let isCronStart = $triggerStart.val() === 'cron'; + + function updateScheduleChoices(isNotification, isLoopStart, isCronStart) { + let scheduleStartChoices = $.extend({}, schedule_start_choices); + let scheduleEndChoices = $.extend({}, schedule_end_choices); + + if (!isNotification || isLoopStart) { + delete scheduleStartChoices['cron']; + delete scheduleEndChoices['duration']; + } + + if (isNotification) { + delete scheduleStartChoices['loop']; + delete scheduleEndChoices['stayloop']; + + if (isCronStart) { + delete scheduleEndChoices['datetime']; + } + } + + return { scheduleStartChoices, scheduleEndChoices }; + } + + function applyChoices() { + const { scheduleStartChoices, scheduleEndChoices } = updateScheduleChoices(isNotification, isLoopStart, isCronStart); + recreateSelectOptions($triggerStart, scheduleStartChoices); + recreateSelectOptions($triggerEnd, scheduleEndChoices); + } + + applyChoices(); + + isLoopStart = $triggerStart.val() === 'loop'; + isCronStart = $triggerStart.val() === 'cron'; - const isCronStart = $triggerStart.val() === 'cron'; const isCronEnd = $triggerEnd.val() === 'cron'; const isDatetimeStart = $triggerStart.val() === 'datetime'; const isDatetimeEnd = $triggerEnd.val() === 'datetime'; - const isLoopStart = $triggerStart.val() === 'loop'; + const isStayloopEnd = $triggerEnd.val() === 'stayloop'; const isDurationEnd = $triggerEnd.val() === 'duration'; + const flushValueStart = isLoopStart; - const flushValueEnd = isLoopStart || isDurationEnd; - const flushDuration = !isLoopStart && !isDurationEnd; + const flushValueEnd = isLoopStart || isStayloopEnd || isDurationEnd; + const flushDuration = isNotification && isDatetimeEnd; - $targetCronFieldStart.toggleClass('hidden', !isCronStart); - $targetCronFieldEnd.toggleClass('hidden', !isCronEnd); - $datetimepickerStart.toggleClass('hidden', !isDatetimeStart); - $datetimepickerEnd.toggleClass('hidden', !isDatetimeEnd); + function toggleVisibility() { + $targetCronFieldStart.toggleClass('hidden', !isCronStart); + $targetCronFieldEnd.toggleClass('hidden', !isCronEnd); + $datetimepickerStart.toggleClass('hidden', !isDatetimeStart); + $datetimepickerEnd.toggleClass('hidden', !isDatetimeEnd); - $durationGroup.toggleClass('hidden', !isLoopStart && !isDurationEnd); - $scheduleEndGroup.toggleClass('hidden', isLoopStart); + $durationGroup.toggleClass('hidden', isNotification && isDatetimeEnd); + $scheduleEndGroup.toggleClass('hidden', isLoopStart); - $durationGroup.find('.widget input').prop('required', $durationGroup.is(':visible')); - - if (flushValueStart) { - $targetCronFieldStart.val(''); - $datetimepickerStart.val(''); + $durationGroup.find('.widget input').prop('required', $durationGroup.is(':visible')); } - if (flushValueEnd) { - $targetCronFieldEnd.val(''); - $datetimepickerEnd.val(''); + function flushValues() { + if (flushValueStart) { + $targetCronFieldStart.val(''); + $datetimepickerStart.val(''); + } + + if (flushValueEnd) { + $targetCronFieldEnd.val(''); + $datetimepickerEnd.val(''); + } + + if (flushDuration) { + $targetDuration.val('1'); + } } - if (flushDuration) { - $targetDuration.val('1'); - } + toggleVisibility(); + flushValues(); + applyChoices(); }; + const main = function () { $("table").tableDnD({ dragHandle: 'td a.slide-sort', @@ -156,7 +199,7 @@ jQuery(document).ready(function ($) { updateTable(); }); - $(document).on('change', '.modal-slide select.trigger', function () { + $(document).on('change', '.modal-slide select.trigger, .modal-slide input.trigger', function () { inputSchedulerUpdate(); }); @@ -179,6 +222,7 @@ jQuery(document).ready(function ($) { const hasCronEnd = slide.cron_schedule_end && slide.cron_schedule_end.length > 0; const hasDateTimeEnd = hasCronEnd && validateCronDateTime(slide.cron_schedule_end); + const isNotification = slide.is_notification; let location = slide.location; @@ -186,17 +230,19 @@ jQuery(document).ready(function ($) { location = 'https://www.youtube.com/watch?v=' + slide.location; } + console.log(slide) $('.modal-slide-edit input:visible:eq(0)').focus().select(); $('#slide-edit-name').val(slide.name); $('#slide-edit-type').val(slide.type); $('#slide-edit-location').val(location).prop('disabled', !slide.is_editable); $('#slide-edit-duration').val(slide.duration); + $('#slide-edit-is-notification').prop('checked', isNotification); $('#slide-edit-cron-schedule').val(slide.cron_schedule).toggleClass('hidden', !hasCron || hasDateTime); $('#slide-edit-cron-schedule-trigger').val(hasDateTime ? 'datetime' : (hasCron ? 'cron' : 'loop')); $('#slide-edit-cron-schedule-end').val(slide.cron_schedule_end).toggleClass('hidden', !hasCronEnd || hasDateTimeEnd); - $('#slide-edit-cron-schedule-end-trigger').val(hasDateTimeEnd ? 'datetime' : (hasCronEnd ? 'cron' : 'duration')); + $('#slide-edit-cron-schedule-end-trigger').val(hasDateTimeEnd ? 'datetime' : (hasCronEnd ? 'cron' : (isNotification ? 'duration' : 'stayloop'))); $('#slide-edit-cron-schedule-datetimepicker').toggleClass('hidden', !hasDateTime).val( hasDateTime ? getCronDateTime(slide.cron_schedule) : '' diff --git a/data/www/js/utils.js b/data/www/js/utils.js index 3a5df85..8f3b444 100644 --- a/data/www/js/utils.js +++ b/data/www/js/utils.js @@ -3,6 +3,11 @@ const prettyTimestamp = function(timestamp) { return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} ${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}:${String(d.getSeconds()).padStart(2, '0')} ` }; +const getCronDateTime = function(cronExpression) { + const [minutes, hours, day, month, _, year] = cronExpression.split(' '); + return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')} ${hours.padStart(2, '0')}:${minutes.padStart(2, '0')}`; +}; + const validateCronDateTime = function(cronExpression) { const pattern = /^(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+\*\s+(\d+)$/; return pattern.test(cronExpression); @@ -28,4 +33,26 @@ const modifyDate = function(date, seconds) { const clone = new Date(date.getTime()); clone.setSeconds(clone.getSeconds() + seconds); return clone; -}; \ No newline at end of file +}; + +const recreateSelectOptions = function($selectElement, options) { + if (!$selectElement.is('select')) { + throw new Error("Element is not a + + + +
diff --git a/views/slideshow/modal/edit.jinja.html b/views/slideshow/modal/edit.jinja.html index ae8d2cf..f1d2be4 100644 --- a/views/slideshow/modal/edit.jinja.html +++ b/views/slideshow/modal/edit.jinja.html @@ -43,6 +43,13 @@ {{ l.slideshow_slide_form_section_scheduling }} +
+ +
+ +
+
+
@@ -62,7 +69,6 @@