From ff8f25f7d4e1b0512741f6730dacc092ee4b5ed6 Mon Sep 17 00:00:00 2001 From: Marcin Haba Date: Sat, 13 Apr 2019 14:13:19 +0200 Subject: [PATCH] baculum: New create backup job wizard Changes: - New client file browser for selecting FileSet includes/excludes - Resign from using BConditional control - Start using renderer classes - Rename basic directive controls to have consistent names - Show 'save' button for editing existing resources - Show 'create' button for creating new resource - Fix run job Accurate and Priority values --- .../protected/Common/Class/Miscellaneous.php | 10 +- .../protected/Web/JavaScript/bacula-config.js | 10 +- gui/baculum/protected/Web/Lang/en/messages.mo | Bin 41602 -> 45884 bytes gui/baculum/protected/Web/Lang/en/messages.po | 191 +++++ gui/baculum/protected/Web/Lang/ja/messages.mo | Bin 42555 -> 46885 bytes gui/baculum/protected/Web/Lang/ja/messages.po | 192 +++++ gui/baculum/protected/Web/Lang/pl/messages.mo | Bin 44695 -> 49288 bytes gui/baculum/protected/Web/Lang/pl/messages.po | 192 +++++ gui/baculum/protected/Web/Lang/pt/messages.mo | Bin 44954 -> 49236 bytes gui/baculum/protected/Web/Lang/pt/messages.po | 191 +++++ gui/baculum/protected/Web/Layouts/Wizard.tpl | 4 + .../protected/Web/Pages/FileSetView.php | 9 +- .../protected/Web/Pages/JobHistoryList.page | 1 + gui/baculum/protected/Web/Pages/JobList.page | 1 + .../protected/Web/Pages/NewJobWizard.page | 685 ++++++++++++++---- .../protected/Web/Pages/NewJobWizard.php | 457 +++++++++++- .../protected/Web/Portlets/BConditional.php | 130 +--- .../Web/Portlets/BaculaConfigDirectives.php | 44 +- .../Web/Portlets/BaculaConfigDirectives.tpl | 63 +- ...ctiveBoolean.php => DirectiveCheckBox.php} | 6 +- ...ctiveBoolean.tpl => DirectiveCheckBox.tpl} | 0 .../Web/Portlets/DirectiveComboBox.php | 18 +- .../Web/Portlets/DirectiveComboBox.tpl | 2 +- .../Web/Portlets/DirectiveFileSet.php | 337 +++++---- .../Web/Portlets/DirectiveFileSet.tpl | 110 +-- .../Web/Portlets/DirectiveInteger.php | 4 +- .../Web/Portlets/DirectiveInteger.tpl | 4 +- .../Web/Portlets/DirectiveListBox.tpl | 2 +- .../Web/Portlets/DirectiveListTemplate.php | 12 +- .../Web/Portlets/DirectiveMessages.php | 11 +- .../Web/Portlets/DirectiveMessages.tpl | 6 +- .../Web/Portlets/DirectiveRenderer.php | 134 ++++ .../Web/Portlets/DirectiveRunscript.php | 186 ++--- .../Web/Portlets/DirectiveRunscript.tpl | 22 +- .../Web/Portlets/DirectiveSchedule.php | 14 +- .../Web/Portlets/DirectiveSchedule.tpl | 502 +++++++------ .../protected/Web/Portlets/DirectiveSize.php | 4 +- .../protected/Web/Portlets/DirectiveSize.tpl | 2 +- .../Web/Portlets/DirectiveTemplate.php | 36 +- ...DirectiveText.php => DirectiveTextBox.php} | 6 +- ...DirectiveText.tpl => DirectiveTextBox.tpl} | 2 +- .../Web/Portlets/DirectiveTimePeriod.php | 4 +- .../Web/Portlets/DirectiveTimePeriod.tpl | 2 +- .../protected/Web/Portlets/FileSetBrowser.php | 102 +++ .../protected/Web/Portlets/FileSetBrowser.tpl | 340 +++++++++ .../Web/Portlets/FileSetOptionRenderer.php | 51 ++ .../Web/Portlets/JobRunscriptRenderer.php | 51 ++ .../protected/Web/Portlets/MessageTypes.php | 8 +- .../protected/Web/Portlets/MessageTypes.tpl | 2 +- .../Web/Portlets/NewFileSetExcMenu.php | 37 + .../Web/Portlets/NewFileSetExcMenu.tpl | 14 + .../Web/Portlets/NewFileSetFileOptMenu.php | 37 + .../Web/Portlets/NewFileSetFileOptMenu.tpl | 29 + ...leSetMenu.php => NewFileSetIncExcMenu.php} | 5 +- .../Web/Portlets/NewFileSetIncExcMenu.tpl | 23 + .../protected/Web/Portlets/NewFileSetMenu.tpl | 30 - .../Web/Portlets/NewRunscriptMenu.tpl | 2 +- gui/baculum/protected/Web/Portlets/RunJob.php | 12 +- gui/baculum/protected/Web/endpoints.xml | 1 + gui/baculum/themes/Baculum-v2/css/baculum.css | 79 ++ .../themes/Baculum-v2/css/restore-wizard.css | 4 + gui/baculum/themes/Baculum-v2/link-icon.png | Bin 0 -> 1635 bytes 62 files changed, 3465 insertions(+), 968 deletions(-) rename gui/baculum/protected/Web/Portlets/{DirectiveBoolean.php => DirectiveCheckBox.php} (89%) rename gui/baculum/protected/Web/Portlets/{DirectiveBoolean.tpl => DirectiveCheckBox.tpl} (100%) create mode 100644 gui/baculum/protected/Web/Portlets/DirectiveRenderer.php rename gui/baculum/protected/Web/Portlets/{DirectiveText.php => DirectiveTextBox.php} (90%) rename gui/baculum/protected/Web/Portlets/{DirectiveText.tpl => DirectiveTextBox.tpl} (96%) create mode 100644 gui/baculum/protected/Web/Portlets/FileSetBrowser.php create mode 100644 gui/baculum/protected/Web/Portlets/FileSetBrowser.tpl create mode 100644 gui/baculum/protected/Web/Portlets/FileSetOptionRenderer.php create mode 100644 gui/baculum/protected/Web/Portlets/JobRunscriptRenderer.php create mode 100644 gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.php create mode 100644 gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.tpl create mode 100644 gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.php create mode 100644 gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.tpl rename gui/baculum/protected/Web/Portlets/{NewFileSetMenu.php => NewFileSetIncExcMenu.php} (88%) create mode 100644 gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.tpl delete mode 100644 gui/baculum/protected/Web/Portlets/NewFileSetMenu.tpl create mode 100644 gui/baculum/themes/Baculum-v2/link-icon.png diff --git a/gui/baculum/protected/Common/Class/Miscellaneous.php b/gui/baculum/protected/Common/Class/Miscellaneous.php index 38f2c0c6d..0c18b1bd4 100644 --- a/gui/baculum/protected/Common/Class/Miscellaneous.php +++ b/gui/baculum/protected/Common/Class/Miscellaneous.php @@ -204,7 +204,15 @@ class Miscellaneous extends TModule { } public function isValidBoolean($val) { - return (preg_match('/^(yes|no|0|1|true|false)$/', $val) === 1); + return (preg_match('/^(yes|no|1|0|true|false)$/i', $val) === 1); + } + + public function isValidBooleanTrue($val) { + return (preg_match('/^(yes|1|true)$/i', $val) === 1); + } + + public function isValidBooleanFalse($val) { + return (preg_match('/^(no|0|false)$/i', $val) === 1); } public function isValidId($id) { diff --git a/gui/baculum/protected/Web/JavaScript/bacula-config.js b/gui/baculum/protected/Web/JavaScript/bacula-config.js index 98ab78d4b..7ae5d6251 100644 --- a/gui/baculum/protected/Web/JavaScript/bacula-config.js +++ b/gui/baculum/protected/Web/JavaScript/bacula-config.js @@ -28,8 +28,14 @@ var BaculaConfigClass = jQuery.klass({ this.show_item(container, true); this.scroll_to_element(container); }, - scroll_to_element: function(selector) { - $('html,body').animate({scrollTop: $(selector).offset().top}, 'slow'); + scroll_to_element: function(selector, additional_offset) { + var offset = $(selector).offset().top; + if (additional_offset) { + offset += additional_offset; + } + $('html,body').animate({ + scrollTop: offset + }, 'slow'); }, get_child_container: function(sender) { var child_container = $('#' + sender).closest('table').next('div'); diff --git a/gui/baculum/protected/Web/Lang/en/messages.mo b/gui/baculum/protected/Web/Lang/en/messages.mo index 233e33fa36562a3593e9a1c91de3e7174ace12b6..837a5fbed09c635f069cd95b5eff8de6ad646de7 100644 GIT binary patch literal 45884 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�nsv&rr9GLJz0H-pS|bi`$K2sM5k4%{ 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 diff --git a/gui/baculum/protected/Web/Lang/en/messages.po b/gui/baculum/protected/Web/Lang/en/messages.po index 612aa9580..e2e7cd7af 100644 --- a/gui/baculum/protected/Web/Lang/en/messages.po +++ b/gui/baculum/protected/Web/Lang/en/messages.po @@ -1835,3 +1835,194 @@ msgstr "Error code:" msgid "Message:" msgstr "Message:" +msgid "Include" +msgstr "Include" + +msgid "Exclude" +msgstr "Exclude" + +msgid "Step 1 - select job type" +msgstr "Step 1 - select job type" + +msgid "New job wizard" +msgstr "New job wizard" + +msgid "This wizard enables you to create in easy way a new job." +msgstr "This wizard enables you to create in easy way a new job." + +msgid "To start please select job type that you wish to create." +msgstr "To start please select job type that you wish to create." + +msgid "Job Type" +msgstr "Job Type" + +msgid "Job Name" +msgstr "Job Name" + +msgid "JobDefs" +msgstr "JobDefs" + +msgid "Step 2 - what you want to backup" +msgstr "Step 2 - what you want to backup" + +msgid "Client and FileSet" +msgstr "Client and FileSet" + +msgid "Please select Client from which you want to backup data and please select FileSet with files/directories definition to backup." +msgstr "Please select Client from which you want to backup data and please select FileSet with files/directories definition to backup." + +msgid "If your FileSet for this backup does not exist yet, you can create it." +msgstr "If your FileSet for this backup does not exist yet, you can create it." + +msgid "FileSet" +msgstr "FileSet" + +msgid "Add new FileSet" +msgstr "Add new FileSet" + +msgid "New FileSet" +msgstr "New FileSet" + +msgid "Step 3 - where you want to backup" +msgstr "Step 3 - where you want to backup" + +msgid "Storage and Pool" +msgstr "Storage and Pool" + +msgid "Please select Storage where you want to backup data and please select Pool with volumes which Storage will use to store backup data." +msgstr "Please select Storage where you want to backup data and please select Pool with volumes which Storage will use to store backup data." + +msgid "Storage" +msgstr "Storage" + +msgid "Show Storage directives for Job" +msgstr "Show Storage directives for Job" + +msgid "Spool setting" +msgstr "Spool setting" + +msgid "Spool Data" +msgstr "Spool Data" + +msgid "Spool Attributes" +msgstr "Spool Attributes" + +msgid "Spool Size" +msgstr "Spool Size" + +msgid "Show Pool directives for Job" +msgstr "Show Pool directives for Job" + +msgid "Pool setting" +msgstr "Pool setting" + +msgid "Full Backup Pool" +msgstr "Full Backup Pool" + +msgid "Incremental Backup Pool" +msgstr "Incremental Backup Pool" + +msgid "Differential Backup Pool" +msgstr "Differential Backup Pool" + +msgid "Step 4 - how would you like to backup" +msgstr "Step 4 - how would you like to backup" + +msgid "Backup Job directives" +msgstr "Backup Job directives" + +msgid "Accurate" +msgstr "Accurate" + +msgid "Step 5 - when would you like to run backup" +msgstr "Step 5 - when would you like to run backup" + +msgid "Schedule" +msgstr "Schedule" + +msgid "Show Reschedule directives" +msgstr "Show Reschedule directives" + +msgid "Reschedule setting" +msgstr "Reschedule setting" + +msgid "Reschedule On Error" +msgstr "Reschedule On Error" + +msgid "Reschedule Incomplete Jobs" +msgstr "Reschedule Incomplete Jobs" + +msgid "Reschedule Interval" +msgstr "Reschedule Interval" + +msgid "Reschedule Times" +msgstr "Reschedule Times" + +msgid "What" +msgstr "What" + +msgid "Maximum Concurrent Jobs" +msgstr "Maximum Concurrent Jobs" + +msgid "Priority" +msgstr "Priority" + +msgid "ReRun Failed Levels" +msgstr "ReRun Failed Levels" + +msgid "General" +msgstr "General" + +msgid "How" +msgstr "How" + +msgid "When" +msgstr "When" + +msgid "Other directives" +msgstr "Other directives" + +msgid "Messages" +msgstr "Messages" + +msgid "Step 6 - summary" +msgstr "Step 6 - summary" + +msgid "Add new Pool" +msgstr "Add new Pool" + +msgid "New Pool" +msgstr "New Pool" + +msgid "Add new Schedule" +msgstr "Add new Schedule" + +msgid "New Schedule" +msgstr "New Schedule" + +msgid "Summary" +msgstr "Summary" + +msgid "inherited from JobDefs" +msgstr "inherited from JobDefs" + +msgid "Create job" +msgstr "Create job" + +msgid "Please select Client" +msgstr "Please select Client" + +msgid "Go to path" +msgstr "Go to path" + +msgid "Add new include path" +msgstr "Add new include path" + +msgid "Add new global exclude path" +msgstr "Add new global exclude path" + +msgid "Include files to FileSet" +msgstr "Include files to FileSet" + +msgid "Apply file selection" +msgstr "Apply file selection" diff --git a/gui/baculum/protected/Web/Lang/ja/messages.mo b/gui/baculum/protected/Web/Lang/ja/messages.mo index d6fb25d12a4d0ac242b748e897c29567aa72bf0f..0cc644f389550daf0d0999931c29131d02cb22a1 100644 GIT binary patch literal 46885 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 K#lQR`5&s7%2eGjL literal 42555 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 U8tKs&S!rAs-Cp;8+Pzu*ZwBA&7XSbN delta 13641 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 CBj}+3 diff --git a/gui/baculum/protected/Web/Lang/pl/messages.po b/gui/baculum/protected/Web/Lang/pl/messages.po index c7f3fb67c..eafdc55df 100644 --- a/gui/baculum/protected/Web/Lang/pl/messages.po +++ b/gui/baculum/protected/Web/Lang/pl/messages.po @@ -1841,3 +1841,195 @@ msgstr "Kod błędu:" msgid "Message:" msgstr "Wiadomość:" + +msgid "Include" +msgstr "Include" + +msgid "Exclude" +msgstr "Exclude" + +msgid "Step 1 - select job type" +msgstr "Krok 1 - wybierz typ zadania" + +msgid "New job wizard" +msgstr "Konfigurator nowego zadania" + +msgid "This wizard enables you to create in easy way a new job." +msgstr "Ten konfigurator umożliwia ci stworzenie nowego zadania w łatwy sposób." + +msgid "To start please select job type that you wish to create." +msgstr "Aby zacząć proszę wybrać typ zadania, które życzysz sobie stworzyć." + +msgid "Job Type" +msgstr "Typ Zadania" + +msgid "Job Name" +msgstr "Nazwa Zadania" + +msgid "JobDefs" +msgstr "JobDefs" + +msgid "Step 2 - what you want to backup" +msgstr "Krok 2 - co chcesz backupować" + +msgid "Client and FileSet" +msgstr "Klient i FileSet" + +msgid "Please select Client from which you want to backup data and please select FileSet with files/directories definition to backup." +msgstr "Proszę wybrać Klienta z którego chcesz backupować dane i proszę wybrać FileSet z definicją plików/katalogów do backupu" + +msgid "If your FileSet for this backup does not exist yet, you can create it." +msgstr "Jeśli twój FileSet dla backupu nie istnieje jeszcze, możesz go stworzyć." + +msgid "FileSet" +msgstr "FileSet" + +msgid "Add new FileSet" +msgstr "Dodaj nowy FileSet" + +msgid "New FileSet" +msgstr "Nowy FileSet" + +msgid "Step 3 - where you want to backup" +msgstr "Krok 3 - gdzie chcesz składować backup" + +msgid "Storage and Pool" +msgstr "Magazyn i Pula wolumenów" + +msgid "Please select Storage where you want to backup data and please select Pool with volumes which Storage will use to store backup data." +msgstr "Proszę wybrać Magazyn danych gdzie chcesz składować backup i proszę wybrać Pulę z wolumenami które Magazyn będzie używał do składowania danych backupu" + +msgid "Storage" +msgstr "Magazyn danych" + +msgid "Show Storage directives for Job" +msgstr "Pokaż opcje Magazynu danych dla zadania" + +msgid "Spool setting" +msgstr "Ustawienia Spool" + +msgid "Spool Data" +msgstr "Spool Data" + +msgid "Spool Attributes" +msgstr "Spool Attributes" + +msgid "Spool Size" +msgstr "Spool Size" + +msgid "Show Pool directives for Job" +msgstr "Pokaż opcje Puli wolumenów dla zadania" + +msgid "Pool setting" +msgstr "Ustawienia Puli wolumenów" + +msgid "Full Backup Pool" +msgstr "Full Backup Pool" + +msgid "Incremental Backup Pool" +msgstr "Incremental Backup Pool" + +msgid "Differential Backup Pool" +msgstr "Differential Backup Pool" + +msgid "Step 4 - how would you like to backup" +msgstr "Krok 4 - jak chciałbyś backupować" + +msgid "Backup Job directives" +msgstr "Opcje zadania backupowego" + +msgid "Accurate" +msgstr "Tryb dokładny" + +msgid "Step 5 - when would you like to run backup" +msgstr "Krok 5 - kiedy chciałbyć uruchamiać backup" + +msgid "Schedule" +msgstr "Harmonogram zadań" + +msgid "Show Reschedule directives" +msgstr "Pokaż opcje Reschedule" + +msgid "Reschedule setting" +msgstr "Ustawienia Reschedule" + +msgid "Reschedule On Error" +msgstr "Reschedule On Error" + +msgid "Reschedule Incomplete Jobs" +msgstr "Reschedule Incomplete Jobs" + +msgid "Reschedule Interval" +msgstr "Reschedule Interval" + +msgid "Reschedule Times" +msgstr "Reschedule Times" + +msgid "What" +msgstr "Co" + +msgid "Maximum Concurrent Jobs" +msgstr "Maximum Concurrent Jobs" + +msgid "Priority" +msgstr "Priorytet" + +msgid "ReRun Failed Levels" +msgstr "ReRun Failed Levels" + +msgid "General" +msgstr "Ogólne" + +msgid "How" +msgstr "Jak" + +msgid "When" +msgstr "Kiedy" + +msgid "Other directives" +msgstr "Inne dyrektywy" + +msgid "Messages" +msgstr "Messages" + +msgid "Step 6 - summary" +msgstr "Krok 6 - podsumowanie" + +msgid "Add new Pool" +msgstr "Dodaj nową Pulę wolumenów" + +msgid "New Pool" +msgstr "Nowa Pula wolumenów" + +msgid "Add new Schedule" +msgstr "Dodaj nowy harmonogram zadań" + +msgid "New Schedule" +msgstr "Nowy harmonogram zadań" + +msgid "Summary" +msgstr "Podsumowanie" + +msgid "inherited from JobDefs" +msgstr "odziedziczone z JobDefs" + +msgid "Create job" +msgstr "Stwórz zadanie" + +msgid "Please select Client" +msgstr "Proszę wybrać Klienta" + +msgid "Go to path" +msgstr "Idź do lokalizacji" + +msgid "Add new include path" +msgstr "Dodaj nową lokalizację listy dołączeń" + +msgid "Add new global exclude path" +msgstr "Dodaj nową globalną lokalizację do listy wykluczeń" + +msgid "Include files to FileSet" +msgstr "Dołącz pliki do FileSet" + +msgid "Apply file selection" +msgstr "Zastosuj wybrane pliki" diff --git a/gui/baculum/protected/Web/Lang/pt/messages.mo b/gui/baculum/protected/Web/Lang/pt/messages.mo index a7ec95d0390cb9891f83dfd155eb0ab9dabe3439..322093e982beaba8d3d0a27798cbfdf4a17be948 100644 GIT binary patch delta 17727 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 delta 13670 zc-m!J30PLu);{OM9I`}GOHGTMDl3N+kU?gVK>q1dU=4bl#u=@o9VwPgzs8nqMt3n z@qJ4$^q>_?HA>Ku@Cjzv3L0Bwh5k8KV5Er9j8M0NCY!9lNIRi6j3uEL#;elMZH0;Y z6Z?-6j+g}vJWohgQD)DAN>d1P2-ivZ9-%qm5NkylO*oZs6rm^KQ|x2bV4%<%43=Ay z{&`@HH3+m?W5NU0(8xzJ;F2{Mx^4}Lz7_n%8mc$3f$4?{j2O;Ro-Al<3suh(jI;&aWLwO$ zmhcglT-qBo8Te1Zu0JY)xkhS|YK#@d0=Np|S(ZU>VFNqMSF$XYa=KxjDae%jn5l$mqO*odY%>gQY zmvAQgiUSyZ&=J02>WB%)ID*~;!54b!dHp-WS?mQ}9l@!mBUVG85K3}{SLaCkHbc2q&`!T}l5e`7t4I zneZIp_k{DAfjJZ|3C-NV;9@tZez_Y6W=j1!H;gYM^dxL1jAJ^4 z5gu^vDTEdrvNaD#P~w5WQ0W1}EgqQYbq_Fd(gUhI?*SEF_J9+8>H)@vd%_eGJ<;!Z zPmG`L37>NE1YK{z2x-?6Jz>inPY|y3gqPNOLV}}&4!mwX!N?FV3>@tRi6?tO;u&6; zXto!|c}h9h3j)T-xMVLlZ=P2VBbu^R2<(ypFAISKQh(A5&Ue-e3|{eqq+L>fQ_9_f zKgxuE$oT&AP(M`gF+$ollqU#ndHn~^gOgOwLx8z34-xD?gpYFqF&`=(FF12PB$-2K z!x_+gXl%38zdj$%c2fFxOZ`2mAL5OA3&J71{@uJmAix_Pv%SIjM#AwNQf0tFZ%Fo@ zH&lPgTQuP2|QM*AT4J4wSF9}M&)q_j|3=mQ@K z@_}ZOe851V4<@ScfywH8VB0nyF#M*J&-fsobon3v{pf>$XYEV+=Yih7NF2g_F=4JR zI^_9c*;M&L!cM~fu!?=5v6cm3^n(R3)#U|{@a_U=^0x(u3xoV1z<57|a9ckJ66mL) zVTB(E6!>9%?vnCJ8E}K}X%4M^NX;htqkW-ZvS68Dt3Tq#JN}sHia$21?+8~BKD-d~ z=4lJzbTtdH{$G=ZQwyQ0&lk$N4v=*nfK@U*0Fv7ax(C2F`~qZs2S5{vf~y2qOTV=N zFriiwfK+I!5IPos(0fM8qXQ9WCIo^&nBbB?*mzkWOtU%=K9Cm(1~*B$E)Wy71%lo` z1K~4=fSPhj2wWt5hI70?ERzREa-9${_6jg+UnqW)OVj zMi5LfFj(?{V2qm(%uY%6pAn1>9>MU^h+s&N8Vr-dHcA8~ zh8*J~5RjHeK;;`Epz4+g*mi#eob|H^NHQ=I?Gptp1m{FTkN_#iMnXdwf*Z6*aJo4X zlI@6us`m*Vl=fqhP~F)`*z{5)82L=f0~WyqW{VIxClJo1G~Jr8flav>3CEL55LW^S zn|S@#(hDth#c?Sns9p-&)h*@ikt8OZ&d2ekQ0<5)sB}ye7<`T}oHa%`hjY6qIM?MU z*!;67(7PE0iN6=T7bW@s;Al)dJQ@>>ik7omG$P@oXgHyLw554YUt-`BhFFxJj0NM9rED1sx=vir>)$IDgo31FY%C;O6${SuW8rMOW1*q< zrT=;9|Ak<8EHv|*wD(^IQ;ZNCyG)#va18l|1);{A`^AB?pg43~8V7<2apJ9U(7=W` za9$$)^f*Mcx;Qx9&NxW^Y8;l=xj1aUw*~vhV>Ot^W8Cz3(myj`5f6ek@gU?J59bPs z7hA`}L@NZ#ux(P~0RQuS9tXJR7gPfJ9<*;*oO1tVRl zVD$G?Xhuy#qBAHBnjK51@q|;;pn8Wi5cU-eNdtkUY0yA?8W>EMazPrh;Vo&H@MxM` z)1@H}e4B<;Y+yQYYC2XyU^+ChB%Son66U1C2lRAs)-2@%g72q;a927Q=$3weNxNwV z%HuNRh$c8E1Cj?ydt?UsCuc}N%g|6!l7R{8GvG8YXTbK?GGz0}z%nw+1m}}8(LN^= zDv!vNi-}A`woIwdmi{G~VCbbx#E;hqyD2Wbp=II_*}4Xtez`_&IM=}TzpQ~NhGb#F z$Fjia)GXNEK1(jGv(V2!3wc3!7H-M%rQd5=pm!__rnpMz$UdiJLt>|Fs3;{H4I8py z`**Uj?%&Ub?Y_s;3jyrzWYz@~{g zm?$R)Ioeh!@6W;V{6O$d4l)_jTq4FM$c0xI=YoOyTnN%6<^6(31y2i}&t<12`(Kla zUvgn1Wi1Gptp(xnYjJ60wH7JUVZs=W{TeiMTEn=r8Z_~RhWPP~hGltIgN6s@q5rHr ztPTglvAq7n^DrPQ4-)4~huS=N>Ha*Z^l%;+Jtp<<=fRfe@?hIv^Wdze>u75w=Xzls zZqF92R}>$P6YHV+d+Q9ASywB%@ zA&UYKv@d{-eG6dHaKXd^(9IF7Er1grC?Ngwz;_Fz$TLT({cd#Df-9xsIHE(qQ#ga-c*REnU%2Z}W0{ez33dWRwq3MfLy@FEagQiM2> zQUuQPi?AH^B24gd5j63Z^gmUEo6{@OZYZYX7q5n5_)2Io1Y52ZW5V2GI8S~t2$V^O zdKu7J42`@cD1k}R zg}{aqIB7)*G_$<~6748K-hZP6+w?P~NJtV&u_xr0!sd;oh=fN<5lOF>%J;t?N)d1d zY{XH_eIq(1Y{ciY0x2KaC<6)IINg@Abs3hKUl|x!Cgrv=tcoLLxbM4E29ueVLsL(e zv%q}+Uk;TxltXg2a!BZ14ioqb#z?=+ayZXg>6c%Qgrh{tZF=lV?ut+!>|LlwC3c)S9)XigO{ zfola!u($&AtgXN;S`nefr`^??AzAZg4CvS_p>i`+cz!bof3q1TGTj0Rrf)&nZwnYp z+k${pPWU3n2dTeBIF6UyR?4v1DYs(N^W94N=TvCpR-Dz2ZN>4soA5c7L`Q-#R|jJm zI{IzZdoDec!#Zp_vJ&H_Rbo{{R$>=SBJ|)74V4h^i%OW{Yw6crDc}F@RbqKPTm`Qm zT?HFIBREBHW)%q8R3TzINqJrsoYlVytEH?8pI&ODpIJ4I-D9fdfq}s-g0A z)lhk9HP-R2YH<2$HJs^0H3)uG4Msny2IF5>!+C$IM&S9Y8fV6*x1rv58|VaYLwt#s zvbJWMe09;?H>9t>wnxwsx*!S>h7=F>p-=gp@98d@fpOQ`V#dIKid)qn}x8lbZM4UpuB z;MoQQk{briSyMu#*Z0F7(H z<#b{bOuefKrf%1oVC%OD*KwBHgp9_g8K&6O3|rSXqu;J(EUS)YNOY(fj9!#}Uo}he z*$k83ZN?t)N3-k=Eg0|ABH#afTd@2Vw;*8Tv>^00wLrz^T9EU7*@E>wtQ8@6W-ACT zYDETBAmxLtnBcQkX!K4i=-h9W3(7WZ=M&mw|95D^GFjLL)vRoj+weB5(}Ffg)Y67! z^p7?WI@KnhT!r9QGX8!WZ2aI}Xvl0Y;>ojn5l`mrMf>`_Oo!}WvKO4z?-kYVg=!A% zm9JNOp~^17e@XitCP=<Zj7PSEvAA}aD79TKHrnO>ue2S9#_D!S zkK19h15&=yj?nqD;IIx5nAU-D&K)4^)*+#}Lqc;0oH3JjPj-Uysh#jv8$q8=s64t;Hjz%4WV7HN8UK1GG!geEGp(VqAt3jypwrqfto~FVk6@Q@iIzVwX0C%WZ!bu!r*D|p{fu++Y%dLI?ZXA0l%@aH(9l`S-e5=K!uUFgMV z>_GIqM~^=>T;$WRDwohyzN%oY9{rm-vlQI#@{cc=1LZwZCTf%N2rA#F=L$UwrLBbU zB0W>s{v+w7j@3xGfu8>K{KbD7M`$HW>H)&fgy0^kpC|Rp`Lhj`mkVK6754)C8!3H^ zRF}&MtAg8;&3%N>*#29o!)oSE2AmUOM+sv&xsdW)zGjp6+k_6hTxm=yuN=;12v76X z9O3KIPo?&W^i=gRVGz9^{BK#--#aP-4*wR@``7gBVpDJs=`(mLy+23(?S z4B`Zn>K~=|M78IOZO`vN^j^bpgPvPVgI5(huZjMq)@8N16`(NuLv4x>0 zvF-US5a~Xk&Z*o_7!8p2X??~SIl6Hu?`@N@d=8u-bteS}5}nU`=l7wG^XX}1)ySYW z>adbiWEF{L-=8}tlqyo|$Ep7poJa~|+j;kt_aFJ##*vVo=3eLKQ!uyFGu|Nb@1w#` zy_QhWZT>;?dI12a6%9d_7l?qN&p7Md>q^%8TXw9=-pA%|K-v1I^!) znNVdh@5eH58)v@!ZHHqt)tyxFHQSV)E}5u;muR0Aa!^4kKT*Z)C*Kcna$`&HoqRc= z$Y&nT0jTavm9G^^{)K!}p~4b+R`53aH_6ZRu5+1;^Zo<8;ZQkVMK-*I#(W_Co|1mq zQVth-b5x{jFG%}M!kHZZ`GD|*bgGlaL>b&DWhW^&^^urwzxkSW0mljsES#(eof~`~ zr2cr(7Dx7FgnTqdqgZl)=$yEOn)z?d%AC>QL9>*V>sJ>Q+1q$*R?;&Ae zrUB_TU)2qu_eh~Jfck#KCgCiK=I|lRKHKb>$+HixW>y zHhXQX;wb&Ils&1>GSN;kp&OM?@aadznSjp+!3G>!D^(mwKJQ(!gi8&$ZN0(H&hv*# z| zZ=6uDX9~e~&TOdeV`f4oOp!s)vX4ler_}lMnSd{%5N9k8OjeCUf-jrs_rh=J-4T;@vw%l+%gFci;fsDXrY>$a=;NZ=jN_wo zRQ+O1us$a?S^qe8gPy%?mVR|v!e~qL7tGz_SH`EtDgJ3O$>vu7E$h4DChOPZ;*Im; z^G%EouCP~)>sDUqXN*jBQH=-EO#2znuJ)t4tS40c`GT>=bJ-TE?w>otI6XJbU_7AZ z8H_IL-!U_`A>5bL>j2HG^Q1xr=KDtZC4&BgsK)>E;uRFf7ZkX?q)YK$%k$FjC zeAbdx`p|u22B(tnNvoDDi%FfL`|is(Uf=h*iSegb-%yQTzi!&!s2<*;8rzP%to|Q_ CV(R|@ diff --git a/gui/baculum/protected/Web/Lang/pt/messages.po b/gui/baculum/protected/Web/Lang/pt/messages.po index 695c9fed3..b61149f08 100644 --- a/gui/baculum/protected/Web/Lang/pt/messages.po +++ b/gui/baculum/protected/Web/Lang/pt/messages.po @@ -1850,3 +1850,194 @@ msgstr "Error code:" msgid "Message:" msgstr "Message:" +msgid "Include" +msgstr "Include" + +msgid "Exclude" +msgstr "Exclude" + +msgid "Step 1 - select job type" +msgstr "Step 1 - select job type" + +msgid "New job wizard" +msgstr "New job wizard" + +msgid "This wizard enables you to create in easy way a new job." +msgstr "This wizard enables you to create in easy way a new job." + +msgid "To start please select job type that you wish to create." +msgstr "To start please select job type that you wish to create." + +msgid "Job Type" +msgstr "Job Type" + +msgid "Job Name" +msgstr "Job Name" + +msgid "JobDefs" +msgstr "JobDefs" + +msgid "Step 2 - what you want to backup" +msgstr "Step 2 - what you want to backup" + +msgid "Client and FileSet" +msgstr "Client and FileSet" + +msgid "Please select Client from which you want to backup data and please select FileSet with files/directories definition to backup." +msgstr "Please select Client from which you want to backup data and please select FileSet with files/directories definition to backup." + +msgid "If your FileSet for this backup does not exist yet, you can create it." +msgstr "If your FileSet for this backup does not exist yet, you can create it." + +msgid "FileSet" +msgstr "FileSet" + +msgid "Add new FileSet" +msgstr "Add new FileSet" + +msgid "New FileSet" +msgstr "New FileSet" + +msgid "Step 3 - where you want to backup" +msgstr "Step 3 - where you want to backup" + +msgid "Storage and Pool" +msgstr "Storage and Pool" + +msgid "Please select Storage where you want to backup data and please select Pool with volumes which Storage will use to store backup data." +msgstr "Please select Storage where you want to backup data and please select Pool with volumes which Storage will use to store backup data." + +msgid "Storage" +msgstr "Storage" + +msgid "Show Storage directives for Job" +msgstr "Show Storage directives for Job" + +msgid "Spool setting" +msgstr "Spool setting" + +msgid "Spool Data" +msgstr "Spool Data" + +msgid "Spool Attributes" +msgstr "Spool Attributes" + +msgid "Spool Size" +msgstr "Spool Size" + +msgid "Show Pool directives for Job" +msgstr "Show Pool directives for Job" + +msgid "Pool setting" +msgstr "Pool setting" + +msgid "Full Backup Pool" +msgstr "Full Backup Pool" + +msgid "Incremental Backup Pool" +msgstr "Incremental Backup Pool" + +msgid "Differential Backup Pool" +msgstr "Differential Backup Pool" + +msgid "Step 4 - how would you like to backup" +msgstr "Step 4 - how would you like to backup" + +msgid "Backup Job directives" +msgstr "Backup Job directives" + +msgid "Accurate" +msgstr "Accurate" + +msgid "Step 5 - when would you like to run backup" +msgstr "Step 5 - when would you like to run backup" + +msgid "Schedule" +msgstr "Schedule" + +msgid "Show Reschedule directives" +msgstr "Show Reschedule directives" + +msgid "Reschedule setting" +msgstr "Reschedule setting" + +msgid "Reschedule On Error" +msgstr "Reschedule On Error" + +msgid "Reschedule Incomplete Jobs" +msgstr "Reschedule Incomplete Jobs" + +msgid "Reschedule Interval" +msgstr "Reschedule Interval" + +msgid "Reschedule Times" +msgstr "Reschedule Times" + +msgid "What" +msgstr "What" + +msgid "Maximum Concurrent Jobs" +msgstr "Maximum Concurrent Jobs" + +msgid "Priority" +msgstr "Priority" + +msgid "ReRun Failed Levels" +msgstr "ReRun Failed Levels" + +msgid "General" +msgstr "General" + +msgid "How" +msgstr "How" + +msgid "When" +msgstr "When" + +msgid "Other directives" +msgstr "Other directives" + +msgid "Messages" +msgstr "Messages" + +msgid "Step 6 - summary" +msgstr "Step 6 - summary" + +msgid "Add new Pool" +msgstr "Add new Pool" + +msgid "New Pool" +msgstr "New Pool" + +msgid "Add new Schedule" +msgstr "Add new Schedule" + +msgid "New Schedule" +msgstr "New Schedule" + +msgid "Summary" +msgstr "Summary" + +msgid "inherited from JobDefs" +msgstr "inherited from JobDefs" + +msgid "Create job" +msgstr "Create job" + +msgid "Please select Client" +msgstr "Please select Client" + +msgid "Go to path" +msgstr "Go to path" + +msgid "Add new include path" +msgstr "Add new include path" + +msgid "Add new global exclude path" +msgstr "Add new global exclude path" + +msgid "Include files to FileSet" +msgstr "Include files to FileSet" + +msgid "Apply file selection" +msgstr "Apply file selection" diff --git a/gui/baculum/protected/Web/Layouts/Wizard.tpl b/gui/baculum/protected/Web/Layouts/Wizard.tpl index 7342b8d15..bf043972d 100644 --- a/gui/baculum/protected/Web/Layouts/Wizard.tpl +++ b/gui/baculum/protected/Web/Layouts/Wizard.tpl @@ -15,8 +15,12 @@ /> /> /> + /> + diff --git a/gui/baculum/protected/Web/Pages/FileSetView.php b/gui/baculum/protected/Web/Pages/FileSetView.php index 4056dc162..275609118 100644 --- a/gui/baculum/protected/Web/Pages/FileSetView.php +++ b/gui/baculum/protected/Web/Pages/FileSetView.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2018 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -38,6 +38,13 @@ class FileSetView extends BaculumWebPage { if ($this->Request->contains('fileset')) { $this->setFileSetName($this->Request['fileset']); } + } + + public function onLoad($param) { + parent::onLoad($param); + if ($this->getPage()->IsCallBack || $this->getPage()->IsPostBack) { + return; + } if (!empty($_SESSION['dir'])) { $this->FileSetConfig->setComponentName($_SESSION['dir']); $this->FileSetConfig->setResourceName($this->getFileSetName()); diff --git a/gui/baculum/protected/Web/Pages/JobHistoryList.page b/gui/baculum/protected/Web/Pages/JobHistoryList.page index 36a1e1dbb..ea18d5763 100644 --- a/gui/baculum/protected/Web/Pages/JobHistoryList.page +++ b/gui/baculum/protected/Web/Pages/JobHistoryList.page @@ -8,6 +8,7 @@

+
+ +<%@ MasterClass="Application.Web.Layouts.Wizard" Theme="Baculum-v2"%> -
-
-
+
+
+
+
+
+

+
-
-
+
+
+
+
+

+
-
-
+
+
+
+
+

+
-
-
+
+
+
+
+
+
+

+
-
-
+
+
+
+
+

+
-
-
+
+
+
+
+

+
-
<%=$this->Parent->ActiveStep->Title%>
+

<%=$this->Parent->ActiveStep->Title%>

-
-
+
+ +  <%[ Cancel ]%> + + + <%[ Next ]%>  + +
-
-
- - +
+ +  <%[ Cancel ]%> + + +  <%[ Previous ]%> + + + <%[ Next ]%>  +
-
-
- - +
+ +  <%[ Previous ]%> + + + <%[ Create job ]%>   + +
-

<%[ New job wizard ]%>

-

<%[ This wizard enables you to create in easy way new job. ]%>

-

<%[ To start, please select job type that you wish to create. ]%>

-
-
-
- - - - - - - - -
+
+

<%[ New job wizard ]%>

+

<%[ This wizard enables you to create in easy way a new job. ]%>

+ +
+
+ +
+
+ +
+
+
-
-
-
- - +
+

<%[ Client and FileSet ]%>

+

<%[ Please select Client from which you want to backup data and please select FileSet with files/directories definition to backup. ]%>

+

<%[ If your FileSet for this backup does not exist yet, you can create it. ]%>

+
+
+ +
+ + + + + + +
+

<%[ Storage and Pool ]%>

+

<%[ Please select Storage where you want to backup data and please select Pool with volumes which Storage will use to store backup data. ]%>

+
+ + + + + + +
- + +
+

<%[ Backup Job directives ]%>

+
+
+ +
+
+ +
+
+ +
+
+ +
+
+

<%[ Other directives ]%>

+
+
+ +
+
+ +
+

<%[ Schedule ]%>

+
+ + + + + +
+
- <%[ Source parameters ]%> -
-
<%[ Backup data from client: ]%>
-
<%=$this->BackupClientName->SelectedValue%>
+ <%[ General ]%> +
+
<%[ Job Type ]%>
+
<%=$this->Type->getDirectiveValue()%>
-
-
<%[ Backup selection method: ]%>
-
- - -
+
+
<%[ Job Name ]%>
+
<%=$this->Name->getDirectiveValue()%>
-
-
<%[ Backup for restore: ]%>
-
- -
+
+
<%[ JobDefs ]%>
+
<%=$this->JobDefs->getDirectiveValue()%>
- -
-
<%[ FileSet for restore: ]%>
-
<%=$this->GroupBackupFileSet->SelectedValue%>
-
-
- <%[ Files for restore ]%> -
-
<%[ Selected directories count: ]%>
-
<%=isset($this->getRestoreElements(true)->dirid) ? count($this->getRestoreElements(true)->dirid) : '0'%>
+ <%[ What ]%> +
+
<%[ Client ]%>
+
+ <%=$this->Client->getDirectiveValue()%> + <%=$this->isInJobDefs('Client', $this->Client->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
-
-
<%[ Selected files count: ]%>
-
<%=isset($this->getRestoreElements(true)->fileid) ? count($this->getRestoreElements(true)->fileid) : '0'%>
+
+
<%[ FileSet ]%>
+
+ <%=$this->Fileset->getDirectiveValue()%> + <%=$this->isInJobDefs('Fileset', $this->Fileset->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
- <%[ Destination parameters ]%> -
-
<%[ Restore to client: ]%>
-
<%=$this->RestoreClient->SelectedValue%>
+ <%[ Where ]%> +
+
<%[ Storage ]%>
+
+ <%=$this->Storage->getDirectiveValue()%> + <%=$this->isInJobDefs('Storage', $this->Storage->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Spool Data ]%>
+
+ <%=$this->SpoolData->getDirectiveValue() ? Prado::localize('Yes') : Prado::localize('No')%> + <%=$this->isInJobDefs('SpoolData', $this->SpoolData->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
-
-
<%[ Restore to path: ]%>
-
<%=$this->RestorePath->Text%>
+
+
<%[ Spool Attributes ]%>
+
+ <%=$this->SpoolAttributes->getDirectiveValue() ? Prado::localize('Yes') : Prado::localize('No')%> + <%=$this->isInJobDefs('SpoolAttributes', $this->SpoolAttributes->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Spool Size ]%>
+
+ <%=$this->SpoolSize->getDirectiveValue() ?: '0'%> + <%=$this->isInJobDefs('SpoolSize', $this->SpoolSize->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Pool ]%>
+
+ <%=$this->Pool->getDirectiveValue()%> + <%=$this->isInJobDefs('Pool', $this->Pool->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Full Backup Pool ]%>
+
+ <%=$this->FullBackupPool->getDirectiveValue() ?: '-'%> + <%=$this->isInJobDefs('FullBackupPool', $this->FullBackupPool->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Incremental Backup Pool ]%>
+
+ <%=$this->IncrementalBackupPool->getDirectiveValue() ?: '-'%> + <%=$this->isInJobDefs('IncrementalBackupPool', $this->IncrementalBackupPool->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Differential Backup Pool ]%>
+
+ <%=$this->DifferentialBackupPool->getDirectiveValue() ?: '-'%> + <%=$this->isInJobDefs('DifferentialBackupPool', $this->DifferentialBackupPool->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
- <%[ Restore job options ]%> -
-
<%[ Restore job: ]%>
-
<%=$this->RestoreJob->Text%>
+ <%[ How ]%> +
+
<%[ Accurate ]%>
+
+ <%=$this->Accurate->getDirectiveValue() ? Prado::localize('Yes') : Prado::localize('No') %> + <%=$this->isInJobDefs('Accurate', $this->Accurate->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
-
-
<%[ Replace files: ]%>
-
- - - - +
+
<%[ Maximum Concurrent Jobs ]%>
+
+ <%=$this->MaximumConcurrentJobs->getDirectiveValue() ?: $this->MaximumConcurrentJobs->getDefaultValue()%> + <%=$this->isInJobDefs('MaximumConcurrentJobs', $this->MaximumConcurrentJobs->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%>
-
-
<%[ Restore job priority: ]%>
-
<%=$this->RestoreJobPriority->Text%>
+
+
<%[ Priority ]%>
+
+ <%=$this->Priority->getDirectiveValue() ?: $this->Priority->getDefaultValue()%> + <%=$this->isInJobDefs('Priority', $this->Priority->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
-
-
<%[ File relocation option: ]%>
-
- - - +
+
<%[ ReRun Failed Levels ]%>
+
+ <%=$this->ReRunFailedLevels->getDirectiveValue() ? Prado::localize('Yes') : Prado::localize('No') %> + <%=$this->isInJobDefs('ReRunFailedLevels', $this->ReRunFailedLevels->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%>
-
-
-
<%[ Strip prefix: ]%>
-
<%=$this->RestoreStripPrefix->Text%>
+
+
+ <%[ When ]%> +
+
<%[ Schedule ]%>
+
+ <%=$this->Schedule->getDirectiveValue() ?: '-' %> + <%=$this->isInJobDefs('Schedule', $this->Schedule->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%>
-
-
<%[ Add prefix: ]%>
-
<%=$this->RestoreAddPrefix->Text%>
+
+
+
<%[ Reschedule On Error ]%>
+
+ <%=$this->RescheduleOnError->getDirectiveValue() ? Prado::localize('Yes') : Prado::localize('No') %> + <%=$this->isInJobDefs('RescheduleOnError', $this->RescheduleOnError->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%>
-
-
<%[ Add suffix: ]%>
-
<%=$this->RestoreAddSuffix->Text%>
+
+
+
<%[ Reschedule Incomplete Jobs ]%>
+
+ <%=$this->RescheduleIncompleteJobs->getDirectiveValue() ? Prado::localize('Yes') : Prado::localize('No') %> + <%=$this->isInJobDefs('RescheduleIncompleteJobs', $this->RescheduleIncompleteJobs->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
<%[ Reschedule Interval ]%>
+
+ <%=$this->RescheduleInterval->getDirectiveValue()%> + <%=$this->isInJobDefs('RescheduleInterval', $this->RescheduleInterval->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%>
-
-
-
<%[ RegexWhere: ]%>
-
<%=$this->RestoreRegexWhere->Text%>
+
+
<%[ Reschedule Times ]%>
+
+ <%=$this->RescheduleTimes->getDirectiveValue() ?: '-'%> + <%=$this->isInJobDefs('RescheduleTimes', $this->RescheduleTimes->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%> +
+
+
+
+ <%[ Other directives ]%> +
+
<%[ Messages ]%>
+
+ <%=$this->Messages->getDirectiveValue() ?: '-'%> + <%=$this->isInJobDefs('Messages', $this->Messages->getDirectiveValue()) ? ' (' . Prado::localize('inherited from JobDefs') . ')': ''%>
+
+ diff --git a/gui/baculum/protected/Web/Pages/NewJobWizard.php b/gui/baculum/protected/Web/Pages/NewJobWizard.php index 86655a201..ade0e2046 100644 --- a/gui/baculum/protected/Web/Pages/NewJobWizard.php +++ b/gui/baculum/protected/Web/Pages/NewJobWizard.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2018 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -21,46 +21,475 @@ */ Prado::using('Application.Web.Class.BaculumWebPage'); +Prado::using('System.Web.UI.ActiveControls.TActiveLabel'); Prado::using('System.Web.UI.WebControls.TWizard'); class NewJobWizard extends BaculumWebPage { + const PREV_STEP = 'PrevStep'; + const JOBDEFS = 'JobDefs'; + + public function onLoad($param) { + parent::onLoad($param); + $this->JobDefs->saveDirective(); + $this->Client->saveDirective(); + $this->Fileset->saveDirective(); + $this->Storage->saveDirective(); + $this->Pool->saveDirective(); + $this->FullBackupPool->saveDirective(); + $this->IncrementalBackupPool->saveDirective(); + $this->DifferentialBackupPool->saveDirective(); + $this->Messages->saveDirective(); + $this->Schedule->saveDirective(); + } + + public function onLoadComplete($param) { + parent::onLoadComplete($param); + $step_index = $this->NewJobWizard->getActiveStepIndex(); + $prev_step = $this->getPrevStep(); + $this->setPrevStep($step_index); + if ($prev_step > $step_index) { + return; + } + switch ($step_index) { + case 0: { + $this->loadJobTypes(); + $this->loadJobDefs(); + break; + } + case 1: { + $this->setupJobDefs(); + $this->loadClients(); + $this->loadFilesets(); + $this->loadNewFilesetForm(); + break; + } + case 2: { + $this->loadStorages(); + $this->loadNewPoolForm(); + $this->loadPools(); + break; + } + case 3: { + $this->loadBackupJobDirectives(); + $this->loadMessages(); + break; + } + case 4: { + $this->loadRescheduleDirectives(); + $this->loadNewScheduleForm(); + $this->loadSchedules(); + break; + } + } + } + + /** + * Wizard previous button callback actions. + * + * @param TWizard $sender sender object + * @param TWizardNavigationEventParameter $param sender parameters + * @return none + */ + public function wizardPrev($sender, $param) { + } + + /** + * Wizard next button callback actions. + * + * @param TWizard $sender sender object + * @param TWizardNavigationEventParameter $param sender parameters + * @return none + */ + public function wizardNext($sender, $param) { + } + + /** + * Load Job Types (step 1). + * + * @return none + */ + public function loadJobTypes() { + //$jobtype_list = array('Backup', 'Restore', 'Copy', 'Verify', 'Migrate', 'Admin'); + $jobtype_list = array('Backup'); + asort($jobtype_list); + $this->Type->setData($jobtype_list); + $this->Type->setDirectiveValue($jobtype_list[0]); + $this->Type->onLoad(null); + } + + /** + * Load JobDefs (step 1). + * + * @return none + */ + public function loadJobDefs() { + $jobdefs_list = array(); + $jobdefs = $this->getModule('api')->get(array('config', 'dir', 'jobdefs'))->output; + for ($i = 0; $i < count($jobdefs); $i++) { + $jobdefs_list[] = $jobdefs[$i]->JobDefs->Name; + } + asort($jobdefs_list); + $this->JobDefs->setData($jobdefs_list); + $this->JobDefs->onLoad(null); + } + + /** + * Setup and remember selected JobDefs values to use in next wizard steps. + * + * @return none + */ + public function setupJobDefs() { + $directive_value = $this->JobDefs->getDirectiveValue(); + if (is_null($directive_value)) { + return; + } + $jobdefs = rawurlencode($directive_value); + $result = $this->getModule('api')->get(array( + 'config', 'dir', 'jobdefs', $jobdefs + )); + if ($result->error === 0) { + $value = (array)$result->output; + $this->setJobDefs($value); + } + } + + public function isInJobDefs($directive_name, $directive_value) { + $jobdefs = $this->getJobDefs(); + $ret = false; + if ($directive_name === 'Storage') { + $ret = (key_exists($directive_name, $jobdefs) && $jobdefs[$directive_name][0] === $directive_value); + } else { + $ret = (key_exists($directive_name, $jobdefs) && $jobdefs[$directive_name] === $directive_value); + } + return $ret; + } + /** * Load client list (step 2). * - * @param TActiveDropDownList $sender sender object - * @param TCommandParameter $param parameters object * @return none */ - public function loadClients($sender, $param) { + public function loadClients() { $client_list = array(); $clients = $this->getModule('api')->get(array('clients'))->output; for ($i = 0; $i < count($clients); $i++) { $client_list[$clients[$i]->name] = $clients[$i]->name; } asort($client_list); - $this->Client->dataSource = $client_list; - $this->Client->dataBind(); + $this->Client->setData($client_list); + $jobdefs = $this->getJobDefs(); + if (key_exists('Client', $jobdefs) && is_null($this->Client->getDirectiveValue())) { + $this->Client->setDirectiveValue($jobdefs['Client']); + } + $this->Client->onLoad(null); } /** - * Wizard next button callback actions. + * Load fileset list (step 2). * - * @param TWizard $sender sender object - * @param TWizardNavigationEventParameter $param sender parameters * @return none */ - public function wizardNext($sender, $param) { + public function loadFilesets() { + $fileset_list = array(); + $filesets = $this->getModule('api')->get(array('config', 'dir', 'fileset'))->output; + for ($i = 0; $i < count($filesets); $i++) { + $fileset_list[] = $filesets[$i]->Fileset->Name; + } + asort($fileset_list); + $this->Fileset->setData($fileset_list); + $jobdefs = $this->getJobDefs(); + if (key_exists('Fileset', $jobdefs) && is_null($this->Fileset->getDirectiveValue())) { + $this->Fileset->setDirectiveValue($jobdefs['Fileset']); + } + $this->Fileset->onLoad(null); } /** - * Wizard prev button callback actions. + * Load new fileset form. * - * @param TWizard $sender sender object - * @param TWizardNavigationEventParameter $param sender parameters * @return none */ - public function wizardPrev($sender, $param) { + public function loadNewFilesetForm() { + if ($this->IsCallBack) { + return; + } + if (!empty($_SESSION['dir'])) { + $this->FilesetConfig->setComponentName($_SESSION['dir']); + $this->FilesetConfig->setLoadValues(false); + $this->FilesetConfig->raiseEvent('OnDirectiveListLoad', $this, null); + } + } + + /** + * Load new pool form. + * + * @return none + */ + public function loadNewPoolForm() { + if ($this->IsCallBack) { + return; + } + if (!empty($_SESSION['dir'])) { + $this->PoolConfig->setComponentName($_SESSION['dir']); + $this->PoolConfig->setLoadValues(false); + $this->PoolConfig->raiseEvent('OnDirectiveListLoad', $this, null); + } + } + + /** + * Load new schedule form. + * + * @return none + */ + public function loadNewScheduleForm() { + if ($this->IsCallBack) { + return; + } + if (!empty($_SESSION['dir'])) { + $this->ScheduleConfig->setComponentName($_SESSION['dir']); + $this->ScheduleConfig->setLoadValues(false); + $this->ScheduleConfig->raiseEvent('OnDirectiveListLoad', $this, null); + } + } + + /** + * Load storage list (step 2). + * + * @return none + */ + public function loadStorages() { + $storage_list = array(); + $storages = $this->getModule('api')->get(array('config', 'dir', 'storage'))->output; + for ($i = 0; $i < count($storages); $i++) { + $storage_list[] = $storages[$i]->Storage->Name; + } + asort($storage_list); + $this->Storage->setData($storage_list); + $jobdefs = $this->getJobDefs(); + if (key_exists('Storage', $jobdefs) && is_array($jobdefs['Storage']) && count($jobdefs['Storage']) == 1 && is_null($this->Storage->getDirectiveValue())) { + $this->Storage->setDirectiveValue($jobdefs['Storage'][0]); + } + $this->Storage->onLoad(null); + if (key_exists('SpoolData', $jobdefs) && is_null($this->SpoolData->getDirectiveValue())) { + $this->SpoolData->setDirectiveValue($jobdefs['SpoolData']); + $this->SpoolData->createDirective(); + } + if (key_exists('SpoolAttributes', $jobdefs) && is_null($this->SpoolAttributes->getDirectiveValue())) { + $this->SpoolAttributes->setDirectiveValue($jobdefs['SpoolAttributes']); + $this->SpoolAttributes->createDirective(); + } + if (key_exists('SpoolSize', $jobdefs) && is_null($this->SpoolSize->getDirectiveValue())) { + $this->SpoolSize->setDirectiveValue($jobdefs['SpoolSize']); + $this->SpoolSize->createDirective(); + } + } + + /** + * Load pool list (step 2). + * + * @return none + */ + public function loadPools() { + $pool_list = array(); + $pools = $this->getModule('api')->get(array('config', 'dir', 'pool'))->output; + for ($i = 0; $i < count($pools); $i++) { + $pool_list[] = $pools[$i]->Pool->Name; + } + asort($pool_list); + $this->Pool->setData($pool_list); + $jobdefs = $this->getJobDefs(); + $this->FullBackupPool->setData($pool_list); + if (key_exists('FullBackupPool', $jobdefs) && is_null($this->FullBackupPool->getDirectiveValue())) { + $this->FullBackupPool->setDirectiveValue($jobdefs['FullBackupPool']); + } + $this->FullBackupPool->onLoad(null); + $this->IncrementalBackupPool->setData($pool_list); + if (key_exists('IncrementalBackupPool', $jobdefs) && is_null($this->IncrementalBackupPool->getDirectiveValue())) { + $this->IncrementalBackupPool->setDirectiveValue($jobdefs['IncrementalBackupPool']); + } + $this->IncrementalBackupPool->onLoad(null); + $this->DifferentialBackupPool->setData($pool_list); + if (key_exists('DifferentialBackupPool', $jobdefs) && is_null($this->DifferentialBackupPool->getDirectiveValue())) { + $this->DifferentialBackupPool->setDirectiveValue($jobdefs['DifferentialBackupPool']); + } + $this->DifferentialBackupPool->onLoad(null); + if (key_exists('Pool', $jobdefs) && is_null($this->Pool->getDirectiveValue())) { + $this->Pool->setDirectiveValue($jobdefs['Pool']); + } + $this->Pool->onLoad(null); + } + + public function loadBackupJobDirectives() { + $jobdefs = $this->getJobDefs(); + if (key_exists('Accurate', $jobdefs) && is_null($this->Accurate->getDirectiveValue())) { + $this->Accurate->setDirectiveValue($jobdefs['Accurate']); + $this->Accurate->createDirective(); + } + if (key_exists('MaximumConcurrentJobs', $jobdefs) && is_null($this->MaximumConcurrentJobs->getDirectiveValue())) { + $this->MaximumConcurrentJobs->setDirectiveValue($jobdefs['MaximumConcurrentJobs']); + $this->MaximumConcurrentJobs->createDirective(); + } + if (key_exists('Priority', $jobdefs) && is_null($this->Priority->getDirectiveValue())) { + $this->Priority->setDirectiveValue($jobdefs['Priority']); + $this->Priority->createDirective(); + } + if (key_exists('ReRunFailedLevels', $jobdefs) && is_null($this->ReRunFailedLevels->getDirectiveValue())) { + $this->ReRunFailedLevels->setDirectiveValue($jobdefs['ReRunFailedLevels']); + $this->ReRunFailedLevels->createDirective(); + } + } + + public function loadRescheduleDirectives() { + $jobdefs = $this->getJobDefs(); + if (key_exists('RescheduleOnError', $jobdefs) && is_null($this->RescheduleOnError->getDirectiveValue())) { + $this->RescheduleOnError->setDirectiveValue($jobdefs['RescheduleOnError']); + $this->RescheduleOnError->createDirective(); + } + if (key_exists('RescheduleIncompleteJobs', $jobdefs) && is_null($this->RescheduleIncompleteJobs->getDirectiveValue())) { + $this->RescheduleIncompleteJobs->setDirectiveValue($jobdefs['RescheduleIncompleteJobs']); + $this->RescheduleIncompleteJobs->createDirective(); + } + if (key_exists('RescheduleInterval', $jobdefs) && is_null($this->RescheduleInterval->getDirectiveValue())) { + $this->RescheduleInterval->setDirectiveValue($jobdefs['RescheduleInterval']); + $this->RescheduleInterval->createDirective(); + } + if (key_exists('RescheduleTimes', $jobdefs) && is_null($this->RescheduleTimes->getDirectiveValue())) { + $this->RescheduleTimes->setDirectiveValue($jobdefs['RescheduleTimes']); + $this->RescheduleTimes->createDirective(); + } + } + + /** + * Load messages. + * + * @return none + */ + public function loadMessages() { + $message_list = array(); + $messages = $this->getModule('api')->get(array('config', 'dir', 'messages'))->output; + for ($i = 0; $i < count($messages); $i++) { + $message_list[] = $messages[$i]->Messages->Name; + } + asort($message_list); + $this->Messages->setData($message_list); + $jobdefs = $this->getJobDefs(); + if (key_exists('Messages', $jobdefs)) { + $this->Messages->setDirectiveValue($jobdefs['Messages']); + } + $this->Messages->onLoad(null); + } + + /** + * Load schedule. + * + * @return none + */ + public function loadSchedules() { + $schedule_list = array(); + $schedules = $this->getModule('api')->get(array('config', 'dir', 'schedule'))->output; + for ($i = 0; $i < count($schedules); $i++) { + $schedule_list[] = $schedules[$i]->Schedule->Name; + } + asort($schedule_list); + $this->Schedule->setData($schedule_list); + $jobdefs = $this->getJobDefs(); + if (key_exists('Schedule', $jobdefs)) { + $this->Schedule->setDirectiveValue($jobdefs['Schedule']); + } + $this->Schedule->onLoad(null); + } + + public function wizardCompleted($sender, $param) { + $jobdefs = $this->getJobDefs(); + $job = array( + 'Name' => $this->Name->getDirectiveValue(), + 'Type' => $this->Type->getDirectiveValue(), + ); + $jd = $this->JobDefs->getDirectiveValue(); + $directives = array('Client', 'Fileset', 'Storage', 'SpoolData', 'SpoolAttributes', + 'SpoolSize', 'Pool', 'FullBackupPool', 'IncrementalBackupPool', 'DifferentialBackupPool', + 'Accurate', 'MaximumConcurrentJobs', 'Priority', 'ReRunFailedLevels', 'Schedule', + 'RescheduleOnError', 'RescheduleIncompleteJobs', 'RescheduleInterval', 'RescheduleTimes', + 'Messages' + ); + if (is_string($jd)) { + $job['JobDefs'] = $jd; + } + for ($i = 0; $i < count($directives); $i++) { + $val = $this->{$directives[$i]}->getDirectiveValue(); + if (is_null($val)) { + continue; + } + if (is_null($jd) || !$this->isInJobDefs($directives[$i], $val)) { + $job[$directives[$i]] = $val; + } + } + $params = array( + 'config', + 'dir', + 'Job', + $job['Name'] + ); + $result = $this->getModule('api')->set( + $params, + array('config' => json_encode($job)) + ); + if ($result->error === 0) { + $this->getModule('api')->set(array('console'), array('reload')); + $this->goToPage('JobList'); + } else { + $this->CreateResourceErrMsg->Display = 'None'; + $this->CreateResourceErrMsg->Text = ''; + } + } + + /** + * Cancel wizard. + * + * @return none + */ + public function wizardStop($sender, $param) { + $this->goToDefaultPage(); + } + + /** + * Set selected JobDefs values. + * + * @param $jobdefs selected JobDefs values + * @return none + */ + public function setJobDefs($jobdefs) { + $this->setViewState(self::JOBDEFS, $jobdefs); + } + + /** + * Get selected JobDefs values. + * + * @return array selected JobDefs values + */ + public function getJobDefs() { + return $this->getViewState(self::JOBDEFS, array()); + } + + /** + * Set previous wizard step. + * + * @param integer $step previous step number + * @return none + */ + public function setPrevStep($step) { + $step = intval($step); + $this->setViewState(self::PREV_STEP, $step); + } + + /** + * Get previous wizard step. + * + * @return integer previous wizard step + */ + public function getPrevStep() { + return $this->getViewState(self::PREV_STEP); } } ?> diff --git a/gui/baculum/protected/Web/Portlets/BConditional.php b/gui/baculum/protected/Web/Portlets/BConditional.php index dc3621345..b90ee114e 100644 --- a/gui/baculum/protected/Web/Portlets/BConditional.php +++ b/gui/baculum/protected/Web/Portlets/BConditional.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2016 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -20,10 +20,9 @@ * Bacula(R) is a registered trademark of Kern Sibbald. */ -Prado::using('System.Web.UI.TTemplateControl'); -Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); +Prado::using('System.Web.UI.WebControls.TConditional'); -class BConditional extends TTemplateControl implements IActiveControl { +class BConditional extends TTemplateControl implements IDataRenderer, IActiveControl { const BCONDITION = 'BCondition'; const TYPE_TPL_FALSE = 0; @@ -31,6 +30,12 @@ class BConditional extends TTemplateControl implements IActiveControl { private $item_true_template; private $item_false_template; + private $data; + private $creating_children = false; + + public function onInit($param) { + parent::onInit($param); + } public function __construct() { parent::__construct(); @@ -41,49 +46,46 @@ class BConditional extends TTemplateControl implements IActiveControl { return $this->getAdapter()->getBaseActiveControl(); } - public function onLoad($param) { - $this->prepareControlContent(); - parent::onLoad($param); + public function getData() { + return $this->data; } - public function bubbleEvent($sender, $param) { - if ($param instanceof Prado\Web\UI\TCommandEventParameter) { - $this->raiseBubbleEvent($this, $param); - return true; - } else { - return false; - } + public function setData($data) { + $this->data = $data; } - private function createItemInternal($item_type) { - $item = $this->createItem($item_type); - if (!is_null($item)) { - $this->getControls()->add($item); - } - return $item; + public function setCondition($value) { + settype($value, 'bool'); + $this->setViewState(self::BCONDITION, $value); } - protected function createItem($item_type) { - $template = null; - $item = null; - switch ($item_type) { - case self::TYPE_TPL_TRUE: { - $template = $this->getTrueTemplate(); - break; - } - case self::TYPE_TPL_FALSE: { - $template = $this->getFalseTemplate(); - break; + public function getCondition() { + return $this->getViewState(self::BCONDITION); + } + + public function createChildControls() + { + $this->creating_children = true; + $this->dataBindProperties(); + $result = $this->getCondition(); + $true_template = $this->getTrueTemplate(); + $false_template = $this->getFalseTemplate(); + if ($result) { + if ($true_template) { + $true_template->instantiateIn($this->getTemplateControl(), $this); } + } elseif ($false_template) { + $false_template->instantiateIn($this->getTemplateControl(), $this); } - if (!is_null($template)) { - $item = new BConditionalItem; - $item->setItemType($item_type); - $item->setTemplate($template); - $item->setTemplateControl($this); - $item->setData($this->getTemplateControl()); + $this->setData($this->getTemplateControl()); + $this->creating_children = false; + } + + public function addParsedObject($object) + { + if ($this->creating_children) { + parent::addParsedObject($object); } - return $item; } public function getTrueTemplate() { @@ -105,57 +107,5 @@ class BConditional extends TTemplateControl implements IActiveControl { $this->item_false_template = $template; } } - - public function setBCondition($value) { - settype($value, 'bool'); - $this->setViewState(self::BCONDITION, $value); - } - - public function getBCondition() { - return $this->getViewState(self::BCONDITION); - } - - public function dataBind() { - $this->dataBindProperties(); - $this->prepareControlContent(); - } - - public function prepareControlContent() { - if ($this->getBCondition() === true) { - $this->createItemInternal(self::TYPE_TPL_TRUE); - } else { - $this->createItemInternal(self::TYPE_TPL_FALSE); - } - } -} - -class BConditionalItem extends TTemplateControl implements IDataRenderer, INamingContainer { - private $item_type; - private $data; - - public function getItemType() { - return $this->item_type; - } - - public function setItemType($type) { - $this->item_type = $type; - } - - public function getData() { - return $this->data; - } - - public function setData($data) { - $this->data = $data; - } - - public function bubbleEvent($sender,$param) { - if ($param instanceof Prado\Web\UI\TCommandEventParameter) { - $this->raiseBubbleEvent($this, $param); - return true; - } else { - return false; - } - } } ?> diff --git a/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.php b/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.php index 3a89fdb64..2ffe7ff88 100644 --- a/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.php +++ b/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2018 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -24,14 +24,13 @@ Prado::using('System.Web.UI.ActiveControls.TActiveLabel'); Prado::using('System.Web.UI.ActiveControls.TActiveLinkButton'); Prado::using('System.Web.UI.ActiveControls.TActivePanel'); Prado::using('System.Web.UI.ActiveControls.TActiveRepeater'); -Prado::using('Application.Web.Portlets.BConditional'); Prado::using('Application.Web.Portlets.DirectiveListTemplate'); -Prado::using('Application.Web.Portlets.DirectiveBoolean'); +Prado::using('Application.Web.Portlets.DirectiveCheckBox'); Prado::using('Application.Web.Portlets.DirectiveComboBox'); Prado::using('Application.Web.Portlets.DirectiveInteger'); Prado::using('Application.Web.Portlets.DirectiveListBox'); Prado::using('Application.Web.Portlets.DirectiveSize'); -Prado::using('Application.Web.Portlets.DirectiveText'); +Prado::using('Application.Web.Portlets.DirectiveTextBox'); Prado::using('Application.Web.Portlets.DirectiveTimePeriod'); Prado::using('Application.Web.Portlets.DirectiveRunscript'); Prado::using('Application.Web.Portlets.DirectiveMessages'); @@ -48,11 +47,11 @@ class BaculaConfigDirectives extends DirectiveListTemplate { public $resource_names = array(); private $directive_types = array( - 'DirectiveBoolean', + 'DirectiveCheckBox', 'DirectiveComboBox', 'DirectiveInteger', 'DirectiveListBox', - 'DirectiveText', + 'DirectiveTextBox', 'DirectiveSize', 'DirectiveTimePeriod' ); @@ -117,6 +116,7 @@ class BaculaConfigDirectives extends DirectiveListTemplate { )); } } + $data_desc = $this->Application->getModule('data_desc'); $resource_desc = $data_desc->getDescription($component_type, $resource_type); foreach ($resource_desc as $directive_name => $directive_desc) { @@ -164,6 +164,21 @@ class BaculaConfigDirectives extends DirectiveListTemplate { if (is_object($directive_value)) { $directive_value = (array)$directive_value; } + + if ($directive_name === 'Include' || $directive_name === 'Exclude' || $directive_name === 'Runscript') { + // provide all include blocks at once + $directive_value = array(array( + $directive_name => $directive_value, + )); + if (property_exists($config, 'Exclude')) { + $directive_value[0]['Exclude'] = (array)$config->{'Exclude'}; + } + } + + if ($directive_name === 'Exclude') { + continue; + } + foreach ($directive_value as $key => $value) { $directive = array( 'host' => $host, @@ -180,6 +195,8 @@ class BaculaConfigDirectives extends DirectiveListTemplate { 'field_type' => $field_type, 'label' => $directive_name, 'in_config' => $in_config, + 'parent_name' => null, + 'group_name' => null, 'show' => (($in_config || !$load_values) || $this->getShowAllDirectives()) ); array_push($directives, $directive); @@ -269,13 +286,16 @@ class BaculaConfigDirectives extends DirectiveListTemplate { } $directive_name = $controls[$j]->getDirectiveName(); $directive_value = $controls[$j]->getDirectiveValue(); - $default_value = $resource_desc[$directive_name]->DefaultValue; + $default_value = null; + if (key_exists($directive_name, $resource_desc)) { + $default_value = $resource_desc[$directive_name]->DefaultValue; + } $in_config = $controls[$j]->getInConfig(); if (is_null($directive_value)) { // skip not changed values that don't exist in config continue; } - if ($this->directive_types[$i] === 'DirectiveBoolean') { + if ($this->directive_types[$i] === 'DirectiveCheckBox') { settype($default_value, 'bool'); } elseif ($this->directive_types[$i] === 'DirectiveInteger') { settype($directive_value, 'int'); @@ -295,6 +315,9 @@ class BaculaConfigDirectives extends DirectiveListTemplate { if (is_null($directive_value)) { continue; } + if ($directive_name === 'Exclude') { + continue; + } if (!array_key_exists($directive_name, $directives)) { $directives[$directive_name] = array(); } @@ -306,6 +329,11 @@ class BaculaConfigDirectives extends DirectiveListTemplate { $directives[$directive_name] = array(); } $directives[$directive_name] = array_merge($directives[$directive_name], $directive_value[$directive_name]); + } elseif ($this->directive_list_types[$i] === 'DirectiveFileSet') { + if (key_exists('Exclude', $directive_value) && count($directive_value['Exclude']) > 0) { + $directives['Exclude'] = array($directive_value['Exclude']); + } + $directives[$directive_name] = $directive_value[$directive_name]; } elseif (array_key_exists($directive_name, $directive_value)) { $directives[$directive_name][] = $directive_value[$directive_name]; } elseif (count($directive_value) > 0) { diff --git a/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.tpl b/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.tpl index 1751c1564..450170c4a 100644 --- a/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.tpl +++ b/gui/baculum/protected/Web/Portlets/BaculaConfigDirectives.tpl @@ -47,67 +47,8 @@ - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-  <%=Prado::localize('Save')%> +  <%=$this->getLoadValues() ? Prado::localize('Save') : Prado::localize('Create')%> $('.save_progress').show(); diff --git a/gui/baculum/protected/Web/Portlets/DirectiveBoolean.php b/gui/baculum/protected/Web/Portlets/DirectiveCheckBox.php similarity index 89% rename from gui/baculum/protected/Web/Portlets/DirectiveBoolean.php rename to gui/baculum/protected/Web/Portlets/DirectiveCheckBox.php index e36dd2e07..c2486ebbd 100644 --- a/gui/baculum/protected/Web/Portlets/DirectiveBoolean.php +++ b/gui/baculum/protected/Web/Portlets/DirectiveCheckBox.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2016 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -24,7 +24,7 @@ Prado::using('System.Web.UI.ActiveControls.TActiveLabel'); Prado::using('System.Web.UI.ActiveControls.TActiveCheckBox'); Prado::using('Application.Web.Portlets.DirectiveTemplate'); -class DirectiveBoolean extends DirectiveTemplate { +class DirectiveCheckBox extends DirectiveTemplate { public function getValue() { // @TODO: Define boolean directive values (yes/no/0/1...etc.) @@ -40,7 +40,7 @@ class DirectiveBoolean extends DirectiveTemplate { $directive_value = $this->getDirectiveValue(); $default_value = $this->getDefaultValue(); settype($default_value, 'bool'); - if ($this->getInConfig() === false) { + if ($this->getInConfig() === false && empty($directive_value)) { $directive_value = $default_value; } $this->Label->Text = $this->getLabel(); diff --git a/gui/baculum/protected/Web/Portlets/DirectiveBoolean.tpl b/gui/baculum/protected/Web/Portlets/DirectiveCheckBox.tpl similarity index 100% rename from gui/baculum/protected/Web/Portlets/DirectiveBoolean.tpl rename to gui/baculum/protected/Web/Portlets/DirectiveCheckBox.tpl diff --git a/gui/baculum/protected/Web/Portlets/DirectiveComboBox.php b/gui/baculum/protected/Web/Portlets/DirectiveComboBox.php index 757052d33..62adbd31b 100644 --- a/gui/baculum/protected/Web/Portlets/DirectiveComboBox.php +++ b/gui/baculum/protected/Web/Portlets/DirectiveComboBox.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2016 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -26,6 +26,18 @@ Prado::using('Application.Web.Portlets.DirectiveTemplate'); class DirectiveComboBox extends DirectiveTemplate { + public function onLoad($param) { + $this->createDirectiveInternal(); + $this->saveDirective(); + parent::onLoad($param); + } + + public function saveDirective() { + $value = $this->getValue(); + $this->Directive->setSelectedValue($value); + $this->setDirectiveValue($value); + } + public function getValue() { $value = $this->Directive->getSelectedValue(); if (!is_string($value) || empty($value)) { @@ -34,7 +46,7 @@ class DirectiveComboBox extends DirectiveTemplate { return $value; } - public function createDirective() { + public function createDirectiveInternal() { $this->Label->Text = $this->getLabel(); $data = $this->getData(); $resource_names = $this->getResourceNames(); @@ -57,7 +69,7 @@ class DirectiveComboBox extends DirectiveTemplate { $directive_value = $this->getDirectiveValue(); $default_value = $this->getDefaultValue(); - if ($in_config === false) { + if ($in_config === false && empty($directive_value)) { if ($default_value !== 0) { $directive_value = $default_value; } else { diff --git a/gui/baculum/protected/Web/Portlets/DirectiveComboBox.tpl b/gui/baculum/protected/Web/Portlets/DirectiveComboBox.tpl index 7ee02e467..217be8b8b 100644 --- a/gui/baculum/protected/Web/Portlets/DirectiveComboBox.tpl +++ b/gui/baculum/protected/Web/Portlets/DirectiveComboBox.tpl @@ -12,7 +12,7 @@ getResourceType(); $directive_name = $this->getDirectiveName(); $directives = $this->getData(); - $data_source = array(); - $include = array(); + $includes = array(); + $file = array(); $exclude = array(); $options = array(); - if (is_object($directives)) { // Include with options - foreach($directives as $name => $values) { - switch($name) { - case 'File': { - $this->setFile($include, $name, $values); - break; - } - case 'Options': { - $this->setOption($options, $name, $values); - break; + if (!is_array($directives) || $directive_name === 'Exclude') { + return; + } + foreach ($directives as $index => $subres) { + if ($index === 'Include') { + for ($i = 0; $i < count($subres); $i++) { + if (is_null($subres[$i])) { + // load page with new fileset to create + continue; } - case 'Exclude': { - $this->setFile($exclude, $name, $values); - break; + foreach ($subres[$i] as $name => $values) { + switch($name) { + case 'File': { + $this->setFile($file, $name, $values); + break; + } + case 'Options': { + $this->setOption($options, $name, $values); + break; + } + } } + $includes[] = array( + 'file' => $file, + 'options' => $options + ); + $file = $options = array(); } + } elseif ($index === 'Exclude') { + if (!key_exists('File', $subres)) { + // empty exclude + continue; + } + // this is exclude + $this->setFile($exclude, 'File', $subres['File']); } } - - $this->RepeaterFileSetOptions->DataSource = $options; - $this->RepeaterFileSetOptions->dataBind(); - $this->RepeaterFileSetInclude->DataSource = $include; - $this->RepeaterFileSetInclude->dataBind(); + $this->RepeaterFileSetIncludes->DataSource = $includes; + $this->RepeaterFileSetIncludes->dataBind(); $this->RepeaterFileSetExclude->DataSource = $exclude; $this->RepeaterFileSetExclude->dataBind(); - $this->FileSetMenu->setComponentType($component_type); - $this->FileSetMenu->setComponentName($component_name); - $this->FileSetMenu->setResourceType($resource_type); - $this->FileSetMenu->setDirectiveName($directive_name); + $this->FSBrowser->loadClients(null, null); } private function setFile(&$files, $name, $config) { @@ -91,6 +104,10 @@ class DirectiveFileSet extends DirectiveListTemplate { $component_name = $this->getComponentName(); $resource_type = $this->getResourceType(); $resource_name = $this->getResourceName(); + $directive_name = 'File'; + $field_type = 'TextBox'; + $default_value = ''; + $required = false; for ($i = 0; $i < count($config); $i++) { $files[] = array( @@ -101,12 +118,23 @@ class DirectiveFileSet extends DirectiveListTemplate { 'resource_name' => $resource_name, 'directive_name' => $name, 'directive_value' => $config[$i], - 'parent_name' => $name + 'parent_name' => $name, + 'field_type' => $field_type, + 'default_value' => $default_value, + 'required' => $required, + 'data' => null, + 'resource' => null, + 'in_config' => true, + 'label' => $directive_name, + 'show' => true, + 'parent_name' => $name, + 'group_name' => $i ); } } private function setOption(&$options, $name, $config) { + $misc = $this->getModule('misc'); $load_values = $this->getLoadValues(); $host = $this->getHost(); $component_type = $this->getComponentType(); @@ -118,10 +146,17 @@ class DirectiveFileSet extends DirectiveListTemplate { for ($i = 0; $i < count($config); $i++) { foreach ($resource_desc->SubSections as $directive_name => $directive_desc) { - $in_config = property_exists($config[$i], $directive_name); + if ($directive_name == 'File') { + // In options block File cannot be defined + continue; + } + if (is_object($config[$i])) { + $config[$i] = (array)$config[$i]; + } + $in_config = key_exists($directive_name, $config[$i]); $directive_value = null; if ($in_config === true) { - $directive_value = $config[$i]->{$directive_name}; + $directive_value = $config[$i][$directive_name]; } $default_value = null; @@ -142,6 +177,17 @@ class DirectiveFileSet extends DirectiveListTemplate { $field_type = $directive_desc->FieldType; } } + if ($field_type === 'CheckBox') { + /** + * It is because bdirjson returns FileSet options boolean values + * as Yes/No instead of returning true/false as it does for the rest. + */ + if ($misc->isValidBooleanTrue($directive_value)) { + $directive_value = true; + } else if ($misc->isValidBooleanFalse($directive_value)) { + $directive_value = false; + } + } if (!is_array($directive_value)) { $directive_value = array($directive_value); } @@ -156,6 +202,7 @@ class DirectiveFileSet extends DirectiveListTemplate { 'directive_value' => $directive_value[$j], 'default_value' => $default_value, 'required' => $required, + 'resource' => null, 'data' => $data, 'field_type' => $field_type, 'in_config' => $in_config, @@ -170,54 +217,64 @@ class DirectiveFileSet extends DirectiveListTemplate { } public function getDirectiveValue() { - $directive_values = array(); + $directive_values = array('Include' => array(), 'Exclude' => array()); $component_type = $this->getComponentType(); $resource_type = $this->getResourceType(); $resource_desc = $this->Application->getModule('data_desc')->getDescription($component_type, $resource_type); - for ($i = 0; $i < count($this->directive_types); $i++) { - $controls = $this->RepeaterFileSetOptions->findControlsByType($this->directive_types[$i]); - for ($j = 0; $j < count($controls); $j++) { - $directive_name = $controls[$j]->getDirectiveName(); - $directive_value = $controls[$j]->getDirectiveValue(); - $index = $controls[$j]->getGroupName(); - $default_value = $resource_desc['Include']->SubSections->{$directive_name}->DefaultValue; - $in_config = $controls[$j]->getInConfig(); - if (is_null($directive_value)) { - // option not set or removed - continue; - } - if ($this->directive_types[$i] === 'DirectiveBoolean') { - settype($default_value, 'bool'); - } - if ($directive_value === $default_value) { - // value the same as default value, skip it - continue; - } - if (!array_key_exists('Include', $directive_values)) { - $directive_values['Include'] = array('Options' => array()); - } - if (!isset($directive_values['Include']['Options'][$index])) { - $directive_values['Include']['Options'][$index] = array(); - } - $directive_values['Include']['Options'][$index][$directive_name] = $directive_value; - } - $controls = $this->RepeaterFileSetInclude->findControlsByType($this->directive_types[$i]); - for ($j = 0; $j < count($controls); $j++) { - $directive_name = $controls[$j]->getDirectiveName(); - $directive_value = $controls[$j]->getDirectiveValue(); - if (is_null($directive_value)) { - // Include file directive removed - continue; - } - if (!array_key_exists('Include', $directive_values)) { - $directive_values['Include'] = array(); + $counter = 0; + $ctrls = $this->RepeaterFileSetIncludes->getItems(); + foreach ($ctrls as $value) { + for ($i = 0; $i < count($this->directive_types); $i++) { + $controls = $value->RepeaterFileSetOptions->findControlsByType($this->directive_types[$i]); + for ($j = 0; $j < count($controls); $j++) { + $directive_name = $controls[$j]->getDirectiveName(); + $directive_value = $controls[$j]->getDirectiveValue(); + $index = $controls[$j]->getGroupName(); + $default_value = $resource_desc['Include']->SubSections->{$directive_name}->DefaultValue; + $in_config = $controls[$j]->getInConfig(); + if (is_null($directive_value)) { + // option not set or removed + continue; + } + if ($this->directive_types[$i] === 'DirectiveCheckBox') { + settype($default_value, 'bool'); + } + if ($directive_value === $default_value) { + // value the same as default value, skip it + continue; + } + if (!isset($counter, $directive_values['Include'][$counter])) { + $directive_values['Include'][$counter] = array('Options' => array()); + } + if (!isset($directive_values['Include'][$counter]['Options'][$index])) { + $directive_values['Include'][$counter]['Options'][$index] = array(); + } + $directive_values['Include'][$counter]['Options'][$index][$directive_name] = $directive_value; } - if (!array_key_exists($directive_name, $directive_values['Include'])) { - $directive_values['Include'][$directive_name] = array(); + $controls = $value->RepeaterFileSetInclude->findControlsByType($this->directive_types[$i]); + for ($j = 0; $j < count($controls); $j++) { + $directive_name = $controls[$j]->getDirectiveName(); + $directive_value = $controls[$j]->getDirectiveValue(); + if (empty($directive_value)) { + // Include file directive removed + continue; + } + if (!key_exists('Include', $directive_values)) { + $directive_values['Include'] = array(); + } + if (!isset($directive_values['Include'][$counter])) { + $directive_values['Include'][$counter] = array(); + } + if (!key_exists($directive_name, $directive_values['Include'][$counter])) { + $directive_values['Include'][$counter][$directive_name] = array(); + } + array_push($directive_values['Include'][$counter][$directive_name], $directive_value); } - array_push($directive_values['Include'][$directive_name], $directive_value); } + $counter++; + } + for ($i = 0; $i < count($this->directive_types); $i++) { $controls = $this->RepeaterFileSetExclude->findControlsByType($this->directive_types[$i]); for ($j = 0; $j < count($controls); $j++) { $directive_name = $controls[$j]->getDirectiveName(); @@ -226,43 +283,21 @@ class DirectiveFileSet extends DirectiveListTemplate { // Exclude file directive removed continue; } - if (!array_key_exists($directive_name, $directive_values)) { - $directive_values[$directive_name] = array('File' => array()); + if (!key_exists('File', $directive_values['Exclude'])) { + $directive_values['Exclude']['File'] = array(); } - array_push($directive_values[$directive_name]['File'], $directive_value); + array_push($directive_values['Exclude']['File'], $directive_value); } } - return $directive_values; } - public function createFileSetOptions($sender, $param) { - $load_values = $this->getLoadValues(); - $bconditionals = $this->RepeaterFileSetOptions->findControlsByType('BConditionalItem'); - for ($i = 0; $i < count($bconditionals); $i++) { - $item = $bconditionals[$i]->getData(); - for ($j = 0; $j < count($this->directive_types); $j++) { - $control = $this->getChildControl($item, $this->directive_types[$j]); - if (is_object($control)) { - $control->setHost($item->Data['host']); - $control->setComponentType($item->Data['component_type']); - $control->setComponentName($item->Data['component_name']); - $control->setResourceType($item->Data['resource_type']); - $control->setResourceName($item->Data['resource_name']); - $control->setDirectiveName($item->Data['directive_name']); - $control->setDirectiveValue($item->Data['directive_value']); - $control->setDefaultValue($item->Data['default_value']); - $control->setRequired($item->Data['required']); - $control->setData($item->Data['data']); - $control->setLabel($item->Data['label']); - $control->setInConfig($item->Data['in_config']); - $show_all_directives = ($item->Data['in_config'] || !$load_values || $this->SourceTemplateControl->getShowAllDirectives()); - $control->setShow($show_all_directives); - $control->setParentName($item->Data['parent_name']); - $control->setGroupName($item->Data['group_name']); - } - } - } + public function createFileSetIncludes($sender, $param) { + $param->Item->RepeaterFileSetOptions->DataSource = $param->Item->Data['options']; + $param->Item->RepeaterFileSetOptions->dataBind(); + $param->Item->RepeaterFileSetInclude->DataSource = $param->Item->Data['file']; + $param->Item->RepeaterFileSetInclude->dataBind(); + $param->Item->FileSetFileOptMenu->setItemIndex($param->Item->getItemIndex()); } public function createFileSetIncExcElement($sender, $param) { @@ -285,59 +320,81 @@ class DirectiveFileSet extends DirectiveListTemplate { } } - private function getDirectiveData() { - $values = $this->getDirectiveValue(); - $data = array(); - if (array_key_exists('Include', $values) && array_key_exists('File', $values['Include'])) { - $data['File'] = $values['Include']['File']; - if (array_key_exists('Options', $values['Include']) && is_array($values['Include']['Options'])) { - $data['Options'] = array(); - for ($i = 0; $i < count($values['Include']['Options']); $i++) { - $data['Options'][$i] = (object)$values['Include']['Options'][$i]; - } - } - } - if (array_key_exists('Exclude', $values) && array_key_exists('File', $values['Exclude'])) { - $data['Exclude'] = $values['Exclude']['File']; - } - return $data; + public function newIncludeBlock($sender, $param) { + $data = $this->getDirectiveValue(); + $data['Include'][] = array(); + $this->setData($data); + $this->loadConfig(null, null); } public function newIncludeFile($sender, $param) { - $data = $this->getDirectiveData(); - if (array_key_exists('File', $data) && is_array($data['File'])) { - $data['File'][] = ''; - } else { - $data['File'] = array(''); + $data = $this->getDirectiveValue(); + $inc_index = $sender->Parent->getItemIndex(); + $file_index = 0; + if (key_exists($inc_index, $data['Include']) && key_exists('File', $data['Include'][$inc_index])) { + $file_index = count($data['Include'][$inc_index]['File']); } - $data = (object)$data; + $data['Include'][$inc_index]['File'][$file_index] = ''; $this->setData($data); $this->loadConfig(null, null); } public function newExcludeFile($sender, $param) { - $data = $this->getDirectiveData(); - if (array_key_exists('Exclude', $data) && is_array($data['Exclude'])) { - $data['Exclude'][] = ''; + $data = $this->getDirectiveValue(); + $file_index = 0; + if (key_exists('Exclude', $data) && is_array($data['Exclude']) && key_exists('File', $data['Exclude'])) { + $file_index = count($data['Exclude']['File']); } else { - $data['Exclude'] = array(''); + $data['Exclude'] = array('File' => array()); } - $data = (object)$data; + $data['Exclude']['File'][$file_index] = ''; $this->setData($data); $this->loadConfig(null, null); } public function newIncludeOptions($sender, $param) { - $data = $this->getDirectiveData(); - if (array_key_exists('Options', $data) && is_array($data['Options'])) { - $data['Options'][] = new stdClass; - } else { - $data['Options'] = array(new stdClass); + $data = $this->getDirectiveValue(); + $inc_index = $sender->Parent->getItemIndex(); + $opt_index = 0; + if (key_exists($inc_index, $data['Include']) && key_exists('Options', $data['Include'][$inc_index])) { + $opt_index = count($data['Include'][$inc_index]['Options']); } - $data = (object)$data; + $data['Include'][$inc_index]['Options'][$opt_index] = array(); $this->SourceTemplateControl->setShowAllDirectives(true); $this->setData($data); $this->loadConfig(null, null); } + + public function newIncludeExcludeFile($sender, $param) { + $data = $this->getDirectiveValue(); + $inc_index = $this->RepeaterFileSetIncludes->getItems()->getCount() - 1; + $inc_exc = $param->getCallbackParameter(); + if (property_exists($inc_exc, 'Include') && is_array($inc_exc->Include)) { + if (!key_exists($inc_index, $data['Include'])) { + $data['Include'][$inc_index] = array('File' => array()); + } + for ($i = 0; $i < count($inc_exc->Include); $i++) { + if (in_array($inc_exc->Include[$i], $data['Include'][$inc_index]['File'])) { + // path already in includes, skip it to not double it + continue; + } + $data['Include'][$inc_index]['File'][] = $inc_exc->Include[$i]; + } + } + if (property_exists($inc_exc, 'Exclude') && is_array($inc_exc->Exclude)) { + if (!key_exists('File', $data['Exclude'])) { + $data['Exclude'] = array('File' => array()); + } + for ($i = 0; $i < count($inc_exc->Exclude); $i++) { + if (in_array($inc_exc->Exclude[$i], $data['Exclude']['File'])) { + // path already in includes, skip it to not double it + continue; + } + $data['Exclude']['File'][] = $inc_exc->Exclude[$i]; + } + } + $this->setData($data); + $this->loadConfig(null, null); + } } ?> diff --git a/gui/baculum/protected/Web/Portlets/DirectiveFileSet.tpl b/gui/baculum/protected/Web/Portlets/DirectiveFileSet.tpl index eb4ac1e92..4524c47db 100644 --- a/gui/baculum/protected/Web/Portlets/DirectiveFileSet.tpl +++ b/gui/baculum/protected/Web/Portlets/DirectiveFileSet.tpl @@ -1,74 +1,76 @@ -
-

<%=$this->getDirectiveName()%>

- - - - -
-

<%[ Options ]%>

- + + + - <%=($this->getItemIndex() % 31 === 0 ? '

Options #' . (($this->getItemIndex()/31)+1) . '


' : '')%> - - - - - - - - - - - - - - - - - - - - - - - - - -
- +
+

<%#$this->SourceTemplateControl->getDirectiveName()%> #<%#$this->ItemIndex + 1%>

+ + + + +
+

<%[ Options ]%>

+ + +
+ +
+ + +
+

<%[ Files ]%>

+ + +
+ +
-
-
- - -
-

<%[ Files ]%>

- - -
- -
- -
-
-

<%[ Files ]%>

+

<%[ Exclude ]%>

+ + +

<%[ Files ]%>

-
- +
+
+ diff --git a/gui/baculum/protected/Web/Portlets/FileSetOptionRenderer.php b/gui/baculum/protected/Web/Portlets/FileSetOptionRenderer.php new file mode 100644 index 000000000..d10f4b5f4 --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/FileSetOptionRenderer.php @@ -0,0 +1,51 @@ +item_count = $this->getParent()->getItems()->getCount(); + } + + public function render($writer) { + if (self::$index % 30 === 0) { + $writer->write('

Options #' . ((self::$index/30) + 1) . '


'); + } + self::$index++; + + if (self::$index === $this->item_count) { + $this->resetIndex(); + } + parent::render($writer); + } + + public static function resetIndex() { + self::$index = 0; + } +} +?> diff --git a/gui/baculum/protected/Web/Portlets/JobRunscriptRenderer.php b/gui/baculum/protected/Web/Portlets/JobRunscriptRenderer.php new file mode 100644 index 000000000..7f972099a --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/JobRunscriptRenderer.php @@ -0,0 +1,51 @@ +item_count = $this->getParent()->getItems()->getCount(); + } + + public function render($writer) { + if (self::$index % 7 === 0) { + $writer->write('

Runscript #' . ((self::$index/7) + 1) . '


'); + } + self::$index++; + + if (self::$index === $this->item_count) { + $this->resetIndex(); + } + parent::render($writer); + } + + public static function resetIndex() { + self::$index = 0; + } +} +?> diff --git a/gui/baculum/protected/Web/Portlets/MessageTypes.php b/gui/baculum/protected/Web/Portlets/MessageTypes.php index ebd63d2fa..aae494429 100644 --- a/gui/baculum/protected/Web/Portlets/MessageTypes.php +++ b/gui/baculum/protected/Web/Portlets/MessageTypes.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2017 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -23,7 +23,7 @@ Prado::using('System.Web.Ui.ActiveControls.TActiveRepeater'); Prado::using('Application.Web.Portlets.DirectiveListTemplate'); -Prado::using('Application.Web.Portlets.DirectiveBoolean'); +Prado::using('Application.Web.Portlets.DirectiveCheckBox'); class MessageTypes extends DirectiveListTemplate { @@ -33,7 +33,7 @@ class MessageTypes extends DirectiveListTemplate { } public function getDirectiveValues() { - $type_controls = $this->RepeaterMessageTypes->findControlsByType('DirectiveBoolean'); + $type_controls = $this->RepeaterMessageTypes->findControlsByType('DirectiveCheckBox'); $is_all = false; $types = array(); for ($i = 0; $i < count($type_controls); $i++) { @@ -52,7 +52,7 @@ class MessageTypes extends DirectiveListTemplate { } public function createTypeListElement($sender, $param) { - $control = $this->getChildControl($param->Item, 'DirectiveBoolean'); + $control = $this->getChildControl($param->Item, 'DirectiveCheckBox'); if (is_object($control)) { $control->setHost($param->Item->Data['host']); $control->setComponentType($param->Item->Data['component_type']); diff --git a/gui/baculum/protected/Web/Portlets/MessageTypes.tpl b/gui/baculum/protected/Web/Portlets/MessageTypes.tpl index ae0e8c657..1c5b39a96 100644 --- a/gui/baculum/protected/Web/Portlets/MessageTypes.tpl +++ b/gui/baculum/protected/Web/Portlets/MessageTypes.tpl @@ -1,5 +1,5 @@ - + diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.php b/gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.php new file mode 100644 index 000000000..29581f334 --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.php @@ -0,0 +1,37 @@ +setViewState(self::ITEM_INDEX, $index); + } + + public function getItemIndex() { + return $this->getViewState(self::ITEM_INDEX); + } +} +?> diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.tpl b/gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.tpl new file mode 100644 index 000000000..0ebdcfb95 --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/NewFileSetExcMenu.tpl @@ -0,0 +1,14 @@ + diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.php b/gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.php new file mode 100644 index 000000000..cde0dc4a4 --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.php @@ -0,0 +1,37 @@ +setViewState(self::ITEM_INDEX, $index); + } + + public function getItemIndex() { + return $this->getViewState(self::ITEM_INDEX); + } +} +?> diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.tpl b/gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.tpl new file mode 100644 index 000000000..a08ab63a4 --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/NewFileSetFileOptMenu.tpl @@ -0,0 +1,29 @@ + diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetMenu.php b/gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.php similarity index 88% rename from gui/baculum/protected/Web/Portlets/NewFileSetMenu.php rename to gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.php index 01d39e007..d77d3691f 100644 --- a/gui/baculum/protected/Web/Portlets/NewFileSetMenu.php +++ b/gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2017 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -22,5 +22,6 @@ Prado::using('Application.Web.Portlets.DirectiveListTemplate'); -class NewFileSetMenu extends DirectiveListTemplate { +class NewFileSetIncExcMenu extends DirectiveListTemplate { } +?> diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.tpl b/gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.tpl new file mode 100644 index 000000000..80cbb54e7 --- /dev/null +++ b/gui/baculum/protected/Web/Portlets/NewFileSetIncExcMenu.tpl @@ -0,0 +1,23 @@ + diff --git a/gui/baculum/protected/Web/Portlets/NewFileSetMenu.tpl b/gui/baculum/protected/Web/Portlets/NewFileSetMenu.tpl deleted file mode 100644 index 8ba3b5b88..000000000 --- a/gui/baculum/protected/Web/Portlets/NewFileSetMenu.tpl +++ /dev/null @@ -1,30 +0,0 @@ - diff --git a/gui/baculum/protected/Web/Portlets/NewRunscriptMenu.tpl b/gui/baculum/protected/Web/Portlets/NewRunscriptMenu.tpl index 686a5e265..e79e52deb 100644 --- a/gui/baculum/protected/Web/Portlets/NewRunscriptMenu.tpl +++ b/gui/baculum/protected/Web/Portlets/NewRunscriptMenu.tpl @@ -5,7 +5,7 @@ ID="RunscriptItem" OnCommand="Parent.SourceTemplateControl.newRunscriptDirective" CommandParameter="save" - ClientSide.OnComplete="var el = $('#<%=$this->RunscriptItem->ClientID%>').parents('div.directive_field').find('div').find('h3.runscript'); BaculaConfig.scroll_to_element(el[el.length-1]);" + ClientSide.OnComplete="var el = $('#<%=$this->RunscriptItem->ClientID%>').parents('div').find('h3.options'); BaculaConfig.scroll_to_element(el[el.length-1]);" Text="Runscript" Attributes.onclick="$(this).closest('div.config_new_runscript').hide();" /> diff --git a/gui/baculum/protected/Web/Portlets/RunJob.php b/gui/baculum/protected/Web/Portlets/RunJob.php index 8db4a3fc3..3457f6f2c 100644 --- a/gui/baculum/protected/Web/Portlets/RunJob.php +++ b/gui/baculum/protected/Web/Portlets/RunJob.php @@ -3,7 +3,7 @@ * Bacula(R) - The Network Backup Solution * Baculum - Bacula web interface * - * Copyright (C) 2013-2018 Kern Sibbald + * Copyright (C) 2013-2019 Kern Sibbald * * The main author of Baculum is Marcin Haba. * The original author of Bacula is Kern Sibbald, with contributions @@ -40,6 +40,7 @@ class RunJob extends Portlets { const RESOURCE_SHOW_PATTERN = '/^\s+--> %resource: name=(.+?(?=\s\S+\=.+)|.+$)/i'; const JOB_SHOW_PATTERN = '/^Job:\sname=(?P.+)\sJobType=\d+\slevel=(?P\w+)?\sPriority=(?P\d+)/i'; + const ACCURATE_PATTERN = '/^\s+Accurate=(?P\d)/i'; const DEFAULT_JOB_PRIORITY = 10; @@ -75,6 +76,8 @@ class RunJob extends Portlets { if (empty($jobdata->storage)) { $jobdata->storage = $this->getResourceName('autochanger', $job_show); } + $jobdata->priorjobid = $job_attr['priority']; + $jobdata->accurate = (key_exists('accurate', $job_attr) && $job_attr['accurate'] == 1); } else { $jobs = array(); $job_list = $this->getModule('api')->get(array('jobs', 'resnames'), null, true, self::USE_CACHE)->output; @@ -184,6 +187,10 @@ class RunJob extends Portlets { } $this->Storage->dataBind(); + if (is_object($jobdata) && property_exists($jobdata, 'accurate')) { + $this->Accurate->Checked = $jobdata->accurate; + } + $priority = self::DEFAULT_JOB_PRIORITY; if (is_object($jobdata) && property_exists($jobdata, 'priorjobid') && $jobdata->priorjobid > 0) { $priority = $jobdata->priorjobid; @@ -269,6 +276,9 @@ class RunJob extends Portlets { $attr['jobname'] = $match['jobname']; $attr['level'] = $match['level']; $attr['priority'] = $match['priority']; + } + if (preg_match(self::ACCURATE_PATTERN, $jobshow[$i], $match) === 1) { + $attr['accurate'] = $match['accurate']; break; } } diff --git a/gui/baculum/protected/Web/endpoints.xml b/gui/baculum/protected/Web/endpoints.xml index 4175bd623..22a1daa21 100644 --- a/gui/baculum/protected/Web/endpoints.xml +++ b/gui/baculum/protected/Web/endpoints.xml @@ -28,6 +28,7 @@ + diff --git a/gui/baculum/themes/Baculum-v2/css/baculum.css b/gui/baculum/themes/Baculum-v2/css/baculum.css index c0f7913dc..c427b9412 100644 --- a/gui/baculum/themes/Baculum-v2/css/baculum.css +++ b/gui/baculum/themes/Baculum-v2/css/baculum.css @@ -126,3 +126,82 @@ div.config_directives { .justify { text-align: justify; } + +#fileset_browser_file_container, #fileset_browser_include_container, #fileset_browser_exclude_container { + width: 50%; + overflow-y: auto; + overflow-x: none; + background-color: white; + padding: 0; + height: 384px; +} + +#fileset_browser_include_container { + height: 150px; +} + +#fileset_browser_exclude_container { + height: 162px; +} + +.item { + cursor: pointer; + clear: left; + height: 30px; +} + +.item a { + text-decoration: underline; +} + +.item, .item_included, .item_excluded { + padding: 4px 0 4px 4px; + background-color: transparent; +} + +.item_included, .item_excluded { + width: 100%; +} + +.item:hover, .item_included:hover, .item_excluded:hover { + width: 100%; + height: 30px; + background-color: #e7e7e7; +} + +.item_inc_exc_btn { + display: inline-block; + float: right; + margin-left: 5px; +} + +.item_selected_del_btn { + float: right; + margin: 2px 10px; + cursor: pointer; +} + +.item_name { + width: 69%; + float: left; + padding-left: 5px; +} + +.dir_item_img, .file_item_img, .link_item_img { + width: 30px; + height: 24px; + background-repeat: no-repeat; + float: left; +} + +.dir_item_img { + background-image: url('/themes/Baculum-v2/directory-icon.png'); +} + +.file_item_img { + background-image: url('/themes/Baculum-v2/file-icon.png'); +} + +.link_item_img { + background-image: url('/themes/Baculum-v2/link-icon.png'); +} diff --git a/gui/baculum/themes/Baculum-v2/css/restore-wizard.css b/gui/baculum/themes/Baculum-v2/css/restore-wizard.css index 7a7f20cc6..e40d33d75 100644 --- a/gui/baculum/themes/Baculum-v2/css/restore-wizard.css +++ b/gui/baculum/themes/Baculum-v2/css/restore-wizard.css @@ -69,6 +69,10 @@ tr.file-browser-element:hover { overflow-y: auto; } +.normal { + font-weight: normal; +} + .bold { font-weight: bold; } diff --git a/gui/baculum/themes/Baculum-v2/link-icon.png b/gui/baculum/themes/Baculum-v2/link-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7f56713a9358f2c0d68dd91a28cb30c89a353d19 GIT binary patch literal 1635 zc-jGD2AuhcP)-E&Czgf;2j=Ev9Z8hOU5{G1T&R0usK)<|;zH#sH(g~gcxELEui0J$5IITPk_$?l@OD3M6~nNTEB=H+ikt|A{C ziUPwhplKSkhX%mHwA%xDVlvv>9&H0~>5bKHRc0>CN{cVrTfFu6ufO`-a7|T8^!iRh z2qA8dhuG~7GBGhhEEWryoSY(KW6z1ErizS?j*`CK9+I~y?fhIaaY|KcD6&)LhlEP2 zi;wLOm&GUXg+dWHTrL=fhSh3?*Xsp~#R8Yh!^p@G%C45c*w>4->oO6(A`;;%A~1jc zf^+~rC42<`$TObD;ZQl7^7syi1B{CS<6=Mvfs0{ax7%Ro?m}JdJ-EFdC^m1!frCdd z>2Sa~>BQ6&jpWoc@qn=}PNRLSdzpZmxqeZR%R(dHS(OpIU=ds{7mUU}+}Bj0t*sgQ zt|#E}cu?jSU_%{Qk+fzl#1el91VY&DHiU;qau+OG zEC<^EeA6vz2n$;dFCmDIks)eTEbMk0+FP5^^5`KLhCz0Y5=Fb-h0SV#**uQA+PmoO z(PP){0}u#Bh>4NOtrKS9oth@+D+Dh!=Kj#&KsuMpLxZ*s{e3-H8nzro#rqKu5Cpxx z1FFmC;bLgG-EKrh$00p)BU~;9?&)bP36Ulc;uRDZDxEW!)XT?_%c6rKBBK;yu>=zT z0LbE#AQAhcrusI@R2M<9DMZJ~Ad@E{CN>@heJ8G5ItM?VA3~*Ju-UDGf&Si0r7HEv ztR4Wsi*eJ9k&&SjA<{6o-ERE)^C?&@6Ub5IL!m4HP17)qjpDYt90q+SR>vpc(BTik z=kviZG!`umg;*>p0MIy#ptw*8^Y{ysY3%tBMRBA63wc`$ArJ`AW9Y)IitBJqGvKf} zh+Qp5;m&;+95kY(`5`QpaVV4pSP~)yn@#Ni@ac>@_y|f>YUE@kO%6Uawoq(JN(ezi zeJ%R?dXSKqg5=aRh(uy=xjZyC)}#Dd2^KF2MRaUD;$(7gI2?#Y68HxM#b%_&@Jm%{ zdX_|YYnrD51Lt?MC<<&g8yj=-;Fs?Qr_%|`gcTX=)G<7=*aE)xNoY<5R@S z67WRV;`1f;>)vD_#?!xCTGrj!0*0oc*FQn)qeh%M{hKdGtJMG=57wst zD_c{07qps6TfL^T-)XmPy!KbMnf1DLm#WmrSEOJ0^5oe<3U0JCHDGemfr!YJkVqu( zcs$?>B#;Cy1jXZ{w?_{{mkv++4O(4m<2|R-exs_ct$qgYl_t-;J{F5r(b>^nD3i$$ z5fKiL#{-JuKoqbL!6D(Wn9aCz`#PGmHSl^o-;KX`{?oL}^{nEq*7ka_b4s*%W6FZ0 z)b(Qr-#ZGkX&92=P*6M}jJ*t0YLTY*rt&E;awj1CW+^YfeM hxLNsN>TQ8%;%^dIz+5FF1!n*N002ovPDHLkV1lwD0crpM literal 0 Hc-jL100001 -- 2.47.3