From 8b13b360121ae6337dee17b496b9ff6720a9b66b Mon Sep 17 00:00:00 2001 From: infl00p Date: Fri, 21 Apr 2023 17:31:54 +0300 Subject: [PATCH] =?UTF-8?q?=CE=B5=CE=BB=CE=BB=CE=B7=CE=BD=CE=B9=CE=BA?= =?UTF-8?q?=CE=AC=20=CF=83=CF=84=CE=BF=20keycloak?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logos/hellug_flat_1.svg | 109 + .../account/messages/messages_el.properties | 378 ++ .../account/messages/messages_en.properties | 3 +- .../account/resources/css/account.css | 279 -- .../resources/img/icon-sidebar-active.png | Bin 202 -> 0 bytes .../hellug-keycloak/account/theme.properties | 3 +- .../common/resources/img/brand.svg | 85 - .../common/resources/img/favicon.ico | Bin 2594 -> 627 bytes .../common/resources/lib/angular/errors.json | 1 + .../resources/lib/angular/treeview/LICENSE | 20 + .../resources/lib/angular/treeview/README.md | 122 + .../lib/angular/treeview/angular.treeview.js | 95 + .../angular/treeview/angular.treeview.min.js | 9 + .../angular/treeview/css/angular.treeview.css | 99 + .../lib/angular/treeview/img/file.png | Bin 0 -> 263 bytes .../angular/treeview/img/folder-closed.png | Bin 0 -> 281 bytes .../lib/angular/treeview/img/folder.png | Bin 0 -> 289 bytes .../lib/angular/ui-bootstrap-tpls-0.11.0.js | 4116 +++++++++++++++++ .../common/resources/lib/angular/version.json | 1 + .../resources/lib/filesaver/FileSaver.js | 188 + .../resources/lib/fileupload/FileAPI.min.js | 72 + .../angular-file-upload-html5-shim.js | 25 + .../angular-file-upload-html5-shim.min.js | 2 + .../fileupload/angular-file-upload-shim.js | 215 + .../angular-file-upload-shim.min.js | 2 + .../lib/fileupload/angular-file-upload.js | 156 + .../lib/fileupload/angular-file-upload.min.js | 2 + .../common/resources/lib/pficon/pficon.css | 21 + .../common/resources/lib/pficon/pficon.woff | Bin 0 -> 19456 bytes .../common/resources/lib/pficon/pficon.woff2 | Bin 0 -> 16296 bytes .../common/resources/package-lock.json | 1560 +++++++ .../common/resources/package.json | 29 + .../email/messages/messages_el.properties | 53 + .../email/messages/messages_en.properties | 57 +- themes/hellug-keycloak/email/theme.properties | 3 +- .../login/messages/messages_el.properties | 468 ++ .../login/messages/messages_en.properties | 2 + .../login/resources/css/login-hellug.css | 21 - .../img/feedback-error-arrow-down.png | Bin 513 -> 0 bytes .../resources/img/feedback-error-sign.png | Bin 343 -> 0 bytes .../img/feedback-success-arrow-down.png | Bin 678 -> 0 bytes .../resources/img/feedback-success-sign.png | Bin 410 -> 0 bytes .../img/feedback-warning-arrow-down.png | Bin 513 -> 0 bytes .../resources/img/feedback-warning-sign.png | Bin 646 -> 0 bytes themes/hellug-keycloak/login/theme.properties | 5 +- themes/hellug-keycloak/welcome/index.ftl | 135 + .../welcome/resources/admin-console.png | Bin 0 -> 712 bytes .../welcome/resources/alert.png | Bin 0 -> 6189 bytes .../welcome/resources/bg-login.png | Bin 5040 -> 0 bytes .../hellug-keycloak/welcome/resources/bg.png | Bin 3428 -> 72796 bytes .../hellug-keycloak/welcome/resources/bug.png | Bin 0 -> 1397 bytes .../welcome/resources/css/welcome-hellug.css | 12 - .../welcome/resources/css/welcome.css | 140 + .../welcome/resources/keycloak-project.png | Bin 0 -> 1611 bytes .../welcome/resources/keycloak_logo.png | Bin 0 -> 7539 bytes .../welcome/resources/logo.png | Bin 26839 -> 7539 bytes .../welcome/resources/mail.png | Bin 0 -> 1037 bytes .../welcome/resources/user.png | Bin 0 -> 2423 bytes .../hellug-keycloak/welcome/theme.properties | 5 +- 59 files changed, 8031 insertions(+), 462 deletions(-) create mode 100644 logos/hellug_flat_1.svg create mode 100644 themes/hellug-keycloak/account/messages/messages_el.properties delete mode 100644 themes/hellug-keycloak/account/resources/css/account.css delete mode 100644 themes/hellug-keycloak/account/resources/img/icon-sidebar-active.png delete mode 100644 themes/hellug-keycloak/common/resources/img/brand.svg create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/errors.json create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/treeview/LICENSE create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/treeview/README.md create mode 100755 themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.js create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js create mode 100755 themes/hellug-keycloak/common/resources/lib/angular/treeview/css/angular.treeview.css create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/treeview/img/file.png create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/treeview/img/folder-closed.png create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/treeview/img/folder.png create mode 100644 themes/hellug-keycloak/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js create mode 100755 themes/hellug-keycloak/common/resources/lib/angular/version.json create mode 100644 themes/hellug-keycloak/common/resources/lib/filesaver/FileSaver.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/FileAPI.min.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.js create mode 100644 themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.min.js create mode 100644 themes/hellug-keycloak/common/resources/lib/pficon/pficon.css create mode 100644 themes/hellug-keycloak/common/resources/lib/pficon/pficon.woff create mode 100644 themes/hellug-keycloak/common/resources/lib/pficon/pficon.woff2 create mode 100644 themes/hellug-keycloak/common/resources/package-lock.json create mode 100644 themes/hellug-keycloak/common/resources/package.json create mode 100644 themes/hellug-keycloak/email/messages/messages_el.properties mode change 100755 => 100644 themes/hellug-keycloak/email/messages/messages_en.properties create mode 100644 themes/hellug-keycloak/login/messages/messages_el.properties create mode 100644 themes/hellug-keycloak/login/messages/messages_en.properties delete mode 100644 themes/hellug-keycloak/login/resources/css/login-hellug.css delete mode 100644 themes/hellug-keycloak/login/resources/img/feedback-error-arrow-down.png delete mode 100644 themes/hellug-keycloak/login/resources/img/feedback-error-sign.png delete mode 100644 themes/hellug-keycloak/login/resources/img/feedback-success-arrow-down.png delete mode 100644 themes/hellug-keycloak/login/resources/img/feedback-success-sign.png delete mode 100644 themes/hellug-keycloak/login/resources/img/feedback-warning-arrow-down.png delete mode 100644 themes/hellug-keycloak/login/resources/img/feedback-warning-sign.png create mode 100755 themes/hellug-keycloak/welcome/index.ftl create mode 100644 themes/hellug-keycloak/welcome/resources/admin-console.png create mode 100644 themes/hellug-keycloak/welcome/resources/alert.png delete mode 100644 themes/hellug-keycloak/welcome/resources/bg-login.png create mode 100644 themes/hellug-keycloak/welcome/resources/bug.png delete mode 100644 themes/hellug-keycloak/welcome/resources/css/welcome-hellug.css create mode 100644 themes/hellug-keycloak/welcome/resources/css/welcome.css create mode 100644 themes/hellug-keycloak/welcome/resources/keycloak-project.png create mode 100644 themes/hellug-keycloak/welcome/resources/keycloak_logo.png create mode 100644 themes/hellug-keycloak/welcome/resources/mail.png create mode 100644 themes/hellug-keycloak/welcome/resources/user.png diff --git a/logos/hellug_flat_1.svg b/logos/hellug_flat_1.svg new file mode 100644 index 0000000..27e8bdc --- /dev/null +++ b/logos/hellug_flat_1.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + hellug + + diff --git a/themes/hellug-keycloak/account/messages/messages_el.properties b/themes/hellug-keycloak/account/messages/messages_el.properties new file mode 100644 index 0000000..916d167 --- /dev/null +++ b/themes/hellug-keycloak/account/messages/messages_el.properties @@ -0,0 +1,378 @@ +# encoding: UTF-8 + +role_manage-identity-providers=Διαχείριση παρόχων ταυτότητας +doRemove=Αφαίρεση +doAdd=Προσθήκη +doSignOut=Έξοδος +doLink=Σύνδεση +personalInfoSidebarTitle=Προσωπικά στοιχεία +accountSecuritySidebarTitle=Ασφάλεια λογαριασμού +signingInSidebarTitle=Σε είσοδο +deviceActivitySidebarTitle=Δραστηριότητα συσκευών +role_manage-account-links=Διαχείριση συνδέσεων λογαριασμού +linkedAccountsSidebarTitle=Συνδεδεμένοι λογαριασμοί +editAccountHtmlTitle=Επεξεργασία Λογαριασμού +personalInfoHtmlTitle=Προσωπικά Στοιχεία +changePasswordHtmlTitle=Αλλαγή Κωδικού + + +requiredFields=Απαιτούμενα πεδία +sessionsHtmlTitle=Συνεδρίες +accountManagementTitle=Διαχείριση Λογαριασμού Keycloak +authenticatorTitle=Εφαρμογή Ταυτοποίησης +applicationsHtmlTitle=Εφαρμογές +linkedAccountsHtmlTitle=Συνδεδεμένοι λογαριασμοί +accountManagementWelcomeMessage=Καλώς Ήλθατε στη Διαχείριση Λογαριασμού στο Keycloak +personalInfoIntroMessage=Διαχειριστείτε τα βασικά στοιχεία +accountSecurityIntroMessage=Ελέγξτε το κωδικό και τη πρόσβαση σας +passwordLastUpdateMessage=Ο κωδικός πρόσβασης σας ενημερώθηκε στις +updatePasswordMessageTitle=Βεβαιωθείτε ότι επιλέξατε ένα ισχυρό κωδικό +updatePasswordMessage=Ένας ισχυρός κωδικός πρόσβασης είναι συνδυασμός ψηφίων, γραμμάτων και συμβόλων. Είναι δύσκολο να βρεθεί, δεν είναι υπαρκτή λέξη και το χρησιμοποιείται μόνο σε αυτό το λογαριασμό. +email=Email +firstName=Όνομα +lastName=Επώνυμο +familyName=Επώνυμο +password=Κωδικός Πρόσβασης +passwordConfirm=Επιβεβαίωση +currentPassword=Τρέχων Κωδικός Πρόσβασης +passwordNew=Νέος Κωδικός Πρόσβασης +username=Όνομα χρήστη +address=Διεύθυνση +street=Οδός +locality=Πόλη ή Δήμος +postal_code=Ταχυδρομικός Κώδικας +country=Χώρα +emailVerified=Επιβεβαιωμένο Email +website=Ιστοσελίδα +phoneNumber=Τηλέφωνο +phoneNumberVerified=Επιβεβαιωμένο τηλέφωνο +gender=Φύλο +birthday=Ημερομηνία γέννησης +zoneinfo=Ζώνη ώρας +gssDelegationCredential=GSS διαπιστευτήρια εξουσιοδότησης +profileScopeConsentText=Προφίλ χρήστη +emailScopeConsentText=Διεύθυνση email +addressScopeConsentText=Διεύθυνση +phoneScopeConsentText=Τηλέφωνο +samlRoleListScopeConsentText=Οι Ρόλοι Μου +rolesScopeConsentText=Ρόλοι χρήστη +role_admin=Διαχειριστής +role_view-identity-providers=Εμφάνιση παρόχων ταυτότητας +role_manage-realm=Διαχείριση τομέα +role_manage-users=Διαχείριση χρηστών +role_manage-applications=Διαχείριση εφαρμογών +role_realm-admin=Διαχειριστή Τόπου +role_create-realm=Δημιουργία τομέα +role_view-realm=Εμφάνιση τομέα +role_view-users=Εμφάνιση χρηστών +role_view-applications=Εμφάνιση εφαρμογών +role_view-clients=Εμφάνιση πελατών +role_view-events=Εμφάνιση συμβάντων +role_manage-clients=Διαχείριση πελατών +role_manage-events=Διαχείριση συμβάντων +role_view-profile=Εμφάνιση προφίλ +role_manage-account=Διαχείριση λογαριασμού +role_read-token=Ανάγνωση διακριτικού +role_offline-access=Πρόσβαση εκτός-σύνδεσης +client_account=Λογαριασμός +client_account-console=Κονσόλα Λογαριασμού +client_admin-cli=CLI Διαχείρισης +client_realm-management=Διαχείριση Τομέα +client_broker=Μεσολαβητής +inResource=σε +totpAppFreeOTPName=FreeOTP +totpAppGoogleName=Google Authenticator +totpAppMicrosoftAuthenticatorName=Microsoft Authenticator +invalidEmailMessage=Μη έγκυρη διεύθυνση email. +accountDisabledMessage=Ο λογαριασμός έχει απενεργοποιηθεί, επικοινωνήστε με το διαχειριστή. +consentDenied=Άρνηση Συναίνεσης. +locale_ca=Català +locale_cs=Čeština +locale_de=Deutsch +locale_es=Español +locale_fr=Français +locale_hu=Magyar +locale_it=Italiano +locale_ja=日本語 +locale_lt=Lietuvių +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polski +locale_pt-BR=Português (Brasil) +locale_ru=Русский +locale_sk=Slovenčina +locale_sv=Svenska +locale_tr=Türkçe +locale_zh-CN=中文简体 +locale_fi=Suomi +doSave=Αποθήκευση +doCancel=Ακύρωση +doLogIn=Είσοδος +updatePasswordTitle=Ενημέρωση Κωδικού Πρόσβασης +locale_ar=عربي +authenticatorCode=Κωδικός μίας-χρήσης +locale_en=English +givenName=Όνομα +region=Νομός ή Περιφέρεια +fullName=Ονοματεπώνυμο +offlineAccessScopeConsentText=Πρόσβαση εκτός-σύνδεσης +accountSecurityTitle=Ασφάλεια Λογαριασμού +invalidPasswordGenericMessage=Μη έγκυρος κωδικός πρόσβασης: ο νέος κωδικός δε συμφωνεί με τις πολιτικές κωδικών. +invalidPasswordHistoryMessage=Μη έγκυρος κωδικός πρόσβασης: δε πρέπει να είναι το ίδιο με τους τελευταίους {0} κωδικούς. +invalidPasswordRegexPatternMessage=Μη έγκυρος κωδικός πρόσβασης: δε ταιριάζει με τα μοτίβα regex. +invalidPasswordNotEmailMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να μην είναι ίδιο με το email. +invalidPasswordNotUsernameMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να μην είναι ίδιο με το όνομα χρήστη. +invalidPasswordMinSpecialCharsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} ειδικούς χαρακτήρες. +invalidPasswordMinUpperCaseCharsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} κεφαλαίους χαρακτήρες. +invalidPasswordMinLowerCaseCharsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} πεζούς χαρακτήρες. +invalidPasswordMinDigitsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} ψηφία. +invalidPasswordMaxLengthMessage=Μη έγκυρος κωδικός πρόσβασης: μέγιστο μήκος {0}. +invalidPasswordMinLengthMessage=Μη έγκυρος κωδικός πρόσβασης: ελάχιστο μήκος {0}. +accountPasswordUpdatedMessage=Ο κωδικός πρόσβασης ενημερώθηκε. +accountUpdatedMessage=Ο λογαριασμός σας έχει ενημερωθεί. +emailExistsMessage=Το email υπάρχει ήδη. +usernameExistsMessage=Το όνομα χρήστη υπάρχει ήδη. +invalidTotpMessage=Μη έγκυρος κωδικός μίας χρήσης. +invalidPasswordConfirmMessage=Η επιβεβαίωση του κωδικού πρόσβασης δε ταιριάζει. +invalidPasswordBlacklistedMessage=Μη έγκυρος κωδικός πρόσβασης: ο κωδικός πρόσβασης είναι απαγορευμένος. +invalidPasswordExistingMessage=Μη έγκυρος υπάρχοντας κωδικός πρόσβασης. +error-invalid-date=Μη έγκυρη ημερομηνία. +error-invalid-uri-fragment=Μη έγκυρο κομμάτι URL. +error-invalid-uri-scheme=Μη έγκυρο σχήμα URL. +error-invalid-uri=Μη έγκυρο URL. +error-pattern-no-match=Μη έγκυρη τιμή. +error-invalid-number=Μη έγκυρος αριθμός. +error-invalid-email=Μη έγκυρη διεύθυνση email. +error-empty=Παρακαλώ ορίστε τιμή. +error-invalid-blank=Παρακαλώ ορίστε τιμή. +error-invalid-value=Μη έγκυρη τιμή. +notMatchPasswordMessage=Οι κωδικοί πρόσβασης δε ταιριάζουν. +missingTotpDeviceNameMessage=Παρακαλώ ορίστε όνομα συσκευής. +missingTotpMessage=Παρακαλώ εισάγετε ένα κωδικό από εφαρμογή ταυτοποίησης. +missingPasswordMessage=Παρακαλώ ορίστε κωδικό πρόσβασης. +missingUsernameMessage=Παρακαλώ ορίστε όνομα χρήστη. +missingEmailMessage=Παρακαλώ ορίστε email. +missingLastNameMessage=Παρακαλώ ορίστε επώνυμο. +missingFirstNameMessage=Παρακαλώ ορίστε ένα όνομα. +readOnlyUsernameMessage=Δε μπορείτε να ενημερώσετε το όνομα χρήστη σας καθώς είναι μόνο-για-ανάγνωση. +access-denied-when-idp-auth=Δεν επιτρέπεται η πρόσβαση κατά τη ταυτοποίηση με {0} +accountUnusable=Κάθε μεταγενέστερη χρήση αυτής της εφαρμογής δεν θα είναι δυνατή με αυτό το λογαριασμό +loggingOutImmediately=Άμεση αποσύνδεση σας +errasingData=Διαγραφή όλων των δεδομένων σας +deletingImplies=Η διαγραφή του λογαριασμού σας συνεπάγεται: +irreversibleAction=Αυτή η ενέργεια είναι μη αναστρέψιμη +openshift.scope.list-projects=Εμφάνιση λίστας έργων +openshift.scope.user_full=Πλήρης Πρόσβαση +openshift.scope.user_check-access=Πληροφορίες πρόσβασης χρήστη + +# Openshift messages +openshift.scope.user_info=Πληροφορίες χρήστη +clientNotFoundMessage=Ο πελάτης δε βρέθηκε. +identityProviderAlreadyLinkedMessage=Η ομόσπονδη ταυτότητα που επιστρέφει το {0} είναι ήδη συνδεδεμένη με ένα άλλο χρήστη. +role_view-groups=Εμφάνιση ομάδων +role_uma_authorization=Απόκτηση δικαιωμάτων +client_security-admin-console=κονσόλα διαχειριστή ασφαλείας +allFieldsRequired=Απαιτούνται όλα τα πεδία +backTo=Πίσω στο{0} +date=Ημερομηνία +event=Γεγονός +ip=IP +client=Πελάτης +clients=Πελάτες +details=Λεπτομέρειες +started=Ξεκίνησε +expires=Λήγει +applications=Εφαρμογές +account=Λογαριασμός +federatedIdentity=Ομόσπονδη Ταυτότητα +device-activity=Δραστηριότητα συσκευών +sessions=Συνεδρίες +log=Λογότυπο +application=Εφαρμογή +availableRoles=Διαθέσιμοι Ρόλοι +grantedPersonalInfo=Εκχωρημένες Προσωπικές Πληροφορίες +additionalGrants=Επιπλέον Χορηγήσεις +action=Δράση +doLogOutAllSessions=Έξοδος από όλες τις συνεδρίες +accountLogHtmlTitle=Αρχείο Λογαριασμού +noAccessMessage=Δεν επιτρέπεται η πρόσβαση +deviceActivityHtmlTitle=Δραστηριότητα Συσκευών +federatedIdentitiesHtmlTitle=Ομόσπονδες Ταυτότητες +applicationsIntroMessage=Διαχειριστείτε το δικαίωμα της εφαρμογής σας να έχει πρόσβαση στο λογαριασμό σας +resourceIntroMessage=Μοιράστε τους πόρους σας μεταξύ των μελών της ομάδας +personalSubTitle=Τα Προσωπικά σας Στοιχεία +personalSubMessage=Διαχειριστείτε τα βασικά στοιχεία σας. +role_view-consent=Εμφάνιση εγκρίσεων +role_manage-consent=Διαχείριση εγκρίσεων +backToApplication=« Πίσω στην εφαρμογή +lastAccess=Τελευταία Πρόσβαση +authenticator=Ταυτοποιητής +grantedPermissions=Εκχωρημένα Δικαιώματα +fullAccess=Πλήρης Πρόσβαση +configureAuthenticators=Ρυθμισμένες Εφαρμογές Ταυτοποίησης +mobile=Κινητό +totpStep2=Ανοίξτε την εφαρμογή και σαρώστε την εικόνα του κωδικού: +totpStep3DeviceName=Ορίστε ένα Όνομα Συσκευής για να σας βοηθήσει στη διαχείριση των συσκευών OTP. +totpManualStep2=Ξεκινήστε την εφαρμογή και εισάγετε το κλειδί: +totpUnableToScan=Αδυναμία σάρωσης; +totpScanBarcode=Σάρωση της εικόνας του κωδικού; +totpStep1=Εγκαταστήστε μία από τις παρακάτω εφαρμογές στο κινητό σας: +totpStep3=Δώστε το κωδικό μίας χρήσης όπως εμφανίζεται στην εφαρμογή σας και επιλέξτε το Αποθήκευση για να ολοκληρωθεί η αρχική ρύθμιση. +totp.totp=Χρονικός +totp.hotp=Σειριακός +totpType=Τύπος +totpAlgorithm=Αλγόριθμος +totpDigits=Ψηφία +totpInterval=Διάστημα +totpCounter=Μετρητής +totpDeviceName=Όνομα Συσκευής +offlineToken=Διακριτικό Εκτός Σύνδεσης +revoke=Ανάκληση Χορήγησης +totpManualStep3=Χρησιμοποιείστε τις παρακάτω τιμές ρυθμίσεων αν η εφαρμογή το υποστηρίζει: +invalidUserMessage=Μη έγκυρος χρήστης +updateReadOnlyAttributesRejectedMessage=Απορρίφθηκε η ενημέρωση του μόνο-ανάγνωσης χαρακτηριστικού +readOnlyUserMessage=Δε μπορείτε να ενημερώσετε το λογαριασμό σας καθώς είναι μόνο-για-ανάγνωση. +successTotpMessage=Ενεργοποιήθηκε η εφαρμογή ταυτοποίησης στο κινητό. +successGrantRevokedMessage=Η χορήγηση ανακλήθηκε επιτυχώς. +invalidFederatedIdentityActionMessage=Μη έγκυρη ή απούσα δράση. +identityProviderNotFoundMessage=Δε βρέθηκε ο ορισμένος πάροχος ταυτότητας. +federatedIdentityLinkNotActiveMessage=Αυτή η ταυτότητα δεν είναι πια ενεργή. +identityProviderRedirectErrorMessage=Αποτυχία στην ανακατεύθυνση προς το πάροχο ταυτότητας. +identityProviderRemovedMessage=Ο πάροχος ταυτότητας αφαιρέθηκε επιτυχώς. + +# Authorization +myResources=Οι Πόροι Μου +myResourcesSub=Οι πόροι μου +doDeny=Άρνηση +doRevoke=Ανάκληση +doApprove=Έγκριση +doRemoveSharing=Αφαίρεση Διαμοιρασμού +doRemoveRequest=Αφαίρεση Αίτησης +peopleAccessResource=Άτομα με πρόσβαση σε αυτό το πόρο +resourceNoPermissionsGrantingAccess=Καμιά άδεια που χορηγεί πρόσβαση σε αυτό το πόρο +anyAction=Κάθε δράση +name=Όνομα +scopes=Πεδία +resource=Πόρος +user=Χρήστης +shareWithOthers=Διαμοιρασμός με άλλους +needMyApproval=Χρειάζεται την έγκριση μου +requestsWaitingApproval=Οι αιτήσεις που αναμένουν έγκριση +icon=Εικονίδιο +requestor=Αιτών +owner=Ιδιοκτήτης +permissionRequestion=Αίτηση Άδειας +permission=Άδεια +shares=διαμοιρασμός(οί) +notBeingShared=Αυτός ο πόρος δε διαμοιράζεται. +notHaveAnyResource=Δεν έχετε κανένα πόρο +havePermissionRequestsWaitingForApproval=Έχετε {0} αιτήση(εις) για άδεια σε αναμονή προς έγκριση. +clickHereForDetails=Πατήστε εδώ για λεπτομέρειες. + +# Applications +applicationName=Όνομα +applicationInUse=Μόνο εφαρμογή σε-χρήση +clearAllFilter=Καθαρισμός φίλτρων +activeFilters=Ενεργά φίλτρα +filterByName=Φιλτράρισμα Ανά Όνομα ... +internalApps=Εσωτερικές εφαρμογές +thirdpartyApps=Εφαρμογές Τρίτων +appResults=Αποτελέσματα +authenticatorSubTitle=Ορισμός Ταυτοποίησης Δύο-Παραγόντων +authenticatorMobileTitle=Εφαρμογή Ταυτοποίησης στο Κινητό +authenticatorMobileMessage=Χρησιμοποιείστε μία Εφαρμογή Ταυτοποίησης στο κινητό για να έχετε τους κωδικούς Επιβεβαίωσης σαν ταυτοποίηση δύο-παραγόντων. +authenticatorMobileFinishSetUpMessage=Η εφαρμογή ταυτοποίησης έχει δεθεί με το κινητό σας. +authenticatorActionSetup=Ρύθμιση +authenticatorSMSTitle=Κωδικός SMS +authenticatorSMSFinishSetUpMessage=Μηνύματα κειμένου στέλνονται στο +authenticatorDefaultStatus=Προεπιλογή + +# Linked account +authorizedProvider=Πιστοποιημένος Πάροχος +identityProvider=Πάροχος Ταυτότητας +identityProviderMessage=Για να συνδέσετε το λογαριασμό σας με παρόχους ταυτότητας που έχετε ρυθμίσει +socialLogin=Κοινωνική Είσοδος +userDefined=Ορισμένη από το Χρήστη +removeAccess=Αφαίρεση Πρόσβασης + +#Authenticator +authenticatorStatusMessage=Η ταυτοποίηση δύο-παραγόντων αυτή τη στιγμή είναι +authenticatorFinishSetUpTitle=Η Ταυτοποίηση Δύο Παραγόντων Σας +smscodeIntroMessage=Ορίστε ένα αριθμό τηλεφώνου και ένας κωδικός επιβεβαίωσης θα σταλεί στο κινητό σας. +mobileSetupStep2=Ανοίξτε την εφαρμογή και σαρώστε το κωδικό QR: +scanBarCode=Θέλετε να σαρώσετε το κωδικό QR; +enterBarCode=Εισάγετε το κωδικό μίας-φοράς +doCopy=Αντιγραφή +doFinish=Ολοκλήρωση + +#Authenticator - SMS Code setup +authenticatorSMSCodeSetupTitle=Ρύθμιση Κωδικού SMS +chooseYourCountry=Επιλέξτε τη χώρα σας +enterYourPhoneNumber=Εισάγετε το τηλεφωνικό αριθμό σας +sendVerficationCode=Αποστολή Κωδικού Επιβεβαίωσης +enterYourVerficationCode=Εισάγετε το κωδικό επιβεβαίωσης +realmName=Τομέας +doDownload=Λήψη +doPrint=Εκτύπωση +generateNewBackupCodes=Παραγωγή Νέων Κωδικών Ανάκτησης Ταυτοποίησης +backtoAuthenticatorPage=Πίσω στη Σελίδα Εφαρμογής Ταυτοποίησης + + +#Resources +resources=Πόροι +share=Διαμοιρασμός +sharedwith=Μοιράζεται με +permissionRequests=Αιτήσεις Αδειών +approve=Έγκριση +approveAll=Έγκριση όλων +people=άτομα +perPage=ανά σελίδα +currentPage=Τρέχουσα Σελίδα +sharetheResource=Διαμοιρασμός πόρου +group=Ομάδα +addPeople=Προσθήκη ατόμων στα οποία θα διαμοιράσετε το πόρο σας +myPermissions=Οι Άδειες Μου +waitingforApproval=Αναμονή για έγκριση +anyPermission=Κάθε Άδεια +error-invalid-length-too-short=Το χαρακτηριστικό {0} πρέπει να έχει ελάχιστο μήκος {1}. +error-number-out-of-range-too-small=Το χαρακτηριστικό {0} πρέπει να έχει ελάχιστη τιμή {1}. +error-user-attribute-required=Παρακαλώ ορίστε το χαρακτηριστικό {0}. +error-user-attribute-read-only=Το πεδίο {0} είναι μόνο για ανάγνωση. +error-person-name-invalid-character=Το όνομα περιέχει ένα μη έγκυρο χαρακτήρα. +readOnlyPasswordMessage=Δε μπορείτε να ενημερώσετε το κωδικό πρόσβασης σας καθώς είναι μόνο-για-ανάγνωση. +successTotpRemovedMessage=Αφαιρέθηκε η εφαρμογή ταυτοποίησης στο κινητό. +authenticatorFinishSetUpMessage=Κάθε φορά που συνδέστε στο λογαριασμό σας στο Keycloak, θα πρέπει να παρέχετε ένα κωδικό ταυτοποίησης δύο-παραγόντων. +authenticatorSubMessage=Για να βελτιώσετε τη ασφάλεια του λογαριασμού σας, ενεργοποιήστε τουλάχιστον μια από τις διαθέσιμες μεθόδους ταυτοποίησης δύο-παραγόντων. +authenticatorSMSMessage=Το Keycloak θα στείλει ένα κωδικό Επιβεβαίωσης στο κινητό σαν ταυτοποίηση δύο-παραγόντων. +authenticatorChangePhone=Αλλαγή Τηλεφωνικού Αριθμού + +#Authenticator - Mobile Authenticator setup +authenticatorMobileSetupTitle=Ρύθμιση Εφαρμογής Ταυτοποίησης +mobileSetupStep1=Εγκαταστήστε μία εφαρμογή ταυτοποίησης στο κινητό σας. Υποστηρίζονται οι παρακάτω εφαρμογές. +mobileSetupStep3=Εισάγετε το κωδικό μίας-φοράς που παρήχθει από την εφαρμογή και πατήστε Αποθήκευση για ολοκλήρωση. + +#Authenticator - backup Code setup +authenticatorBackupCodesSetupTitle=Ρύθμιση Κωδικών Ανάκτησης Ταυτοποίησης +sharedwithMe=Μοιράζονται με Εμένα +accessPermissions=Άδειες Πρόσβασης +selectPermission=Επιλογή Άδειας +addTeam=Προσθήκη ομάδας στην οποία θα διαμοιράσετε το πόρο σας +error-invalid-length=Το χαρακτηριστικό {0} πρέπει να έχει μήκος μεταξύ {1} και {2}. +error-number-out-of-range=Το χαρακτηριστικό {0} πρέπει να είναι ένας αριθμός μεταξύ {1} και {2}. +error-number-out-of-range-too-big=Το χαρακτηριστικό {0} πρέπει να έχει μέγιστη τιμή {2}. +error-username-invalid-character=Το όνομα χρήστη περιέχει ένα μη έγκυρο χαρακτήρα. +missingIdentityProviderMessage=Δεν ορίστηκε πάροχος ταυτότητας. +federatedIdentityRemovingLastProviderMessage=Δε μπορείτε να αφαιρέσετε τη τελευταία ομόσπονδη ταυτότητα καθώς δεν έχετε κωδικό πρόσβασης. +staleCodeAccountMessage=Η σελίδα έληξε. Παρακαλώ δοκιμάστε άλλη μια φορά. +accountTemporarilyDisabledMessage=Ο λογαριασμός έχει απενεργοποιηθεί προσωρινά, επικοινωνήστε με το διαχειριστή ή δοκιμάστε αργότερα. +resourceManagedPolicies=Άδειες που χορηγούν πρόσβαση σε αυτό το πόρο +description=Περιγραφή +peopleSharingThisResource=Άτομα που διαμοιράζουν αυτό το πόρο +resourcesSharedWithMe=Πόροι μου διαμοιράζονται με εμένα +noResourcesSharedWithYou=Δε διαμοιράζεται πόρος με εσάς +resourceIsNotBeingShared=Αυτός ο πόρος δεν διαμοιράζεται +applicationType=Τύπος Εφαρμογής +allApps=Όλες οι εφαρμογές +authorizedProviderMessage=Πιστοποιημένοι Πάροχοι που είναι συνδεδεμένοι με το λογαριασμό σας +removeAccessMessage=Πρέπει να χορηγήσετε ξανά πρόσβαση, αν θέλετε να χρησιμοποιήσετε αυτό το λογαριασμό εφαρμογής. +error-invalid-length-too-long=Το χαρακτηριστικό {0} πρέπει να έχει μέγιστο μήκος {2}. diff --git a/themes/hellug-keycloak/account/messages/messages_en.properties b/themes/hellug-keycloak/account/messages/messages_en.properties index 77831f7..bcf622c 100644 --- a/themes/hellug-keycloak/account/messages/messages_en.properties +++ b/themes/hellug-keycloak/account/messages/messages_en.properties @@ -1 +1,2 @@ -accountManagementTitle=Hellug Auth Account Management +# encoding: UTF-8 +locale_el=Ελληνικά diff --git a/themes/hellug-keycloak/account/resources/css/account.css b/themes/hellug-keycloak/account/resources/css/account.css deleted file mode 100644 index 56a0378..0000000 --- a/themes/hellug-keycloak/account/resources/css/account.css +++ /dev/null @@ -1,279 +0,0 @@ -html { - height: 100%; -} - -body { - background-color: #F9F9F9; - margin: 0; - padding: 0; - height: 100%; -} - -header .navbar { - margin-bottom: 0; - min-height: inherit; -} - -.header .container { - position: relative; -} - -.navbar-title { - background-image: url('../img/brand.svg'); - height: 25px; - background-repeat: no-repeat; - width: 172px; - margin: 3px 10px 5px; - text-indent: -99999px; - position: relative; - top: 8px; -} - -.navbar-pf .navbar-utility { - right: 20px; - top: -34px; - font-size: 12px; -} - -.navbar-pf .navbar-utility > li > a { - color: #fff !important; - padding-bottom: 12px; - padding-top: 11px; - border-left: medium none; -} - -.container { - height: 100%; -} - -.content-area { - background-color: #fff; - border-color: #CECECE; - border-style: solid; - border-width: 0 1px; - height: 100%; - padding: 0 30px; -} - -.margin-bottom { - margin-bottom: 10px; -} - -/* Sidebar */ - -.bs-sidebar { - background-color: #f9f9f9; - padding-top: 44px; - padding-right: 0; - padding-left: 0; - z-index: 20; -} -.bs-sidebar ul { - list-style: none; - padding-left: 12px; -} - -.bs-sidebar ul li { - margin-bottom: 0.5em; - margin-left: -1em; -} -.bs-sidebar ul li a { - font-size: 14px; - padding-left: 25px; - color: #4d5258; - line-height: 28px; - display: block; - border-width: 1px 0 1px 1px; - border-style: solid; - border-color: #f9f9f9; -} -.bs-sidebar ul li a:hover, -.bs-sidebar ul li a:focus { - text-decoration: none; - color: #777777; - border-right: 2px solid #aaa; -} -.bs-sidebar ul li.active a { - background-color: #c7e5f0; - border-color: #56bae0; - font-weight: bold; - background-image: url(../img/icon-sidebar-active.png); - background-repeat: no-repeat; - background-position: right center; -} - -.bs-sidebar ul li.active a:hover { - border-right: none; -} - - -.content-area h2 { - font-family: "Open Sans", sans-serif; - font-weight: 100; - font-size: 24px; - margin-bottom: 25px; - margin-top: 25px; -} - -.subtitle { - text-align: right; - margin-top: 30px; - color: #909090; -} - -.required { - color: #CB2915; -} - - -.alert { - margin-top: 30px; - margin-bottom: 0; -} - -.feedback-aligner .alert { - background-position: 1.27273em center; - background-repeat: no-repeat; - border-radius: 2px; - border-width: 1px; - color: #4D5258; - display: inline-block; - font-size: 1.1em; - line-height: 1.4em; - margin: 0; - padding: 0.909091em 3.63636em; - position: relative; - text-align: left; -} -.alert.alert-success { - background-color: #E4F1E1; - border-color: #4B9E39; -} -.alert.alert-error { - background-color: #F8E7E7; - border-color: #B91415; -} -.alert.alert-warning { - background-color: #FEF1E9; - border-color: #F17528; -} -.alert.alert-info { - background-color: #E4F3FA; - border-color: #5994B2; -} - -.form-horizontal { - border-top: 1px solid #E9E8E8; - padding-top: 23px; -} - -.form-horizontal .control-label { - color: #909090; - line-height: 1.4em; - padding-top: 5px; - position: relative; - text-align: right; - width: 100%; -} - -.form-group { - position: relative; -} - -.control-label + .required { - position: absolute; - right: -2px; - top: 0; -} - -#kc-form-buttons { - text-align: right; - margin-top: 10px; -} - -#kc-form-buttons .btn-primary { - float: right; - margin-left: 8px; -} - -/* Authenticator page */ - -ol { - padding-left: 40px; -} - -ol li { - font-size: 13px; - margin-bottom: 10px; - position: relative; -} - -ol li img { - margin-top: 15px; - margin-bottom: 5px; - border: 1px solid #eee; -} - -hr + .form-horizontal { - border: none; - padding-top: 0; -} - -.kc-dropdown{ - position: relative; -} -.kc-dropdown > a{ - display:block; - padding: 11px 10px 12px; - line-height: 12px; - font-size: 12px; - color: #fff !important; - text-decoration: none; -} -.kc-dropdown > a::after{ - content: "\2c5"; - margin-left: 4px; -} -.kc-dropdown:hover > a{ - background-color: rgba(0,0,0,0.2); -} -.kc-dropdown ul li a{ - padding: 1px 11px; - font-size: 12px; - color: #000 !important; - border: 1px solid #fff; - text-decoration: none; - display:block; - line-height: 20px; -} -.kc-dropdown ul li a:hover{ - color: #4d5258; - background-color: #d4edfa; - border-color: #b3d3e7; -} -.kc-dropdown ul{ - position: absolute; - z-index: 2000; - list-style:none; - display:none; - padding: 5px 0px; - margin: 0px; - background-color: #fff !important; - border: 1px solid #b6b6b6; - border-radius: 1px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; - min-width: 100px; -} -.kc-dropdown:hover ul{ - display:block; -} - - -#kc-totp-secret-key { - border: 1px solid #eee; - font-size: 16px; - padding: 10px; - margin: 50px 0; -} diff --git a/themes/hellug-keycloak/account/resources/img/icon-sidebar-active.png b/themes/hellug-keycloak/account/resources/img/icon-sidebar-active.png deleted file mode 100644 index e7b9b082836b728286e1962f7d2efc81ddbe0b71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^;y}#D!3HFcd~W{?q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~-c73FxkIEGZ*N=jIun2<7~^e}_RcjiI`=UK zVCeYHtShu&-DyXLq!)E7W+-p1Ilz&A@c@&Xh}=}&gd+kA7qR+CC9YLuAP#kTzP zOOabP0l+XkKxNbyD diff --git a/themes/hellug-keycloak/account/theme.properties b/themes/hellug-keycloak/account/theme.properties index 89a19bc..df4d0e7 100644 --- a/themes/hellug-keycloak/account/theme.properties +++ b/themes/hellug-keycloak/account/theme.properties @@ -1,3 +1,2 @@ parent=keycloak - -styles=css/account.css +locales=en,el diff --git a/themes/hellug-keycloak/common/resources/img/brand.svg b/themes/hellug-keycloak/common/resources/img/brand.svg deleted file mode 100644 index d82264a..0000000 --- a/themes/hellug-keycloak/common/resources/img/brand.svg +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - Hellug Authentication Service - - - - diff --git a/themes/hellug-keycloak/common/resources/img/favicon.ico b/themes/hellug-keycloak/common/resources/img/favicon.ico index d21bcf39655925e61d857a4542878146b29c29b6..48188dedaaed851f39dcf435d3bde8e0dce753fd 100644 GIT binary patch literal 627 zcmV-(0*w8MP)fnm`u?`7EDZT zU@#004h&*6qDT$3A+1HARIlxQw0Gw~Fqjw}@R{Bx@00f{&kMVRw3Fz%ejPaV7yTE* zFfRVFfUfKNfww^PA5AYAhLPDOVn^Z@5Uq#8eCj{K^1uiH-%|sWPn^Z+JGia8uj_ip zZxduPnQOLfKTs5fNvoYXN5LH&;bDG;iSDDcboJ0G%bfWzLoC#S@B5!sRW1H1Fh4(U zCK8G8Z0;+U=JG_6dl~BMWvaKyqfNox4TZyDm6NS?PHPsf>mtkY)(X?p)044SEDSKQ zTqY7~#q8?iUXO?Cx}0ybNC=-sv&nO(ja);Zsw$GSbv}_!r^h5o;>pJq=GIKi)BxwS zIvtLQX_~mM%k55!1cRzr-Bk6$hn3YADC!p(StiU*sn$CQ!;;MuB0(GzS&ySNfE*{22sK>&cF zD98ZA!^0c7Ty9jX6mNc<6~^+fSY63eDwURie5q8*?sVcL zaG@TFvod&`Xu~G?W|nd+MRD*L$@~KG!VZB$$ zB~cI(1biS02tLqY1dGNZf-bnaJi=?~!Y;C~$nL#&ciA5-%X<+P_H}#i>I!z6{*{^b z%>4G8^ZlIfIlptxy>}J}!z?WMHds9u+PT1T085w7V*N0z3IkkBi(uLk7SFPf#(hz# zd*Mygzo3*gUR#I~~*2!H=ieF z3LhS28ePAMRmv$C>hdxBdH_dj)aX&EVZBiUnaYniRWBCb2%uYCi`E8~Q}r-bus&7R zVdYH`5j7)7u4~4rx(57&^^??2EUq2HlWGyY)eSH-m7t?W2i-r*@Is{s$LEdctJPpb zm52>BJ`~pqpoT^y){Ns!b1T#hJbIg&u(dt_r&f#D1`++uEf{FgVNj=s$xw$OeJeWJ zHArspgEuz9d8-}$ZAKi_`?0#y2c^LYt4WLOHW9hf9(R=5K&ddM-gXC-HZLlzBC2d6CVK2}_Y$hfkH#J!2Aw?^>+8d~ z(+SRb2NV4R=@&<-nhAqOzQ>wK@R238A zUsVZNKP_%0ReE|(P7UozHY{h{c+Vf>SW-)>wRUC7Z{mJsW+3Zb`i_aHUJ>*wl8S%a zK)MK1+;IcXG0YXN6JAvcR1owliaFt#CbEYMyopg>AkwU%Ly2VEDdis%W3=lRYKU8@ zH1UF+OcsuW2(Ius?t*;1G{2&X<-=wz`Ps6+#=jUH{mZR4DV)=M-?*Kfpu`W;+c}IA zuiYCR{qX$gsBCUIZ+SFNI$*}-+l`u)r`T~2U5So*cz#sW^XtB;rPXgp2P&Pvyo$@; z$o$pZm8j?^z84+6yHG>4@#zp(l#x1;WxZg*lP~=tHa7Ox+1hFYC4b{SFX!}+6A5co zl?lJk$oTV)->r$*LnkGCcm8_fAK^(zOrxW_Zr$3S$_{WdDZ@hij~1deO+?pT;ZAJh zxYUD0`7cvb@X3?%`+#L0mnD$-aniqe;?rMTC%X6)3112Mw;Kha@Ku&TxPd-D{oW-K zg!ok?EC_K&Qdz~Z2)4mBYGT_E$X>oFoP;0V=W@CHw+|VJ-p*o!*Z|}E@_9tBNC`;m z2g_`hV9^%I&mKIc@DwNM_qijD?7AOF)Lt)_JHm97ENyU_ujR=iWA|$}eJov!iqaqS zFEo*`sF@SE;JwX0V?X|&-;t(Ic6?CLdhRXB=SZQ#2mKDm*OHKDp8BIvvAfG6DeZGW|-M$1%q%Q$7Up(gd)?>~j?grcDoGKQ3fqA%Bv$l*y zWYu)+p3x5K7RFe}0+=5uVvbA<)-sux`twN9yj#ZBz9Fq20bnVMr&&n to the top of your HTML document. See http://docs.angularjs.org/api/ng.$sce for more information.","unsafe":"Attempting to use an unsafe value in a safe context.","itype":"Attempted to trust a non-string value in a content requiring a string: Context: {0}"},"ngPattern":{"noregexp":"Expected {0} to be a RegExp but was {1}. Element: {2}"},"$controller":{"ctrlfmt":"Badly formed controller string '{0}'. Must match `__name__ as __id__` or `__name__`.","noscp":"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`."},"$parse":{"isecfn":"Referencing Function in Angular expressions is disallowed! Expression: {0}","isecwindow":"Referencing the Window in Angular expressions is disallowed! Expression: {0}","ueoe":"Unexpected end of expression: {0}","isecdom":"Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}","lexerr":"Lexer Error: {0} at column{1} in expression [{2}].","esc":"IMPOSSIBLE","isecobj":"Referencing Object in Angular expressions is disallowed! Expression: {0}","lval":"Trying to assing a value to a non l-value","isecff":"Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}","syntax":"Syntax Error: Token '{0}' {1} at column {2} of the expression [{3}] starting at [{4}].","isecfld":"Attempting to access a disallowed field in Angular expressions! Expression: {0}"},"jqLite":{"offargs":"jqLite#off() does not support the `selector` argument","onargs":"jqLite#on() does not support the `selector` or `eventData` parameters","nosel":"Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element"},"$animate":{"notcsel":"Expecting class selector starting with '.' got '{0}'.","nongcls":"$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the \"{0}\" CSS class."},"$q":{"norslvr":"Expected resolverFn, got '{0}'","qcycle":"Expected promise to be resolved with value other than itself '{0}'"},"$injector":{"pget":"Provider '{0}' must define $get factory method.","cdep":"Circular dependency found: {0}","nomod":"Module '{0}' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.","strictdi":"{0} is not using explicit annotation and cannot be invoked in strict mode","modulerr":"Failed to instantiate module {0} due to:\n{1}","undef":"Provider '{0}' must return a value from $get factory method.","unpr":"Unknown provider: {0}","itkn":"Incorrect injection token! Expected service name as string, got {0}"},"filter":{"notarray":"Expected array but received: {0}"},"ngTransclude":{"orphan":"Illegal use of ngTransclude directive in the template! No parent directive that requires a transclusion found. Element: {0}"},"ngModel":{"nonassign":"Expression '{0}' is non-assignable. Element: {1}","datefmt":"Expected `{0}` to be a date","$asyncValidators":"Expected asynchronous validator to return a promise but got '{0}' instead.","constexpr":"Expected constant expression for `{0}`, but saw `{1}`.","numfmt":"Expected `{0}` to be a number"},"$location":{"nostate":"History API state support is available only in HTML5 mode and only in browsers supporting HTML5 History API","ipthprfx":"Invalid url \"{0}\", missing path prefix \"{1}\".","isrcharg":"The first argument of the `$location#search()` call must be a string or an object.","nobase":"$location in HTML5 mode requires a tag to be present!"},"$cacheFactory":{"iid":"CacheId '{0}' is already taken!"},"$interpolate":{"noconcat":"Error while interpolating: {0}\nStrict Contextual Escaping disallows interpolations that concatenate multiple expressions when a trusted value is required. See http://docs.angularjs.org/api/ng.$sce","interr":"Can't interpolate: {0}\n{1}","nochgmustache":"angular-message-format.js currently does not allow you to use custom start and end symbols for interpolation.","reqcomma":"Expected a comma after the keyword “{0}” at line {1}, column {2} of text “{3}”","untermstr":"The string beginning at line {0}, column {1} is unterminated in text “{2}”","badexpr":"Unexpected operator “{0}” at line {1}, column {2} in text. Was expecting “{3}”. Text: “{4}”","dupvalue":"The choice “{0}” is specified more than once. Duplicate key is at line {1}, column {2} in text “{3}”","unsafe":"Use of select/plural MessageFormat syntax is currently disallowed in a secure context ({0}). At line {1}, column {2} of text “{3}”","reqother":"“other” is a required option.","reqendinterp":"Expecting end of interpolation symbol, “{0}”, at line {1}, column {2} in text “{3}”","reqarg":"Expected one of “plural” or “select” at line {0}, column {1} of text “{2}”","wantstring":"Expected the beginning of a string at line {0}, column {1} in text “{2}”","logicbug":"The messageformat parser has encountered an internal error. Please file a github issue against the AngularJS project and provide this message text that triggers the bug. Text: “{0}”","reqopenbrace":"The plural choice “{0}” must be followed by a message in braces at line {1}, column {2} in text “{3}”","unknarg":"Unsupported keyword “{0}” at line {0}, column {1}. Only “plural” and “select” are currently supported. Text: “{3}”","reqendbrace":"The plural/select choice “{0}” message starting at line {1}, column {2} does not have an ending closing brace. Text “{3}”"},"ngOptions":{"iexp":"Expected expression in form of '_select_ (as _label_)? for (_key_,)?_value_ in _collection_' but got '{0}'. Element: {1}"},"$rootScope":{"inprog":"{0} already in progress","infdig":"{0} $digest() iterations reached. Aborting!\nWatchers fired in the last 5 iterations: {1}"},"$compile":{"noident":"Cannot bind to controller without identifier for directive '{0}'.","selmulti":"Binding to the 'multiple' attribute is not supported. Element: {0}","nodomevents":"Interpolations for HTML DOM event attributes are disallowed. Please use the ng- versions (such as ng-click instead of onclick) instead.","ctreq":"Controller '{0}', required by directive '{1}', can't be found!","nonassign":"Expression '{0}' used with directive '{1}' is non-assignable!","tplrt":"Template for directive '{0}' must have exactly one root element. {1}","iscp":"Invalid {3} for directive '{0}'. Definition: {... {1}: '{2}' ...}","baddir":"Directive name '{0}' is invalid. The name should not contain leading or trailing whitespaces","noctrl":"Cannot bind to controller without directive '{0}'s controller.","multidir":"Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}","tpload":"Failed to load template: {0} (HTTP status: {1} {2})","uterdir":"Unterminated attribute, found '{0}' but no matching '{1}' found."},"$resource":{"badargs":"Expected up to 4 arguments [params, data, success, error], got {0} arguments","badmember":"Dotted member path \"@{0}\" is invalid.","badname":"hasOwnProperty is not a valid parameter name.","badcfg":"Error in resource configuration for action `{0}`. Expected response to contain an {1} but got an {2} (Request: {3} {4})"},"$route":{"norout":"Tried updating route when with no current route"},"$sanitize":{"badparse":"The sanitizer was unable to parse the following block of html: {0}"}}} \ No newline at end of file diff --git a/themes/hellug-keycloak/common/resources/lib/angular/treeview/LICENSE b/themes/hellug-keycloak/common/resources/lib/angular/treeview/LICENSE new file mode 100644 index 0000000..514acd3 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/angular/treeview/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Steve + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/themes/hellug-keycloak/common/resources/lib/angular/treeview/README.md b/themes/hellug-keycloak/common/resources/lib/angular/treeview/README.md new file mode 100644 index 0000000..31c824f --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/angular/treeview/README.md @@ -0,0 +1,122 @@ +Angular Treeview +================ + +Pure [AngularJS](https://www.angularjs.org) based tree menu directive. + +[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/preview.png)](https://jsfiddle.net/eu81273/8LWUc/) + +## Installation + +Copy the script and css into your project and add a script and link tag to your page. + +```html + + +``` + +Add a dependency to your application module. + +```javascript +angular.module('myApp', ['angularTreeview']); +``` + +Add a tree to your application. See [Usage](#usage). + +## Usage + +Attributes of angular treeview are below. + +- angular-treeview: the treeview directive. +- tree-id : each tree's unique id. +- tree-model : the tree model on $scope. +- node-id : each node's id. +- node-label : each node's label. +- node-children: each node's children. + +Here is a simple example. + + +```html +
+
+``` + +Example model: + +```javascript +$scope.treedata = +[ + { "label" : "User", "id" : "role1", "children" : [ + { "label" : "subUser1", "id" : "role11", "children" : [] }, + { "label" : "subUser2", "id" : "role12", "children" : [ + { "label" : "subUser2-1", "id" : "role121", "children" : [ + { "label" : "subUser2-1-1", "id" : "role1211", "children" : [] }, + { "label" : "subUser2-1-2", "id" : "role1212", "children" : [] } + ]} + ]} + ]}, + { "label" : "Admin", "id" : "role2", "children" : [] }, + { "label" : "Guest", "id" : "role3", "children" : [] } +]; +``` + +## Selection + +If tree node is selected, then that selected tree node is saved to $scope."TREE ID".currentNode. By using $watch, the controller can recognize the tree selection. + + +```javascript +$scope.$watch( 'abc.currentNode', function( newObj, oldObj ) { + if( $scope.abc && angular.isObject($scope.abc.currentNode) ) { + console.log( 'Node Selected!!' ); + console.log( $scope.abc.currentNode ); + } +}, false); +``` + +## Examples + +#### Basic example +[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/jsfiddle01.png)](https://jsfiddle.net/eu81273/8LWUc/) + +[jsFiddle - http://jsfiddle.net/eu81273/8LWUc/](https://jsfiddle.net/eu81273/8LWUc/) + +#### Multiple treeview example +[![ScreenShot](https://github.com/eu81273/angular.treeview/raw/master/img/jsfiddle02.png)](https://jsfiddle.net/eu81273/b9Pnw/) + +[jsFiddle - http://jsfiddle.net/eu81273/b9Pnw/](https://jsfiddle.net/eu81273/b9Pnw/) + +## Browser Compatibility + +Same with AngularJS. Safari, Chrome, Firefox, Opera, IE8, IE9 and mobile browsers (Android, Chrome Mobile, iOS Safari). + +## Changelogs + +#### version 0.1.6 +- Fixed the bug that 'null' string appears before each 'div' generated. (Thanks to Iaac) + +#### version 0.1.5 +- support multiple treeview. (Thanks to Axel Pesme) + +#### version 0.1.4 +- prevented memory leaks. + +#### version 0.1.3 +- removed unnecessary codes. + +#### version 0.1.2 +- removed some jQuery dependency. (Issue #2) + +## License + +The MIT License. + +Copyright ⓒ 2013 AHN JAE-HA. + +See [LICENSE](https://github.com/eu81273/angular.treeview/blob/master/LICENSE) diff --git a/themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.js b/themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.js new file mode 100755 index 0000000..2e56cad --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.js @@ -0,0 +1,95 @@ +/* + @license Angular Treeview version 0.1.6 + ⓒ 2013 AHN JAE-HA http://github.com/eu81273/angular.treeview + License: MIT + + + [TREE attribute] + angular-treeview: the treeview directive + tree-id : each tree's unique id. + tree-model : the tree model on $scope. + node-id : each node's id + node-label : each node's label + node-children: each node's children + +
+
+*/ + +(function ( angular ) { + 'use strict'; + + angular.module( 'angularTreeview', [] ).directive( 'treeModel', ['$compile', function( $compile ) { + return { + restrict: 'A', + link: function ( scope, element, attrs ) { + //tree id + var treeId = attrs.treeId; + + //tree model + var treeModel = attrs.treeModel; + + //node id + var nodeId = attrs.nodeId || 'id'; + + //node label + var nodeLabel = attrs.nodeLabel || 'label'; + + //children + var nodeChildren = attrs.nodeChildren || 'children'; + + //tree template + var template = + '
    ' + + '
  • ' + + '' + + '{{node.' + nodeLabel + '}}' + + '
    ' + + '
  • ' + + '
'; + + //check tree id, tree model + if( treeId && treeModel ) { + //root node + if( attrs.angularTreeview ) { + + //create tree object if not exists + scope[treeId] = scope[treeId] || {}; + + //if node head clicks, + scope[treeId].selectNodeHead = scope[treeId].selectNodeHead || function( selectedNode ){ + + //Collapse or Expand + selectedNode.collapsed = !selectedNode.collapsed; + scope[treeId].selectNodeLabel(selectedNode); + }; + + //if node label clicks, + scope[treeId].selectNodeLabel = scope[treeId].selectNodeLabel || function( selectedNode ){ + + //remove highlight from previous node + if( scope[treeId].currentNode && scope[treeId].currentNode.selected ) { + scope[treeId].currentNode.selected = undefined; + } + + //set highlight to selected node + selectedNode.selected = 'selected'; + + //set currentNode + scope[treeId].currentNode = selectedNode; + }; + } + + //Rendering template. + element.html('').append( $compile( template )( scope ) ); + } + } + }; + }]); +})( angular ); diff --git a/themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js b/themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js new file mode 100644 index 0000000..e02a85b --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/angular/treeview/angular.treeview.min.js @@ -0,0 +1,9 @@ +/* + @license Angular Treeview version 0.1.6 + ⓒ 2013 AHN JAE-HA http://github.com/eu81273/angular.treeview + License: MIT +*/ + +(function(f){f.module("angularTreeview",[]).directive("treeModel",function($compile){return{restrict:"A",link:function(b,h,c){var a=c.treeId,g=c.treeModel,e=c.nodeLabel||"label",d=c.nodeChildren||"children",e='
  • {{node.'+e+'}}
    Nn{1`ISV`@iy0WK`GA@ZGfr^Q{|ywBDshb{3C>R|DNig)We7;j%q!9Ja}7}_ zGuAWJGc+*xQnV1Ls?5{HF~q_@`N#kN_7dyg6#nVwKYT?o*@Af$gZ7S1+u2q#x?~?q zWAL1Hk@vurInfPW7a8i#vM|J*wY@EVsIb=8CPGJBozth8;cIT&&89cu6C_TArOaOV zsvtv+;X@XiEBmJXy4KzYB-k?2jTIY$jW*L74G){)!Z!pj3%#L`iUdT1k0gQ7S_~VrE{6o}X)oLYc9i zsh**M!Iz?iKvf-{E{-7<{>eZ7|F?IQSgoKb(OSIY?h|_>w`qr4ANFiLy32t})Zu7= z$%149#%*se+OX`q^5_4-bzBB+<)RU~Vay#YJ9r(+80Bniz2q)4Y>3~eajfm);Z`fQ zGv@;s*<}nR)`;C@*sy;CPHH$418>P78iIN|1ZhV;4m`+Ct6UXE{ZK({e?y85}Sb4q9e0F?+}6aWAK literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js b/themes/hellug-keycloak/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js new file mode 100644 index 0000000..bcca1cd --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/angular/ui-bootstrap-tpls-0.11.0.js @@ -0,0 +1,4116 @@ +/* + * angular-ui-bootstrap + * http://angular-ui.github.io/bootstrap/ + + * Version: 0.11.0 - 2014-05-01 + * License: MIT + */ +angular.module("ui.bootstrap", ["ui.bootstrap.tpls", "ui.bootstrap.transition","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.typeahead"]); +angular.module("ui.bootstrap.tpls", ["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]); +angular.module('ui.bootstrap.transition', []) + +/** + * $transition service provides a consistent interface to trigger CSS 3 transitions and to be informed when they complete. + * @param {DOMElement} element The DOMElement that will be animated. + * @param {string|object|function} trigger The thing that will cause the transition to start: + * - As a string, it represents the css class to be added to the element. + * - As an object, it represents a hash of style attributes to be applied to the element. + * - As a function, it represents a function to be called that will cause the transition to occur. + * @return {Promise} A promise that is resolved when the transition finishes. + */ +.factory('$transition', ['$q', '$timeout', '$rootScope', function($q, $timeout, $rootScope) { + + var $transition = function(element, trigger, options) { + options = options || {}; + var deferred = $q.defer(); + var endEventName = $transition[options.animation ? 'animationEndEventName' : 'transitionEndEventName']; + + var transitionEndHandler = function(event) { + $rootScope.$apply(function() { + element.unbind(endEventName, transitionEndHandler); + deferred.resolve(element); + }); + }; + + if (endEventName) { + element.bind(endEventName, transitionEndHandler); + } + + // Wrap in a timeout to allow the browser time to update the DOM before the transition is to occur + $timeout(function() { + if ( angular.isString(trigger) ) { + element.addClass(trigger); + } else if ( angular.isFunction(trigger) ) { + trigger(element); + } else if ( angular.isObject(trigger) ) { + element.css(trigger); + } + //If browser does not support transitions, instantly resolve + if ( !endEventName ) { + deferred.resolve(element); + } + }); + + // Add our custom cancel function to the promise that is returned + // We can call this if we are about to run a new transition, which we know will prevent this transition from ending, + // i.e. it will therefore never raise a transitionEnd event for that transition + deferred.promise.cancel = function() { + if ( endEventName ) { + element.unbind(endEventName, transitionEndHandler); + } + deferred.reject('Transition cancelled'); + }; + + return deferred.promise; + }; + + // Work out the name of the transitionEnd event + var transElement = document.createElement('trans'); + var transitionEndEventNames = { + 'WebkitTransition': 'webkitTransitionEnd', + 'MozTransition': 'transitionend', + 'OTransition': 'oTransitionEnd', + 'transition': 'transitionend' + }; + var animationEndEventNames = { + 'WebkitTransition': 'webkitAnimationEnd', + 'MozTransition': 'animationend', + 'OTransition': 'oAnimationEnd', + 'transition': 'animationend' + }; + function findEndEventName(endEventNames) { + for (var name in endEventNames){ + if (transElement.style[name] !== undefined) { + return endEventNames[name]; + } + } + } + $transition.transitionEndEventName = findEndEventName(transitionEndEventNames); + $transition.animationEndEventName = findEndEventName(animationEndEventNames); + return $transition; +}]); + +angular.module('ui.bootstrap.collapse', ['ui.bootstrap.transition']) + + .directive('collapse', ['$transition', function ($transition) { + + return { + link: function (scope, element, attrs) { + + var initialAnimSkip = true; + var currentTransition; + + function doTransition(change) { + var newTransition = $transition(element, change); + if (currentTransition) { + currentTransition.cancel(); + } + currentTransition = newTransition; + newTransition.then(newTransitionDone, newTransitionDone); + return newTransition; + + function newTransitionDone() { + // Make sure it's this transition, otherwise, leave it alone. + if (currentTransition === newTransition) { + currentTransition = undefined; + } + } + } + + function expand() { + if (initialAnimSkip) { + initialAnimSkip = false; + expandDone(); + } else { + element.removeClass('collapse').addClass('collapsing'); + doTransition({ height: element[0].scrollHeight + 'px' }).then(expandDone); + } + } + + function expandDone() { + element.removeClass('collapsing'); + element.addClass('collapse in'); + element.css({height: 'auto'}); + } + + function collapse() { + if (initialAnimSkip) { + initialAnimSkip = false; + collapseDone(); + element.css({height: 0}); + } else { + // CSS transitions don't work with height: auto, so we have to manually change the height to a specific value + element.css({ height: element[0].scrollHeight + 'px' }); + //trigger reflow so a browser realizes that height was updated from auto to a specific value + var x = element[0].offsetWidth; + + element.removeClass('collapse in').addClass('collapsing'); + + doTransition({ height: 0 }).then(collapseDone); + } + } + + function collapseDone() { + element.removeClass('collapsing'); + element.addClass('collapse'); + } + + scope.$watch(attrs.collapse, function (shouldCollapse) { + if (shouldCollapse) { + collapse(); + } else { + expand(); + } + }); + } + }; + }]); + +angular.module('ui.bootstrap.accordion', ['ui.bootstrap.collapse']) + +.constant('accordionConfig', { + closeOthers: true +}) + +.controller('AccordionController', ['$scope', '$attrs', 'accordionConfig', function ($scope, $attrs, accordionConfig) { + + // This array keeps track of the accordion groups + this.groups = []; + + // Ensure that all the groups in this accordion are closed, unless close-others explicitly says not to + this.closeOthers = function(openGroup) { + var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers; + if ( closeOthers ) { + angular.forEach(this.groups, function (group) { + if ( group !== openGroup ) { + group.isOpen = false; + } + }); + } + }; + + // This is called from the accordion-group directive to add itself to the accordion + this.addGroup = function(groupScope) { + var that = this; + this.groups.push(groupScope); + + groupScope.$on('$destroy', function (event) { + that.removeGroup(groupScope); + }); + }; + + // This is called from the accordion-group directive when to remove itself + this.removeGroup = function(group) { + var index = this.groups.indexOf(group); + if ( index !== -1 ) { + this.groups.splice(index, 1); + } + }; + +}]) + +// The accordion directive simply sets up the directive controller +// and adds an accordion CSS class to itself element. +.directive('accordion', function () { + return { + restrict:'EA', + controller:'AccordionController', + transclude: true, + replace: false, + templateUrl: 'template/accordion/accordion.html' + }; +}) + +// The accordion-group directive indicates a block of html that will expand and collapse in an accordion +.directive('accordionGroup', function() { + return { + require:'^accordion', // We need this directive to be inside an accordion + restrict:'EA', + transclude:true, // It transcludes the contents of the directive into the template + replace: true, // The element containing the directive will be replaced with the template + templateUrl:'template/accordion/accordion-group.html', + scope: { + heading: '@', // Interpolate the heading attribute onto this scope + isOpen: '=?', + isDisabled: '=?' + }, + controller: function() { + this.setHeading = function(element) { + this.heading = element; + }; + }, + link: function(scope, element, attrs, accordionCtrl) { + accordionCtrl.addGroup(scope); + + scope.$watch('isOpen', function(value) { + if ( value ) { + accordionCtrl.closeOthers(scope); + } + }); + + scope.toggleOpen = function() { + if ( !scope.isDisabled ) { + scope.isOpen = !scope.isOpen; + } + }; + } + }; +}) + +// Use accordion-heading below an accordion-group to provide a heading containing HTML +// +// Heading containing HTML - +// +.directive('accordionHeading', function() { + return { + restrict: 'EA', + transclude: true, // Grab the contents to be used as the heading + template: '', // In effect remove this element! + replace: true, + require: '^accordionGroup', + link: function(scope, element, attr, accordionGroupCtrl, transclude) { + // Pass the heading to the accordion-group controller + // so that it can be transcluded into the right place in the template + // [The second parameter to transclude causes the elements to be cloned so that they work in ng-repeat] + accordionGroupCtrl.setHeading(transclude(scope, function() {})); + } + }; +}) + +// Use in the accordion-group template to indicate where you want the heading to be transcluded +// You must provide the property on the accordion-group controller that will hold the transcluded element +//
    +// +// ... +//
    +.directive('accordionTransclude', function() { + return { + require: '^accordionGroup', + link: function(scope, element, attr, controller) { + scope.$watch(function() { return controller[attr.accordionTransclude]; }, function(heading) { + if ( heading ) { + element.html(''); + element.append(heading); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.alert', []) + +.controller('AlertController', ['$scope', '$attrs', function ($scope, $attrs) { + $scope.closeable = 'close' in $attrs; +}]) + +.directive('alert', function () { + return { + restrict:'EA', + controller:'AlertController', + templateUrl:'template/alert/alert.html', + transclude:true, + replace:true, + scope: { + type: '@', + close: '&' + } + }; +}); + +angular.module('ui.bootstrap.bindHtml', []) + + .directive('bindHtmlUnsafe', function () { + return function (scope, element, attr) { + element.addClass('ng-binding').data('$binding', attr.bindHtmlUnsafe); + scope.$watch(attr.bindHtmlUnsafe, function bindHtmlUnsafeWatchAction(value) { + element.html(value || ''); + }); + }; + }); +angular.module('ui.bootstrap.buttons', []) + +.constant('buttonConfig', { + activeClass: 'active', + toggleEvent: 'click' +}) + +.controller('ButtonsController', ['buttonConfig', function(buttonConfig) { + this.activeClass = buttonConfig.activeClass || 'active'; + this.toggleEvent = buttonConfig.toggleEvent || 'click'; +}]) + +.directive('btnRadio', function () { + return { + require: ['btnRadio', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, scope.$eval(attrs.btnRadio))); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + var isActive = element.hasClass(buttonsCtrl.activeClass); + + if (!isActive || angular.isDefined(attrs.uncheckable)) { + scope.$apply(function () { + ngModelCtrl.$setViewValue(isActive ? null : scope.$eval(attrs.btnRadio)); + ngModelCtrl.$render(); + }); + } + }); + } + }; +}) + +.directive('btnCheckbox', function () { + return { + require: ['btnCheckbox', 'ngModel'], + controller: 'ButtonsController', + link: function (scope, element, attrs, ctrls) { + var buttonsCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + function getTrueValue() { + return getCheckboxValue(attrs.btnCheckboxTrue, true); + } + + function getFalseValue() { + return getCheckboxValue(attrs.btnCheckboxFalse, false); + } + + function getCheckboxValue(attributeValue, defaultValue) { + var val = scope.$eval(attributeValue); + return angular.isDefined(val) ? val : defaultValue; + } + + //model -> UI + ngModelCtrl.$render = function () { + element.toggleClass(buttonsCtrl.activeClass, angular.equals(ngModelCtrl.$modelValue, getTrueValue())); + }; + + //ui->model + element.bind(buttonsCtrl.toggleEvent, function () { + scope.$apply(function () { + ngModelCtrl.$setViewValue(element.hasClass(buttonsCtrl.activeClass) ? getFalseValue() : getTrueValue()); + ngModelCtrl.$render(); + }); + }); + } + }; +}); + +/** +* @ngdoc overview +* @name ui.bootstrap.carousel +* +* @description +* AngularJS version of an image carousel. +* +*/ +angular.module('ui.bootstrap.carousel', ['ui.bootstrap.transition']) +.controller('CarouselController', ['$scope', '$timeout', '$transition', function ($scope, $timeout, $transition) { + var self = this, + slides = self.slides = $scope.slides = [], + currentIndex = -1, + currentTimeout, isPlaying; + self.currentSlide = null; + + var destroyed = false; + /* direction: "prev" or "next" */ + self.select = $scope.select = function(nextSlide, direction) { + var nextIndex = slides.indexOf(nextSlide); + //Decide direction if it's not given + if (direction === undefined) { + direction = nextIndex > currentIndex ? 'next' : 'prev'; + } + if (nextSlide && nextSlide !== self.currentSlide) { + if ($scope.$currentTransition) { + $scope.$currentTransition.cancel(); + //Timeout so ng-class in template has time to fix classes for finished slide + $timeout(goNext); + } else { + goNext(); + } + } + function goNext() { + // Scope has been destroyed, stop here. + if (destroyed) { return; } + //If we have a slide to transition from and we have a transition type and we're allowed, go + if (self.currentSlide && angular.isString(direction) && !$scope.noTransition && nextSlide.$element) { + //We shouldn't do class manip in here, but it's the same weird thing bootstrap does. need to fix sometime + nextSlide.$element.addClass(direction); + var reflow = nextSlide.$element[0].offsetWidth; //force reflow + + //Set all other slides to stop doing their stuff for the new transition + angular.forEach(slides, function(slide) { + angular.extend(slide, {direction: '', entering: false, leaving: false, active: false}); + }); + angular.extend(nextSlide, {direction: direction, active: true, entering: true}); + angular.extend(self.currentSlide||{}, {direction: direction, leaving: true}); + + $scope.$currentTransition = $transition(nextSlide.$element, {}); + //We have to create new pointers inside a closure since next & current will change + (function(next,current) { + $scope.$currentTransition.then( + function(){ transitionDone(next, current); }, + function(){ transitionDone(next, current); } + ); + }(nextSlide, self.currentSlide)); + } else { + transitionDone(nextSlide, self.currentSlide); + } + self.currentSlide = nextSlide; + currentIndex = nextIndex; + //every time you change slides, reset the timer + restartTimer(); + } + function transitionDone(next, current) { + angular.extend(next, {direction: '', active: true, leaving: false, entering: false}); + angular.extend(current||{}, {direction: '', active: false, leaving: false, entering: false}); + $scope.$currentTransition = null; + } + }; + $scope.$on('$destroy', function () { + destroyed = true; + }); + + /* Allow outside people to call indexOf on slides array */ + self.indexOfSlide = function(slide) { + return slides.indexOf(slide); + }; + + $scope.next = function() { + var newIndex = (currentIndex + 1) % slides.length; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'next'); + } + }; + + $scope.prev = function() { + var newIndex = currentIndex - 1 < 0 ? slides.length - 1 : currentIndex - 1; + + //Prevent this user-triggered transition from occurring if there is already one in progress + if (!$scope.$currentTransition) { + return self.select(slides[newIndex], 'prev'); + } + }; + + $scope.isActive = function(slide) { + return self.currentSlide === slide; + }; + + $scope.$watch('interval', restartTimer); + $scope.$on('$destroy', resetTimer); + + function restartTimer() { + resetTimer(); + var interval = +$scope.interval; + if (!isNaN(interval) && interval>=0) { + currentTimeout = $timeout(timerFn, interval); + } + } + + function resetTimer() { + if (currentTimeout) { + $timeout.cancel(currentTimeout); + currentTimeout = null; + } + } + + function timerFn() { + if (isPlaying) { + $scope.next(); + restartTimer(); + } else { + $scope.pause(); + } + } + + $scope.play = function() { + if (!isPlaying) { + isPlaying = true; + restartTimer(); + } + }; + $scope.pause = function() { + if (!$scope.noPause) { + isPlaying = false; + resetTimer(); + } + }; + + self.addSlide = function(slide, element) { + slide.$element = element; + slides.push(slide); + //if this is the first slide or the slide is set to active, select it + if(slides.length === 1 || slide.active) { + self.select(slides[slides.length-1]); + if (slides.length == 1) { + $scope.play(); + } + } else { + slide.active = false; + } + }; + + self.removeSlide = function(slide) { + //get the index of the slide inside the carousel + var index = slides.indexOf(slide); + slides.splice(index, 1); + if (slides.length > 0 && slide.active) { + if (index >= slides.length) { + self.select(slides[index-1]); + } else { + self.select(slides[index]); + } + } else if (currentIndex > index) { + currentIndex--; + } + }; + +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:carousel + * @restrict EA + * + * @description + * Carousel is the outer container for a set of image 'slides' to showcase. + * + * @param {number=} interval The time, in milliseconds, that it will take the carousel to go to the next slide. + * @param {boolean=} noTransition Whether to disable transitions on the carousel. + * @param {boolean=} noPause Whether to disable pausing on the carousel (by default, the carousel interval pauses on hover). + * + * @example + + + + + + + + + + + + + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + + + */ +.directive('carousel', [function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + controller: 'CarouselController', + require: 'carousel', + templateUrl: 'template/carousel/carousel.html', + scope: { + interval: '=', + noTransition: '=', + noPause: '=' + } + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.carousel.directive:slide + * @restrict EA + * + * @description + * Creates a slide inside a {@link ui.bootstrap.carousel.directive:carousel carousel}. Must be placed as a child of a carousel element. + * + * @param {boolean=} active Model binding, whether or not this slide is currently active. + * + * @example + + +
    + + + + + + + Interval, in milliseconds: +
    Enter a negative number to stop the interval. +
    +
    + +function CarouselDemoCtrl($scope) { + $scope.myInterval = 5000; +} + + + .carousel-indicators { + top: auto; + bottom: 15px; + } + +
    +*/ + +.directive('slide', function() { + return { + require: '^carousel', + restrict: 'EA', + transclude: true, + replace: true, + templateUrl: 'template/carousel/slide.html', + scope: { + active: '=?' + }, + link: function (scope, element, attrs, carouselCtrl) { + carouselCtrl.addSlide(scope, element); + //when the scope is destroyed then remove the slide from the current slides array + scope.$on('$destroy', function() { + carouselCtrl.removeSlide(scope); + }); + + scope.$watch('active', function(active) { + if (active) { + carouselCtrl.select(scope); + } + }); + } + }; +}); + +angular.module('ui.bootstrap.dateparser', []) + +.service('dateParser', ['$locale', 'orderByFilter', function($locale, orderByFilter) { + + this.parsers = {}; + + var formatCodeToRegex = { + 'yyyy': { + regex: '\\d{4}', + apply: function(value) { this.year = +value; } + }, + 'yy': { + regex: '\\d{2}', + apply: function(value) { this.year = +value + 2000; } + }, + 'y': { + regex: '\\d{1,4}', + apply: function(value) { this.year = +value; } + }, + 'MMMM': { + regex: $locale.DATETIME_FORMATS.MONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.MONTH.indexOf(value); } + }, + 'MMM': { + regex: $locale.DATETIME_FORMATS.SHORTMONTH.join('|'), + apply: function(value) { this.month = $locale.DATETIME_FORMATS.SHORTMONTH.indexOf(value); } + }, + 'MM': { + regex: '0[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'M': { + regex: '[1-9]|1[0-2]', + apply: function(value) { this.month = value - 1; } + }, + 'dd': { + regex: '[0-2][0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'd': { + regex: '[1-2]?[0-9]{1}|3[0-1]{1}', + apply: function(value) { this.date = +value; } + }, + 'EEEE': { + regex: $locale.DATETIME_FORMATS.DAY.join('|') + }, + 'EEE': { + regex: $locale.DATETIME_FORMATS.SHORTDAY.join('|') + } + }; + + this.createParser = function(format) { + var map = [], regex = format.split(''); + + angular.forEach(formatCodeToRegex, function(data, code) { + var index = format.indexOf(code); + + if (index > -1) { + format = format.split(''); + + regex[index] = '(' + data.regex + ')'; + format[index] = '$'; // Custom symbol to define consumed part of format + for (var i = index + 1, n = index + code.length; i < n; i++) { + regex[i] = ''; + format[i] = '$'; + } + format = format.join(''); + + map.push({ index: index, apply: data.apply }); + } + }); + + return { + regex: new RegExp('^' + regex.join('') + '$'), + map: orderByFilter(map, 'index') + }; + }; + + this.parse = function(input, format) { + if ( !angular.isString(input) ) { + return input; + } + + format = $locale.DATETIME_FORMATS[format] || format; + + if ( !this.parsers[format] ) { + this.parsers[format] = this.createParser(format); + } + + var parser = this.parsers[format], + regex = parser.regex, + map = parser.map, + results = input.match(regex); + + if ( results && results.length ) { + var fields = { year: 1900, month: 0, date: 1, hours: 0 }, dt; + + for( var i = 1, n = results.length; i < n; i++ ) { + var mapper = map[i-1]; + if ( mapper.apply ) { + mapper.apply.call(fields, results[i]); + } + } + + if ( isValid(fields.year, fields.month, fields.date) ) { + dt = new Date( fields.year, fields.month, fields.date, fields.hours); + } + + return dt; + } + }; + + // Check if date is valid for specific month (and year for February). + // Month: 0 = Jan, 1 = Feb, etc + function isValid(year, month, date) { + if ( month === 1 && date > 28) { + return date === 29 && ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); + } + + if ( month === 3 || month === 5 || month === 8 || month === 10) { + return date < 31; + } + + return true; + } +}]); + +angular.module('ui.bootstrap.position', []) + +/** + * A set of utility methods that can be use to retrieve position of DOM elements. + * It is meant to be used where we need to absolute-position DOM elements in + * relation to other, existing elements (this is the case for tooltips, popovers, + * typeahead suggestions etc.). + */ + .factory('$position', ['$document', '$window', function ($document, $window) { + + function getStyle(el, cssprop) { + if (el.currentStyle) { //IE + return el.currentStyle[cssprop]; + } else if ($window.getComputedStyle) { + return $window.getComputedStyle(el)[cssprop]; + } + // finally try and get inline style + return el.style[cssprop]; + } + + /** + * Checks if a given element is statically positioned + * @param element - raw DOM element + */ + function isStaticPositioned(element) { + return (getStyle(element, 'position') || 'static' ) === 'static'; + } + + /** + * returns the closest, non-statically positioned parentOffset of a given element + * @param element + */ + var parentOffsetEl = function (element) { + var docDomEl = $document[0]; + var offsetParent = element.offsetParent || docDomEl; + while (offsetParent && offsetParent !== docDomEl && isStaticPositioned(offsetParent) ) { + offsetParent = offsetParent.offsetParent; + } + return offsetParent || docDomEl; + }; + + return { + /** + * Provides read-only equivalent of jQuery's position function: + * http://api.jquery.com/position/ + */ + position: function (element) { + var elBCR = this.offset(element); + var offsetParentBCR = { top: 0, left: 0 }; + var offsetParentEl = parentOffsetEl(element[0]); + if (offsetParentEl != $document[0]) { + offsetParentBCR = this.offset(angular.element(offsetParentEl)); + offsetParentBCR.top += offsetParentEl.clientTop - offsetParentEl.scrollTop; + offsetParentBCR.left += offsetParentEl.clientLeft - offsetParentEl.scrollLeft; + } + + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: elBCR.top - offsetParentBCR.top, + left: elBCR.left - offsetParentBCR.left + }; + }, + + /** + * Provides read-only equivalent of jQuery's offset function: + * http://api.jquery.com/offset/ + */ + offset: function (element) { + var boundingClientRect = element[0].getBoundingClientRect(); + return { + width: boundingClientRect.width || element.prop('offsetWidth'), + height: boundingClientRect.height || element.prop('offsetHeight'), + top: boundingClientRect.top + ($window.pageYOffset || $document[0].documentElement.scrollTop), + left: boundingClientRect.left + ($window.pageXOffset || $document[0].documentElement.scrollLeft) + }; + }, + + /** + * Provides coordinates for the targetEl in relation to hostEl + */ + positionElements: function (hostEl, targetEl, positionStr, appendToBody) { + + var positionStrParts = positionStr.split('-'); + var pos0 = positionStrParts[0], pos1 = positionStrParts[1] || 'center'; + + var hostElPos, + targetElWidth, + targetElHeight, + targetElPos; + + hostElPos = appendToBody ? this.offset(hostEl) : this.position(hostEl); + + targetElWidth = targetEl.prop('offsetWidth'); + targetElHeight = targetEl.prop('offsetHeight'); + + var shiftWidth = { + center: function () { + return hostElPos.left + hostElPos.width / 2 - targetElWidth / 2; + }, + left: function () { + return hostElPos.left; + }, + right: function () { + return hostElPos.left + hostElPos.width; + } + }; + + var shiftHeight = { + center: function () { + return hostElPos.top + hostElPos.height / 2 - targetElHeight / 2; + }, + top: function () { + return hostElPos.top; + }, + bottom: function () { + return hostElPos.top + hostElPos.height; + } + }; + + switch (pos0) { + case 'right': + targetElPos = { + top: shiftHeight[pos1](), + left: shiftWidth[pos0]() + }; + break; + case 'left': + targetElPos = { + top: shiftHeight[pos1](), + left: hostElPos.left - targetElWidth + }; + break; + case 'bottom': + targetElPos = { + top: shiftHeight[pos0](), + left: shiftWidth[pos1]() + }; + break; + default: + targetElPos = { + top: hostElPos.top - targetElHeight, + left: shiftWidth[pos1]() + }; + break; + } + + return targetElPos; + } + }; + }]); + +angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootstrap.position']) + +.constant('datepickerConfig', { + formatDay: 'dd', + formatMonth: 'MMMM', + formatYear: 'yyyy', + formatDayHeader: 'EEE', + formatDayTitle: 'MMMM yyyy', + formatMonthTitle: 'yyyy', + datepickerMode: 'day', + minMode: 'day', + maxMode: 'year', + showWeeks: true, + startingDay: 0, + yearRange: 20, + minDate: null, + maxDate: null +}) + +.controller('DatepickerController', ['$scope', '$attrs', '$parse', '$interpolate', '$timeout', '$log', 'dateFilter', 'datepickerConfig', function($scope, $attrs, $parse, $interpolate, $timeout, $log, dateFilter, datepickerConfig) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }; // nullModelCtrl; + + // Modes chain + this.modes = ['day', 'month', 'year']; + + // Configuration attributes + angular.forEach(['formatDay', 'formatMonth', 'formatYear', 'formatDayHeader', 'formatDayTitle', 'formatMonthTitle', + 'minMode', 'maxMode', 'showWeeks', 'startingDay', 'yearRange'], function( key, index ) { + self[key] = angular.isDefined($attrs[key]) ? (index < 8 ? $interpolate($attrs[key])($scope.$parent) : $scope.$parent.$eval($attrs[key])) : datepickerConfig[key]; + }); + + // Watchable attributes + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( $attrs[key] ) { + $scope.$parent.$watch($parse($attrs[key]), function(value) { + self[key] = value ? new Date(value) : null; + self.refreshView(); + }); + } else { + self[key] = datepickerConfig[key] ? new Date(datepickerConfig[key]) : null; + } + }); + + $scope.datepickerMode = $scope.datepickerMode || datepickerConfig.datepickerMode; + $scope.uniqueId = 'datepicker-' + $scope.$id + '-' + Math.floor(Math.random() * 10000); + this.activeDate = angular.isDefined($attrs.initDate) ? $scope.$parent.$eval($attrs.initDate) : new Date(); + + $scope.isActive = function(dateObject) { + if (self.compare(dateObject.date, self.activeDate) === 0) { + $scope.activeDateId = dateObject.uid; + return true; + } + return false; + }; + + this.init = function( ngModelCtrl_ ) { + ngModelCtrl = ngModelCtrl_; + + ngModelCtrl.$render = function() { + self.render(); + }; + }; + + this.render = function() { + if ( ngModelCtrl.$modelValue ) { + var date = new Date( ngModelCtrl.$modelValue ), + isValid = !isNaN(date); + + if ( isValid ) { + this.activeDate = date; + } else { + $log.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } + ngModelCtrl.$setValidity('date', isValid); + } + this.refreshView(); + }; + + this.refreshView = function() { + if ( this.element ) { + this._refreshView(); + + var date = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + ngModelCtrl.$setValidity('date-disabled', !date || (this.element && !this.isDisabled(date))); + } + }; + + this.createDateObject = function(date, format) { + var model = ngModelCtrl.$modelValue ? new Date(ngModelCtrl.$modelValue) : null; + return { + date: date, + label: dateFilter(date, format), + selected: model && this.compare(date, model) === 0, + disabled: this.isDisabled(date), + current: this.compare(date, new Date()) === 0 + }; + }; + + this.isDisabled = function( date ) { + return ((this.minDate && this.compare(date, this.minDate) < 0) || (this.maxDate && this.compare(date, this.maxDate) > 0) || ($attrs.dateDisabled && $scope.dateDisabled({date: date, mode: $scope.datepickerMode}))); + }; + + // Split array into smaller arrays + this.split = function(arr, size) { + var arrays = []; + while (arr.length > 0) { + arrays.push(arr.splice(0, size)); + } + return arrays; + }; + + $scope.select = function( date ) { + if ( $scope.datepickerMode === self.minMode ) { + var dt = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : new Date(0, 0, 0, 0, 0, 0, 0); + dt.setFullYear( date.getFullYear(), date.getMonth(), date.getDate() ); + ngModelCtrl.$setViewValue( dt ); + ngModelCtrl.$render(); + } else { + self.activeDate = date; + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) - 1 ]; + } + }; + + $scope.move = function( direction ) { + var year = self.activeDate.getFullYear() + direction * (self.step.years || 0), + month = self.activeDate.getMonth() + direction * (self.step.months || 0); + self.activeDate.setFullYear(year, month, 1); + self.refreshView(); + }; + + $scope.toggleMode = function( direction ) { + direction = direction || 1; + + if (($scope.datepickerMode === self.maxMode && direction === 1) || ($scope.datepickerMode === self.minMode && direction === -1)) { + return; + } + + $scope.datepickerMode = self.modes[ self.modes.indexOf( $scope.datepickerMode ) + direction ]; + }; + + // Key event mapper + $scope.keys = { 13:'enter', 32:'space', 33:'pageup', 34:'pagedown', 35:'end', 36:'home', 37:'left', 38:'up', 39:'right', 40:'down' }; + + var focusElement = function() { + $timeout(function() { + self.element[0].focus(); + }, 0 , false); + }; + + // Listen for focus requests from popup directive + $scope.$on('datepicker.focus', focusElement); + + $scope.keydown = function( evt ) { + var key = $scope.keys[evt.which]; + + if ( !key || evt.shiftKey || evt.altKey ) { + return; + } + + evt.preventDefault(); + evt.stopPropagation(); + + if (key === 'enter' || key === 'space') { + if ( self.isDisabled(self.activeDate)) { + return; // do nothing + } + $scope.select(self.activeDate); + focusElement(); + } else if (evt.ctrlKey && (key === 'up' || key === 'down')) { + $scope.toggleMode(key === 'up' ? 1 : -1); + focusElement(); + } else { + self.handleKeyDown(key, evt); + self.refreshView(); + } + }; +}]) + +.directive( 'datepicker', function () { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/datepicker.html', + scope: { + datepickerMode: '=?', + dateDisabled: '&' + }, + require: ['datepicker', '?^ngModel'], + controller: 'DatepickerController', + link: function(scope, element, attrs, ctrls) { + var datepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + datepickerCtrl.init( ngModelCtrl ); + } + } + }; +}) + +.directive('daypicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/day.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + scope.showWeeks = ctrl.showWeeks; + + ctrl.step = { months: 1 }; + ctrl.element = element; + + var DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + function getDaysInMonth( year, month ) { + return ((month === 1) && (year % 4 === 0) && ((year % 100 !== 0) || (year % 400 === 0))) ? 29 : DAYS_IN_MONTH[month]; + } + + function getDates(startDate, n) { + var dates = new Array(n), current = new Date(startDate), i = 0; + current.setHours(12); // Prevent repeated dates because of timezone bug + while ( i < n ) { + dates[i++] = new Date(current); + current.setDate( current.getDate() + 1 ); + } + return dates; + } + + ctrl._refreshView = function() { + var year = ctrl.activeDate.getFullYear(), + month = ctrl.activeDate.getMonth(), + firstDayOfMonth = new Date(year, month, 1), + difference = ctrl.startingDay - firstDayOfMonth.getDay(), + numDisplayedFromPreviousMonth = (difference > 0) ? 7 - difference : - difference, + firstDate = new Date(firstDayOfMonth); + + if ( numDisplayedFromPreviousMonth > 0 ) { + firstDate.setDate( - numDisplayedFromPreviousMonth + 1 ); + } + + // 42 is the number of days on a six-month calendar + var days = getDates(firstDate, 42); + for (var i = 0; i < 42; i ++) { + days[i] = angular.extend(ctrl.createDateObject(days[i], ctrl.formatDay), { + secondary: days[i].getMonth() !== month, + uid: scope.uniqueId + '-' + i + }); + } + + scope.labels = new Array(7); + for (var j = 0; j < 7; j++) { + scope.labels[j] = { + abbr: dateFilter(days[j].date, ctrl.formatDayHeader), + full: dateFilter(days[j].date, 'EEEE') + }; + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatDayTitle); + scope.rows = ctrl.split(days, 7); + + if ( scope.showWeeks ) { + scope.weekNumbers = []; + var weekNumber = getISO8601WeekNumber( scope.rows[0][0].date ), + numWeeks = scope.rows.length; + while( scope.weekNumbers.push(weekNumber++) < numWeeks ) {} + } + }; + + ctrl.compare = function(date1, date2) { + return (new Date( date1.getFullYear(), date1.getMonth(), date1.getDate() ) - new Date( date2.getFullYear(), date2.getMonth(), date2.getDate() ) ); + }; + + function getISO8601WeekNumber(date) { + var checkDate = new Date(date); + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); // Thursday + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + } + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getDate(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 7; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 7; + } else if (key === 'pageup' || key === 'pagedown') { + var month = ctrl.activeDate.getMonth() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setMonth(month, 1); + date = Math.min(getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()), date); + } else if (key === 'home') { + date = 1; + } else if (key === 'end') { + date = getDaysInMonth(ctrl.activeDate.getFullYear(), ctrl.activeDate.getMonth()); + } + ctrl.activeDate.setDate(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('monthpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/month.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + ctrl.step = { years: 1 }; + ctrl.element = element; + + ctrl._refreshView = function() { + var months = new Array(12), + year = ctrl.activeDate.getFullYear(); + + for ( var i = 0; i < 12; i++ ) { + months[i] = angular.extend(ctrl.createDateObject(new Date(year, i, 1), ctrl.formatMonth), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = dateFilter(ctrl.activeDate, ctrl.formatMonthTitle); + scope.rows = ctrl.split(months, 3); + }; + + ctrl.compare = function(date1, date2) { + return new Date( date1.getFullYear(), date1.getMonth() ) - new Date( date2.getFullYear(), date2.getMonth() ); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getMonth(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 3; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 3; + } else if (key === 'pageup' || key === 'pagedown') { + var year = ctrl.activeDate.getFullYear() + (key === 'pageup' ? - 1 : 1); + ctrl.activeDate.setFullYear(year); + } else if (key === 'home') { + date = 0; + } else if (key === 'end') { + date = 11; + } + ctrl.activeDate.setMonth(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.directive('yearpicker', ['dateFilter', function (dateFilter) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/datepicker/year.html', + require: '^datepicker', + link: function(scope, element, attrs, ctrl) { + var range = ctrl.yearRange; + + ctrl.step = { years: range }; + ctrl.element = element; + + function getStartingYear( year ) { + return parseInt((year - 1) / range, 10) * range + 1; + } + + ctrl._refreshView = function() { + var years = new Array(range); + + for ( var i = 0, start = getStartingYear(ctrl.activeDate.getFullYear()); i < range; i++ ) { + years[i] = angular.extend(ctrl.createDateObject(new Date(start + i, 0, 1), ctrl.formatYear), { + uid: scope.uniqueId + '-' + i + }); + } + + scope.title = [years[0].label, years[range - 1].label].join(' - '); + scope.rows = ctrl.split(years, 5); + }; + + ctrl.compare = function(date1, date2) { + return date1.getFullYear() - date2.getFullYear(); + }; + + ctrl.handleKeyDown = function( key, evt ) { + var date = ctrl.activeDate.getFullYear(); + + if (key === 'left') { + date = date - 1; // up + } else if (key === 'up') { + date = date - 5; // down + } else if (key === 'right') { + date = date + 1; // down + } else if (key === 'down') { + date = date + 5; + } else if (key === 'pageup' || key === 'pagedown') { + date += (key === 'pageup' ? - 1 : 1) * ctrl.step.years; + } else if (key === 'home') { + date = getStartingYear( ctrl.activeDate.getFullYear() ); + } else if (key === 'end') { + date = getStartingYear( ctrl.activeDate.getFullYear() ) + range - 1; + } + ctrl.activeDate.setFullYear(date); + }; + + ctrl.refreshView(); + } + }; +}]) + +.constant('datepickerPopupConfig', { + datepickerPopup: 'yyyy-MM-dd', + currentText: 'Today', + clearText: 'Clear', + closeText: 'Done', + closeOnDateSelection: true, + appendToBody: false, + showButtonBar: true +}) + +.directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', +function ($compile, $parse, $document, $position, dateFilter, dateParser, datepickerPopupConfig) { + return { + restrict: 'EA', + require: 'ngModel', + scope: { + isOpen: '=?', + currentText: '@', + clearText: '@', + closeText: '@', + dateDisabled: '&' + }, + link: function(scope, element, attrs, ngModel) { + var dateFormat, + closeOnDateSelection = angular.isDefined(attrs.closeOnDateSelection) ? scope.$parent.$eval(attrs.closeOnDateSelection) : datepickerPopupConfig.closeOnDateSelection, + appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; + + scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; + + scope.getText = function( key ) { + return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text']; + }; + + attrs.$observe('datepickerPopup', function(value) { + dateFormat = value || datepickerPopupConfig.datepickerPopup; + ngModel.$render(); + }); + + // popup element used to display calendar + var popupEl = angular.element('
    '); + popupEl.attr({ + 'ng-model': 'date', + 'ng-change': 'dateSelection()' + }); + + function cameltoDash( string ){ + return string.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); }); + } + + // datepicker element + var datepickerEl = angular.element(popupEl.children()[0]); + if ( attrs.datepickerOptions ) { + angular.forEach(scope.$parent.$eval(attrs.datepickerOptions), function( value, option ) { + datepickerEl.attr( cameltoDash(option), value ); + }); + } + + angular.forEach(['minDate', 'maxDate'], function( key ) { + if ( attrs[key] ) { + scope.$parent.$watch($parse(attrs[key]), function(value){ + scope[key] = value; + }); + datepickerEl.attr(cameltoDash(key), key); + } + }); + if (attrs.dateDisabled) { + datepickerEl.attr('date-disabled', 'dateDisabled({ date: date, mode: mode })'); + } + + function parseDate(viewValue) { + if (!viewValue) { + ngModel.$setValidity('date', true); + return null; + } else if (angular.isDate(viewValue) && !isNaN(viewValue)) { + ngModel.$setValidity('date', true); + return viewValue; + } else if (angular.isString(viewValue)) { + var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue); + if (isNaN(date)) { + ngModel.$setValidity('date', false); + return undefined; + } else { + ngModel.$setValidity('date', true); + return date; + } + } else { + ngModel.$setValidity('date', false); + return undefined; + } + } + ngModel.$parsers.unshift(parseDate); + + // Inner change + scope.dateSelection = function(dt) { + if (angular.isDefined(dt)) { + scope.date = dt; + } + ngModel.$setViewValue(scope.date); + ngModel.$render(); + + if ( closeOnDateSelection ) { + scope.isOpen = false; + element[0].focus(); + } + }; + + element.bind('input change keyup', function() { + scope.$apply(function() { + scope.date = ngModel.$modelValue; + }); + }); + + // Outter change + ngModel.$render = function() { + var date = ngModel.$viewValue ? dateFilter(ngModel.$viewValue, dateFormat) : ''; + element.val(date); + scope.date = parseDate( ngModel.$modelValue ); + }; + + var documentClickBind = function(event) { + if (scope.isOpen && event.target !== element[0]) { + scope.$apply(function() { + scope.isOpen = false; + }); + } + }; + + var keydown = function(evt, noApply) { + scope.keydown(evt); + }; + element.bind('keydown', keydown); + + scope.keydown = function(evt) { + if (evt.which === 27) { + evt.preventDefault(); + evt.stopPropagation(); + scope.close(); + } else if (evt.which === 40 && !scope.isOpen) { + scope.isOpen = true; + } + }; + + scope.$watch('isOpen', function(value) { + if (value) { + scope.$broadcast('datepicker.focus'); + scope.position = appendToBody ? $position.offset(element) : $position.position(element); + scope.position.top = scope.position.top + element.prop('offsetHeight'); + + $document.bind('click', documentClickBind); + } else { + $document.unbind('click', documentClickBind); + } + }); + + scope.select = function( date ) { + if (date === 'today') { + var today = new Date(); + if (angular.isDate(ngModel.$modelValue)) { + date = new Date(ngModel.$modelValue); + date.setFullYear(today.getFullYear(), today.getMonth(), today.getDate()); + } else { + date = new Date(today.setHours(0, 0, 0, 0)); + } + } + scope.dateSelection( date ); + }; + + scope.close = function() { + scope.isOpen = false; + element[0].focus(); + }; + + var $popup = $compile(popupEl)(scope); + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + + scope.$on('$destroy', function() { + $popup.remove(); + element.unbind('keydown', keydown); + $document.unbind('click', documentClickBind); + }); + } + }; +}]) + +.directive('datepickerPopupWrap', function() { + return { + restrict:'EA', + replace: true, + transclude: true, + templateUrl: 'template/datepicker/popup.html', + link:function (scope, element, attrs) { + element.bind('click', function(event) { + event.preventDefault(); + event.stopPropagation(); + }); + } + }; +}); + +angular.module('ui.bootstrap.dropdown', []) + +.constant('dropdownConfig', { + openClass: 'open' +}) + +.service('dropdownService', ['$document', function($document) { + var openScope = null; + + this.open = function( dropdownScope ) { + if ( !openScope ) { + $document.bind('click', closeDropdown); + $document.bind('keydown', escapeKeyBind); + } + + if ( openScope && openScope !== dropdownScope ) { + openScope.isOpen = false; + } + + openScope = dropdownScope; + }; + + this.close = function( dropdownScope ) { + if ( openScope === dropdownScope ) { + openScope = null; + $document.unbind('click', closeDropdown); + $document.unbind('keydown', escapeKeyBind); + } + }; + + var closeDropdown = function( evt ) { + if (evt && evt.isDefaultPrevented()) { + return; + } + + openScope.$apply(function() { + openScope.isOpen = false; + }); + }; + + var escapeKeyBind = function( evt ) { + if ( evt.which === 27 ) { + openScope.focusToggleElement(); + closeDropdown(); + } + }; +}]) + +.controller('DropdownController', ['$scope', '$attrs', '$parse', 'dropdownConfig', 'dropdownService', '$animate', function($scope, $attrs, $parse, dropdownConfig, dropdownService, $animate) { + var self = this, + scope = $scope.$new(), // create a child scope so we are not polluting original one + openClass = dropdownConfig.openClass, + getIsOpen, + setIsOpen = angular.noop, + toggleInvoker = $attrs.onToggle ? $parse($attrs.onToggle) : angular.noop; + + this.init = function( element ) { + self.$element = element; + + if ( $attrs.isOpen ) { + getIsOpen = $parse($attrs.isOpen); + setIsOpen = getIsOpen.assign; + + $scope.$watch(getIsOpen, function(value) { + scope.isOpen = !!value; + }); + } + }; + + this.toggle = function( open ) { + return scope.isOpen = arguments.length ? !!open : !scope.isOpen; + }; + + // Allow other directives to watch status + this.isOpen = function() { + return scope.isOpen; + }; + + scope.focusToggleElement = function() { + if ( self.toggleElement ) { + self.toggleElement[0].focus(); + } + }; + + scope.$watch('isOpen', function( isOpen, wasOpen ) { + $animate[isOpen ? 'addClass' : 'removeClass'](self.$element, openClass); + + if ( isOpen ) { + scope.focusToggleElement(); + dropdownService.open( scope ); + } else { + dropdownService.close( scope ); + } + + setIsOpen($scope, isOpen); + if (angular.isDefined(isOpen) && isOpen !== wasOpen) { + toggleInvoker($scope, { open: !!isOpen }); + } + }); + + $scope.$on('$locationChangeSuccess', function() { + scope.isOpen = false; + }); + + $scope.$on('$destroy', function() { + scope.$destroy(); + }); +}]) + +.directive('dropdown', function() { + return { + restrict: 'CA', + controller: 'DropdownController', + link: function(scope, element, attrs, dropdownCtrl) { + dropdownCtrl.init( element ); + } + }; +}) + +.directive('dropdownToggle', function() { + return { + restrict: 'CA', + require: '?^dropdown', + link: function(scope, element, attrs, dropdownCtrl) { + if ( !dropdownCtrl ) { + return; + } + + dropdownCtrl.toggleElement = element; + + var toggleDropdown = function(event) { + event.preventDefault(); + + if ( !element.hasClass('disabled') && !attrs.disabled ) { + scope.$apply(function() { + dropdownCtrl.toggle(); + }); + } + }; + + element.bind('click', toggleDropdown); + + // WAI-ARIA + element.attr({ 'aria-haspopup': true, 'aria-expanded': false }); + scope.$watch(dropdownCtrl.isOpen, function( isOpen ) { + element.attr('aria-expanded', !!isOpen); + }); + + scope.$on('$destroy', function() { + element.unbind('click', toggleDropdown); + }); + } + }; +}); + +angular.module('ui.bootstrap.modal', ['ui.bootstrap.transition']) + +/** + * A helper, internal data structure that acts as a map but also allows getting / removing + * elements in the LIFO order + */ + .factory('$$stackedMap', function () { + return { + createNew: function () { + var stack = []; + + return { + add: function (key, value) { + stack.push({ + key: key, + value: value + }); + }, + get: function (key) { + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + return stack[i]; + } + } + }, + keys: function() { + var keys = []; + for (var i = 0; i < stack.length; i++) { + keys.push(stack[i].key); + } + return keys; + }, + top: function () { + return stack[stack.length - 1]; + }, + remove: function (key) { + var idx = -1; + for (var i = 0; i < stack.length; i++) { + if (key == stack[i].key) { + idx = i; + break; + } + } + return stack.splice(idx, 1)[0]; + }, + removeTop: function () { + return stack.splice(stack.length - 1, 1)[0]; + }, + length: function () { + return stack.length; + } + }; + } + }; + }) + +/** + * A helper directive for the $modal service. It creates a backdrop element. + */ + .directive('modalBackdrop', ['$timeout', function ($timeout) { + return { + restrict: 'EA', + replace: true, + templateUrl: 'template/modal/backdrop.html', + link: function (scope) { + + scope.animate = false; + + //trigger CSS transitions + $timeout(function () { + scope.animate = true; + }); + } + }; + }]) + + .directive('modalWindow', ['$modalStack', '$timeout', function ($modalStack, $timeout) { + return { + restrict: 'EA', + scope: { + index: '@', + animate: '=' + }, + replace: true, + transclude: true, + templateUrl: function(tElement, tAttrs) { + return tAttrs.templateUrl || 'template/modal/window.html'; + }, + link: function (scope, element, attrs) { + element.addClass(attrs.windowClass || ''); + scope.size = attrs.size; + + $timeout(function () { + // trigger CSS transitions + scope.animate = true; + // focus a freshly-opened modal + element[0].focus(); + }); + + scope.close = function (evt) { + var modal = $modalStack.getTop(); + if (modal && modal.value.backdrop && modal.value.backdrop != 'static' && (evt.target === evt.currentTarget)) { + evt.preventDefault(); + evt.stopPropagation(); + $modalStack.dismiss(modal.key, 'backdrop click'); + } + }; + } + }; + }]) + + .factory('$modalStack', ['$transition', '$timeout', '$document', '$compile', '$rootScope', '$$stackedMap', + function ($transition, $timeout, $document, $compile, $rootScope, $$stackedMap) { + + var OPENED_MODAL_CLASS = 'modal-open'; + + var backdropDomEl, backdropScope; + var openedWindows = $$stackedMap.createNew(); + var $modalStack = {}; + + function backdropIndex() { + var topBackdropIndex = -1; + var opened = openedWindows.keys(); + for (var i = 0; i < opened.length; i++) { + if (openedWindows.get(opened[i]).value.backdrop) { + topBackdropIndex = i; + } + } + return topBackdropIndex; + } + + $rootScope.$watch(backdropIndex, function(newBackdropIndex){ + if (backdropScope) { + backdropScope.index = newBackdropIndex; + } + }); + + function removeModalWindow(modalInstance) { + + var body = $document.find('body').eq(0); + var modalWindow = openedWindows.get(modalInstance).value; + + //clean up the stack + openedWindows.remove(modalInstance); + + //remove window DOM element + removeAfterAnimate(modalWindow.modalDomEl, modalWindow.modalScope, 300, function() { + modalWindow.modalScope.$destroy(); + body.toggleClass(OPENED_MODAL_CLASS, openedWindows.length() > 0); + checkRemoveBackdrop(); + }); + } + + function checkRemoveBackdrop() { + //remove backdrop if no longer needed + if (backdropDomEl && backdropIndex() == -1) { + var backdropScopeRef = backdropScope; + removeAfterAnimate(backdropDomEl, backdropScope, 150, function () { + backdropScopeRef.$destroy(); + backdropScopeRef = null; + }); + backdropDomEl = undefined; + backdropScope = undefined; + } + } + + function removeAfterAnimate(domEl, scope, emulateTime, done) { + // Closing animation + scope.animate = false; + + var transitionEndEventName = $transition.transitionEndEventName; + if (transitionEndEventName) { + // transition out + var timeout = $timeout(afterAnimating, emulateTime); + + domEl.bind(transitionEndEventName, function () { + $timeout.cancel(timeout); + afterAnimating(); + scope.$apply(); + }); + } else { + // Ensure this call is async + $timeout(afterAnimating, 0); + } + + function afterAnimating() { + if (afterAnimating.done) { + return; + } + afterAnimating.done = true; + + domEl.remove(); + if (done) { + done(); + } + } + } + + $document.bind('keydown', function (evt) { + var modal; + + if (evt.which === 27) { + modal = openedWindows.top(); + if (modal && modal.value.keyboard) { + evt.preventDefault(); + $rootScope.$apply(function () { + $modalStack.dismiss(modal.key, 'escape key press'); + }); + } + } + }); + + $modalStack.open = function (modalInstance, modal) { + + openedWindows.add(modalInstance, { + deferred: modal.deferred, + modalScope: modal.scope, + backdrop: modal.backdrop, + keyboard: modal.keyboard + }); + + var body = $document.find('body').eq(0), + currBackdropIndex = backdropIndex(); + + if (currBackdropIndex >= 0 && !backdropDomEl) { + backdropScope = $rootScope.$new(true); + backdropScope.index = currBackdropIndex; + backdropDomEl = $compile('
    ')(backdropScope); + body.append(backdropDomEl); + } + + var angularDomEl = angular.element('
    '); + angularDomEl.attr({ + 'template-url': modal.windowTemplateUrl, + 'window-class': modal.windowClass, + 'size': modal.size, + 'index': openedWindows.length() - 1, + 'animate': 'animate' + }).html(modal.content); + + var modalDomEl = $compile(angularDomEl)(modal.scope); + openedWindows.top().value.modalDomEl = modalDomEl; + body.append(modalDomEl); + body.addClass(OPENED_MODAL_CLASS); + }; + + $modalStack.close = function (modalInstance, result) { + var modalWindow = openedWindows.get(modalInstance).value; + if (modalWindow) { + modalWindow.deferred.resolve(result); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismiss = function (modalInstance, reason) { + var modalWindow = openedWindows.get(modalInstance).value; + if (modalWindow) { + modalWindow.deferred.reject(reason); + removeModalWindow(modalInstance); + } + }; + + $modalStack.dismissAll = function (reason) { + var topModal = this.getTop(); + while (topModal) { + this.dismiss(topModal.key, reason); + topModal = this.getTop(); + } + }; + + $modalStack.getTop = function () { + return openedWindows.top(); + }; + + return $modalStack; + }]) + + .provider('$modal', function () { + + var $modalProvider = { + options: { + backdrop: true, //can be also false or 'static' + keyboard: true + }, + $get: ['$injector', '$rootScope', '$q', '$http', '$templateCache', '$controller', '$modalStack', + function ($injector, $rootScope, $q, $http, $templateCache, $controller, $modalStack) { + + var $modal = {}; + + function getTemplatePromise(options) { + return options.template ? $q.when(options.template) : + $http.get(options.templateUrl, {cache: $templateCache}).then(function (result) { + return result.data; + }); + } + + function getResolvePromises(resolves) { + var promisesArr = []; + angular.forEach(resolves, function (value, key) { + if (angular.isFunction(value) || angular.isArray(value)) { + promisesArr.push($q.when($injector.invoke(value))); + } + }); + return promisesArr; + } + + $modal.open = function (modalOptions) { + + var modalResultDeferred = $q.defer(); + var modalOpenedDeferred = $q.defer(); + + //prepare an instance of a modal to be injected into controllers and returned to a caller + var modalInstance = { + result: modalResultDeferred.promise, + opened: modalOpenedDeferred.promise, + close: function (result) { + $modalStack.close(modalInstance, result); + }, + dismiss: function (reason) { + $modalStack.dismiss(modalInstance, reason); + } + }; + + //merge and clean up options + modalOptions = angular.extend({}, $modalProvider.options, modalOptions); + modalOptions.resolve = modalOptions.resolve || {}; + + //verify options + if (!modalOptions.template && !modalOptions.templateUrl) { + throw new Error('One of template or templateUrl options is required.'); + } + + var templateAndResolvePromise = + $q.all([getTemplatePromise(modalOptions)].concat(getResolvePromises(modalOptions.resolve))); + + + templateAndResolvePromise.then(function resolveSuccess(tplAndVars) { + + var modalScope = (modalOptions.scope || $rootScope).$new(); + modalScope.$close = modalInstance.close; + modalScope.$dismiss = modalInstance.dismiss; + + var ctrlInstance, ctrlLocals = {}; + var resolveIter = 1; + + //controllers + if (modalOptions.controller) { + ctrlLocals.$scope = modalScope; + ctrlLocals.$modalInstance = modalInstance; + angular.forEach(modalOptions.resolve, function (value, key) { + ctrlLocals[key] = tplAndVars[resolveIter++]; + }); + + ctrlInstance = $controller(modalOptions.controller, ctrlLocals); + } + + $modalStack.open(modalInstance, { + scope: modalScope, + deferred: modalResultDeferred, + content: tplAndVars[0], + backdrop: modalOptions.backdrop, + keyboard: modalOptions.keyboard, + windowClass: modalOptions.windowClass, + windowTemplateUrl: modalOptions.windowTemplateUrl, + size: modalOptions.size + }); + + }, function resolveError(reason) { + modalResultDeferred.reject(reason); + }); + + templateAndResolvePromise.then(function () { + modalOpenedDeferred.resolve(true); + }, function () { + modalOpenedDeferred.reject(false); + }); + + return modalInstance; + }; + + return $modal; + }] + }; + + return $modalProvider; + }); + +angular.module('ui.bootstrap.pagination', []) + +.controller('PaginationController', ['$scope', '$attrs', '$parse', function ($scope, $attrs, $parse) { + var self = this, + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + setNumPages = $attrs.numPages ? $parse($attrs.numPages).assign : angular.noop; + + this.init = function(ngModelCtrl_, config) { + ngModelCtrl = ngModelCtrl_; + this.config = config; + + ngModelCtrl.$render = function() { + self.render(); + }; + + if ($attrs.itemsPerPage) { + $scope.$parent.$watch($parse($attrs.itemsPerPage), function(value) { + self.itemsPerPage = parseInt(value, 10); + $scope.totalPages = self.calculateTotalPages(); + }); + } else { + this.itemsPerPage = config.itemsPerPage; + } + }; + + this.calculateTotalPages = function() { + var totalPages = this.itemsPerPage < 1 ? 1 : Math.ceil($scope.totalItems / this.itemsPerPage); + return Math.max(totalPages || 0, 1); + }; + + this.render = function() { + $scope.page = parseInt(ngModelCtrl.$viewValue, 10) || 1; + }; + + $scope.selectPage = function(page) { + if ( $scope.page !== page && page > 0 && page <= $scope.totalPages) { + ngModelCtrl.$setViewValue(page); + ngModelCtrl.$render(); + } + }; + + $scope.getText = function( key ) { + return $scope[key + 'Text'] || self.config[key + 'Text']; + }; + $scope.noPrevious = function() { + return $scope.page === 1; + }; + $scope.noNext = function() { + return $scope.page === $scope.totalPages; + }; + + $scope.$watch('totalItems', function() { + $scope.totalPages = self.calculateTotalPages(); + }); + + $scope.$watch('totalPages', function(value) { + setNumPages($scope.$parent, value); // Readonly variable + + if ( $scope.page > value ) { + $scope.selectPage(value); + } else { + ngModelCtrl.$render(); + } + }); +}]) + +.constant('paginationConfig', { + itemsPerPage: 10, + boundaryLinks: false, + directionLinks: true, + firstText: 'First', + previousText: 'Previous', + nextText: 'Next', + lastText: 'Last', + rotate: true +}) + +.directive('pagination', ['$parse', 'paginationConfig', function($parse, paginationConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + firstText: '@', + previousText: '@', + nextText: '@', + lastText: '@' + }, + require: ['pagination', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pagination.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + // Setup configuration parameters + var maxSize = angular.isDefined(attrs.maxSize) ? scope.$parent.$eval(attrs.maxSize) : paginationConfig.maxSize, + rotate = angular.isDefined(attrs.rotate) ? scope.$parent.$eval(attrs.rotate) : paginationConfig.rotate; + scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : paginationConfig.boundaryLinks; + scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : paginationConfig.directionLinks; + + paginationCtrl.init(ngModelCtrl, paginationConfig); + + if (attrs.maxSize) { + scope.$parent.$watch($parse(attrs.maxSize), function(value) { + maxSize = parseInt(value, 10); + paginationCtrl.render(); + }); + } + + // Create page object used in template + function makePage(number, text, isActive) { + return { + number: number, + text: text, + active: isActive + }; + } + + function getPages(currentPage, totalPages) { + var pages = []; + + // Default page limits + var startPage = 1, endPage = totalPages; + var isMaxSized = ( angular.isDefined(maxSize) && maxSize < totalPages ); + + // recompute if maxSize + if ( isMaxSized ) { + if ( rotate ) { + // Current page is displayed in the middle of the visible ones + startPage = Math.max(currentPage - Math.floor(maxSize/2), 1); + endPage = startPage + maxSize - 1; + + // Adjust if limit is exceeded + if (endPage > totalPages) { + endPage = totalPages; + startPage = endPage - maxSize + 1; + } + } else { + // Visible pages are paginated with maxSize + startPage = ((Math.ceil(currentPage / maxSize) - 1) * maxSize) + 1; + + // Adjust last page if limit is exceeded + endPage = Math.min(startPage + maxSize - 1, totalPages); + } + } + + // Add page number links + for (var number = startPage; number <= endPage; number++) { + var page = makePage(number, number, number === currentPage); + pages.push(page); + } + + // Add links to move between page sets + if ( isMaxSized && ! rotate ) { + if ( startPage > 1 ) { + var previousPageSet = makePage(startPage - 1, '...', false); + pages.unshift(previousPageSet); + } + + if ( endPage < totalPages ) { + var nextPageSet = makePage(endPage + 1, '...', false); + pages.push(nextPageSet); + } + } + + return pages; + } + + var originalRender = paginationCtrl.render; + paginationCtrl.render = function() { + originalRender(); + if (scope.page > 0 && scope.page <= scope.totalPages) { + scope.pages = getPages(scope.page, scope.totalPages); + } + }; + } + }; +}]) + +.constant('pagerConfig', { + itemsPerPage: 10, + previousText: '« Previous', + nextText: 'Next »', + align: true +}) + +.directive('pager', ['pagerConfig', function(pagerConfig) { + return { + restrict: 'EA', + scope: { + totalItems: '=', + previousText: '@', + nextText: '@' + }, + require: ['pager', '?ngModel'], + controller: 'PaginationController', + templateUrl: 'template/pagination/pager.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var paginationCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if (!ngModelCtrl) { + return; // do nothing if no ng-model + } + + scope.align = angular.isDefined(attrs.align) ? scope.$parent.$eval(attrs.align) : pagerConfig.align; + paginationCtrl.init(ngModelCtrl, pagerConfig); + } + }; +}]); + +/** + * The following features are still outstanding: animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html tooltips, and selector delegation. + */ +angular.module( 'ui.bootstrap.tooltip', [ 'ui.bootstrap.position', 'ui.bootstrap.bindHtml' ] ) + +/** + * The $tooltip service creates tooltip- and popover-like directives as well as + * houses global options for them. + */ +.provider( '$tooltip', function () { + // The default options tooltip and popover. + var defaultOptions = { + placement: 'top', + animation: true, + popupDelay: 0 + }; + + // Default hide triggers for each show trigger + var triggerMap = { + 'mouseenter': 'mouseleave', + 'click': 'click', + 'focus': 'blur' + }; + + // The options specified to the provider globally. + var globalOptions = {}; + + /** + * `options({})` allows global configuration of all tooltips in the + * application. + * + * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { + * // place tooltips left instead of top by default + * $tooltipProvider.options( { placement: 'left' } ); + * }); + */ + this.options = function( value ) { + angular.extend( globalOptions, value ); + }; + + /** + * This allows you to extend the set of trigger mappings available. E.g.: + * + * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); + */ + this.setTriggers = function setTriggers ( triggers ) { + angular.extend( triggerMap, triggers ); + }; + + /** + * This is a helper function for translating camel-case to snake-case. + */ + function snake_case(name){ + var regexp = /[A-Z]/g; + var separator = '-'; + return name.replace(regexp, function(letter, pos) { + return (pos ? separator : '') + letter.toLowerCase(); + }); + } + + /** + * Returns the actual instance of the $tooltip service. + * TODO support multiple triggers + */ + this.$get = [ '$window', '$compile', '$timeout', '$parse', '$document', '$position', '$interpolate', function ( $window, $compile, $timeout, $parse, $document, $position, $interpolate ) { + return function $tooltip ( type, prefix, defaultTriggerShow ) { + var options = angular.extend( {}, defaultOptions, globalOptions ); + + /** + * Returns an object of show and hide triggers. + * + * If a trigger is supplied, + * it is used to show the tooltip; otherwise, it will use the `trigger` + * option passed to the `$tooltipProvider.options` method; else it will + * default to the trigger supplied to this directive factory. + * + * The hide trigger is based on the show trigger. If the `trigger` option + * was passed to the `$tooltipProvider.options` method, it will use the + * mapped trigger from `triggerMap` or the passed trigger if the map is + * undefined; otherwise, it uses the `triggerMap` value of the show + * trigger; else it will just use the show trigger. + */ + function getTriggers ( trigger ) { + var show = trigger || options.trigger || defaultTriggerShow; + var hide = triggerMap[show] || show; + return { + show: show, + hide: hide + }; + } + + var directiveName = snake_case( type ); + + var startSym = $interpolate.startSymbol(); + var endSym = $interpolate.endSymbol(); + var template = + '
    '+ + '
    '; + + return { + restrict: 'EA', + scope: true, + compile: function (tElem, tAttrs) { + var tooltipLinker = $compile( template ); + + return function link ( scope, element, attrs ) { + var tooltip; + var transitionTimeout; + var popupTimeout; + var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : false; + var triggers = getTriggers( undefined ); + var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); + + var positionTooltip = function () { + + var ttPosition = $position.positionElements(element, tooltip, scope.tt_placement, appendToBody); + ttPosition.top += 'px'; + ttPosition.left += 'px'; + + // Now set the calculated positioning. + tooltip.css( ttPosition ); + }; + + // By default, the tooltip is not open. + // TODO add ability to start tooltip opened + scope.tt_isOpen = false; + + function toggleTooltipBind () { + if ( ! scope.tt_isOpen ) { + showTooltipBind(); + } else { + hideTooltipBind(); + } + } + + // Show the tooltip with delay if specified, otherwise show it immediately + function showTooltipBind() { + if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { + return; + } + if ( scope.tt_popupDelay ) { + // Do nothing if the tooltip was already scheduled to pop-up. + // This happens if show is triggered multiple times before any hide is triggered. + if (!popupTimeout) { + popupTimeout = $timeout( show, scope.tt_popupDelay, false ); + popupTimeout.then(function(reposition){reposition();}); + } + } else { + show()(); + } + } + + function hideTooltipBind () { + scope.$apply(function () { + hide(); + }); + } + + // Show the tooltip popup element. + function show() { + + popupTimeout = null; + + // If there is a pending remove transition, we must cancel it, lest the + // tooltip be mysteriously removed. + if ( transitionTimeout ) { + $timeout.cancel( transitionTimeout ); + transitionTimeout = null; + } + + // Don't show empty tooltips. + if ( ! scope.tt_content ) { + return angular.noop; + } + + createTooltip(); + + // Set the initial positioning. + tooltip.css({ top: 0, left: 0, display: 'block' }); + + // Now we add it to the DOM because need some info about it. But it's not + // visible yet anyway. + if ( appendToBody ) { + $document.find( 'body' ).append( tooltip ); + } else { + element.after( tooltip ); + } + + positionTooltip(); + + // And show the tooltip. + scope.tt_isOpen = true; + scope.$digest(); // digest required as $apply is not called + + // Return positioning function as promise callback for correct + // positioning after draw. + return positionTooltip; + } + + // Hide the tooltip popup element. + function hide() { + // First things first: we don't show it anymore. + scope.tt_isOpen = false; + + //if tooltip is going to be shown after delay, we must cancel this + $timeout.cancel( popupTimeout ); + popupTimeout = null; + + // And now we remove it from the DOM. However, if we have animation, we + // need to wait for it to expire beforehand. + // FIXME: this is a placeholder for a port of the transitions library. + if ( scope.tt_animation ) { + if (!transitionTimeout) { + transitionTimeout = $timeout(removeTooltip, 500); + } + } else { + removeTooltip(); + } + } + + function createTooltip() { + // There can only be one tooltip element per directive shown at once. + if (tooltip) { + removeTooltip(); + } + tooltip = tooltipLinker(scope, function () {}); + + // Get contents rendered into the tooltip + scope.$digest(); + } + + function removeTooltip() { + transitionTimeout = null; + if (tooltip) { + tooltip.remove(); + tooltip = null; + } + } + + /** + * Observe the relevant attributes. + */ + attrs.$observe( type, function ( val ) { + scope.tt_content = val; + + if (!val && scope.tt_isOpen ) { + hide(); + } + }); + + attrs.$observe( prefix+'Title', function ( val ) { + scope.tt_title = val; + }); + + attrs.$observe( prefix+'Placement', function ( val ) { + scope.tt_placement = angular.isDefined( val ) ? val : options.placement; + }); + + attrs.$observe( prefix+'PopupDelay', function ( val ) { + var delay = parseInt( val, 10 ); + scope.tt_popupDelay = ! isNaN(delay) ? delay : options.popupDelay; + }); + + var unregisterTriggers = function () { + element.unbind(triggers.show, showTooltipBind); + element.unbind(triggers.hide, hideTooltipBind); + }; + + attrs.$observe( prefix+'Trigger', function ( val ) { + unregisterTriggers(); + + triggers = getTriggers( val ); + + if ( triggers.show === triggers.hide ) { + element.bind( triggers.show, toggleTooltipBind ); + } else { + element.bind( triggers.show, showTooltipBind ); + element.bind( triggers.hide, hideTooltipBind ); + } + }); + + var animation = scope.$eval(attrs[prefix + 'Animation']); + scope.tt_animation = angular.isDefined(animation) ? !!animation : options.animation; + + attrs.$observe( prefix+'AppendToBody', function ( val ) { + appendToBody = angular.isDefined( val ) ? $parse( val )( scope ) : appendToBody; + }); + + // if a tooltip is attached to we need to remove it on + // location change as its parent scope will probably not be destroyed + // by the change. + if ( appendToBody ) { + scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { + if ( scope.tt_isOpen ) { + hide(); + } + }); + } + + // Make sure tooltip is destroyed and removed. + scope.$on('$destroy', function onDestroyTooltip() { + $timeout.cancel( transitionTimeout ); + $timeout.cancel( popupTimeout ); + unregisterTriggers(); + removeTooltip(); + }); + }; + } + }; + }; + }]; +}) + +.directive( 'tooltipPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-popup.html' + }; +}) + +.directive( 'tooltip', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltip', 'tooltip', 'mouseenter' ); +}]) + +.directive( 'tooltipHtmlUnsafePopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/tooltip/tooltip-html-unsafe-popup.html' + }; +}) + +.directive( 'tooltipHtmlUnsafe', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'tooltipHtmlUnsafe', 'tooltip', 'mouseenter' ); +}]); + +/** + * The following features are still outstanding: popup delay, animation as a + * function, placement as a function, inside, support for more triggers than + * just mouse enter/leave, html popovers, and selector delegatation. + */ +angular.module( 'ui.bootstrap.popover', [ 'ui.bootstrap.tooltip' ] ) + +.directive( 'popoverPopup', function () { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'template/popover/popover.html' + }; +}) + +.directive( 'popover', [ '$tooltip', function ( $tooltip ) { + return $tooltip( 'popover', 'popover', 'click' ); +}]); + +angular.module('ui.bootstrap.progressbar', []) + +.constant('progressConfig', { + animate: true, + max: 100 +}) + +.controller('ProgressController', ['$scope', '$attrs', 'progressConfig', function($scope, $attrs, progressConfig) { + var self = this, + animate = angular.isDefined($attrs.animate) ? $scope.$parent.$eval($attrs.animate) : progressConfig.animate; + + this.bars = []; + $scope.max = angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : progressConfig.max; + + this.addBar = function(bar, element) { + if ( !animate ) { + element.css({'transition': 'none'}); + } + + this.bars.push(bar); + + bar.$watch('value', function( value ) { + bar.percent = +(100 * value / $scope.max).toFixed(2); + }); + + bar.$on('$destroy', function() { + element = null; + self.removeBar(bar); + }); + }; + + this.removeBar = function(bar) { + this.bars.splice(this.bars.indexOf(bar), 1); + }; +}]) + +.directive('progress', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + require: 'progress', + scope: {}, + templateUrl: 'template/progressbar/progress.html' + }; +}) + +.directive('bar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + require: '^progress', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/bar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, element); + } + }; +}) + +.directive('progressbar', function() { + return { + restrict: 'EA', + replace: true, + transclude: true, + controller: 'ProgressController', + scope: { + value: '=', + type: '@' + }, + templateUrl: 'template/progressbar/progressbar.html', + link: function(scope, element, attrs, progressCtrl) { + progressCtrl.addBar(scope, angular.element(element.children()[0])); + } + }; +}); +angular.module('ui.bootstrap.rating', []) + +.constant('ratingConfig', { + max: 5, + stateOn: null, + stateOff: null +}) + +.controller('RatingController', ['$scope', '$attrs', 'ratingConfig', function($scope, $attrs, ratingConfig) { + var ngModelCtrl = { $setViewValue: angular.noop }; + + this.init = function(ngModelCtrl_) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + this.stateOn = angular.isDefined($attrs.stateOn) ? $scope.$parent.$eval($attrs.stateOn) : ratingConfig.stateOn; + this.stateOff = angular.isDefined($attrs.stateOff) ? $scope.$parent.$eval($attrs.stateOff) : ratingConfig.stateOff; + + var ratingStates = angular.isDefined($attrs.ratingStates) ? $scope.$parent.$eval($attrs.ratingStates) : + new Array( angular.isDefined($attrs.max) ? $scope.$parent.$eval($attrs.max) : ratingConfig.max ); + $scope.range = this.buildTemplateObjects(ratingStates); + }; + + this.buildTemplateObjects = function(states) { + for (var i = 0, n = states.length; i < n; i++) { + states[i] = angular.extend({ index: i }, { stateOn: this.stateOn, stateOff: this.stateOff }, states[i]); + } + return states; + }; + + $scope.rate = function(value) { + if ( !$scope.readonly && value >= 0 && value <= $scope.range.length ) { + ngModelCtrl.$setViewValue(value); + ngModelCtrl.$render(); + } + }; + + $scope.enter = function(value) { + if ( !$scope.readonly ) { + $scope.value = value; + } + $scope.onHover({value: value}); + }; + + $scope.reset = function() { + $scope.value = ngModelCtrl.$viewValue; + $scope.onLeave(); + }; + + $scope.onKeydown = function(evt) { + if (/(37|38|39|40)/.test(evt.which)) { + evt.preventDefault(); + evt.stopPropagation(); + $scope.rate( $scope.value + (evt.which === 38 || evt.which === 39 ? 1 : -1) ); + } + }; + + this.render = function() { + $scope.value = ngModelCtrl.$viewValue; + }; +}]) + +.directive('rating', function() { + return { + restrict: 'EA', + require: ['rating', 'ngModel'], + scope: { + readonly: '=?', + onHover: '&', + onLeave: '&' + }, + controller: 'RatingController', + templateUrl: 'template/rating/rating.html', + replace: true, + link: function(scope, element, attrs, ctrls) { + var ratingCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + ratingCtrl.init( ngModelCtrl ); + } + } + }; +}); + +/** + * @ngdoc overview + * @name ui.bootstrap.tabs + * + * @description + * AngularJS version of the tabs directive. + */ + +angular.module('ui.bootstrap.tabs', []) + +.controller('TabsetController', ['$scope', function TabsetCtrl($scope) { + var ctrl = this, + tabs = ctrl.tabs = $scope.tabs = []; + + ctrl.select = function(selectedTab) { + angular.forEach(tabs, function(tab) { + if (tab.active && tab !== selectedTab) { + tab.active = false; + tab.onDeselect(); + } + }); + selectedTab.active = true; + selectedTab.onSelect(); + }; + + ctrl.addTab = function addTab(tab) { + tabs.push(tab); + // we can't run the select function on the first tab + // since that would select it twice + if (tabs.length === 1) { + tab.active = true; + } else if (tab.active) { + ctrl.select(tab); + } + }; + + ctrl.removeTab = function removeTab(tab) { + var index = tabs.indexOf(tab); + //Select a new tab if the tab to be removed is selected + if (tab.active && tabs.length > 1) { + //If this is the last tab, select the previous tab. else, the next tab. + var newActiveIndex = index == tabs.length - 1 ? index - 1 : index + 1; + ctrl.select(tabs[newActiveIndex]); + } + tabs.splice(index, 1); + }; +}]) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabset + * @restrict EA + * + * @description + * Tabset is the outer container for the tabs directive + * + * @param {boolean=} vertical Whether or not to use vertical styling for the tabs. + * @param {boolean=} justified Whether or not to use justified styling for the tabs. + * + * @example + + + + First Content! + Second Content! + +
    + + First Vertical Content! + Second Vertical Content! + + + First Justified Content! + Second Justified Content! + +
    +
    + */ +.directive('tabset', function() { + return { + restrict: 'EA', + transclude: true, + replace: true, + scope: { + type: '@' + }, + controller: 'TabsetController', + templateUrl: 'template/tabs/tabset.html', + link: function(scope, element, attrs) { + scope.vertical = angular.isDefined(attrs.vertical) ? scope.$parent.$eval(attrs.vertical) : false; + scope.justified = angular.isDefined(attrs.justified) ? scope.$parent.$eval(attrs.justified) : false; + } + }; +}) + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tab + * @restrict EA + * + * @param {string=} heading The visible heading, or title, of the tab. Set HTML headings with {@link ui.bootstrap.tabs.directive:tabHeading tabHeading}. + * @param {string=} select An expression to evaluate when the tab is selected. + * @param {boolean=} active A binding, telling whether or not this tab is selected. + * @param {boolean=} disabled A binding, telling whether or not this tab is disabled. + * + * @description + * Creates a tab with a heading and content. Must be placed within a {@link ui.bootstrap.tabs.directive:tabset tabset}. + * + * @example + + +
    + + +
    + + First Tab + + Alert me! + Second Tab, with alert callback and html heading! + + + {{item.content}} + + +
    +
    + + function TabsDemoCtrl($scope) { + $scope.items = [ + { title:"Dynamic Title 1", content:"Dynamic Item 0" }, + { title:"Dynamic Title 2", content:"Dynamic Item 1", disabled: true } + ]; + + $scope.alertMe = function() { + setTimeout(function() { + alert("You've selected the alert tab!"); + }); + }; + }; + +
    + */ + +/** + * @ngdoc directive + * @name ui.bootstrap.tabs.directive:tabHeading + * @restrict EA + * + * @description + * Creates an HTML heading for a {@link ui.bootstrap.tabs.directive:tab tab}. Must be placed as a child of a tab element. + * + * @example + + + + + HTML in my titles?! + And some content, too! + + + Icon heading?!? + That's right. + + + + + */ +.directive('tab', ['$parse', function($parse) { + return { + require: '^tabset', + restrict: 'EA', + replace: true, + templateUrl: 'template/tabs/tab.html', + transclude: true, + scope: { + active: '=?', + heading: '@', + onSelect: '&select', //This callback is called in contentHeadingTransclude + //once it inserts the tab's content into the dom + onDeselect: '&deselect' + }, + controller: function() { + //Empty controller so other directives can require being 'under' a tab + }, + compile: function(elm, attrs, transclude) { + return function postLink(scope, elm, attrs, tabsetCtrl) { + scope.$watch('active', function(active) { + if (active) { + tabsetCtrl.select(scope); + } + }); + + scope.disabled = false; + if ( attrs.disabled ) { + scope.$parent.$watch($parse(attrs.disabled), function(value) { + scope.disabled = !! value; + }); + } + + scope.select = function() { + if ( !scope.disabled ) { + scope.active = true; + } + }; + + tabsetCtrl.addTab(scope); + scope.$on('$destroy', function() { + tabsetCtrl.removeTab(scope); + }); + + //We need to transclude later, once the content container is ready. + //when this link happens, we're inside a tab heading. + scope.$transcludeFn = transclude; + }; + } + }; +}]) + +.directive('tabHeadingTransclude', [function() { + return { + restrict: 'A', + require: '^tab', + link: function(scope, elm, attrs, tabCtrl) { + scope.$watch('headingElement', function updateHeadingElement(heading) { + if (heading) { + elm.html(''); + elm.append(heading); + } + }); + } + }; +}]) + +.directive('tabContentTransclude', function() { + return { + restrict: 'A', + require: '^tabset', + link: function(scope, elm, attrs) { + var tab = scope.$eval(attrs.tabContentTransclude); + + //Now our tab is ready to be transcluded: both the tab heading area + //and the tab content area are loaded. Transclude 'em both. + tab.$transcludeFn(tab.$parent, function(contents) { + angular.forEach(contents, function(node) { + if (isTabHeading(node)) { + //Let tabHeadingTransclude know. + tab.headingElement = node; + } else { + elm.append(node); + } + }); + }); + } + }; + function isTabHeading(node) { + return node.tagName && ( + node.hasAttribute('tab-heading') || + node.hasAttribute('data-tab-heading') || + node.tagName.toLowerCase() === 'tab-heading' || + node.tagName.toLowerCase() === 'data-tab-heading' + ); + } +}) + +; + +angular.module('ui.bootstrap.timepicker', []) + +.constant('timepickerConfig', { + hourStep: 1, + minuteStep: 1, + showMeridian: true, + meridians: null, + readonlyInput: false, + mousewheel: true +}) + +.controller('TimepickerController', ['$scope', '$attrs', '$parse', '$log', '$locale', 'timepickerConfig', function($scope, $attrs, $parse, $log, $locale, timepickerConfig) { + var selected = new Date(), + ngModelCtrl = { $setViewValue: angular.noop }, // nullModelCtrl + meridians = angular.isDefined($attrs.meridians) ? $scope.$parent.$eval($attrs.meridians) : timepickerConfig.meridians || $locale.DATETIME_FORMATS.AMPMS; + + this.init = function( ngModelCtrl_, inputs ) { + ngModelCtrl = ngModelCtrl_; + ngModelCtrl.$render = this.render; + + var hoursInputEl = inputs.eq(0), + minutesInputEl = inputs.eq(1); + + var mousewheel = angular.isDefined($attrs.mousewheel) ? $scope.$parent.$eval($attrs.mousewheel) : timepickerConfig.mousewheel; + if ( mousewheel ) { + this.setupMousewheelEvents( hoursInputEl, minutesInputEl ); + } + + $scope.readonlyInput = angular.isDefined($attrs.readonlyInput) ? $scope.$parent.$eval($attrs.readonlyInput) : timepickerConfig.readonlyInput; + this.setupInputEvents( hoursInputEl, minutesInputEl ); + }; + + var hourStep = timepickerConfig.hourStep; + if ($attrs.hourStep) { + $scope.$parent.$watch($parse($attrs.hourStep), function(value) { + hourStep = parseInt(value, 10); + }); + } + + var minuteStep = timepickerConfig.minuteStep; + if ($attrs.minuteStep) { + $scope.$parent.$watch($parse($attrs.minuteStep), function(value) { + minuteStep = parseInt(value, 10); + }); + } + + // 12H / 24H mode + $scope.showMeridian = timepickerConfig.showMeridian; + if ($attrs.showMeridian) { + $scope.$parent.$watch($parse($attrs.showMeridian), function(value) { + $scope.showMeridian = !!value; + + if ( ngModelCtrl.$error.time ) { + // Evaluate from template + var hours = getHoursFromTemplate(), minutes = getMinutesFromTemplate(); + if (angular.isDefined( hours ) && angular.isDefined( minutes )) { + selected.setHours( hours ); + refresh(); + } + } else { + updateTemplate(); + } + }); + } + + // Get $scope.hours in 24H mode if valid + function getHoursFromTemplate ( ) { + var hours = parseInt( $scope.hours, 10 ); + var valid = ( $scope.showMeridian ) ? (hours > 0 && hours < 13) : (hours >= 0 && hours < 24); + if ( !valid ) { + return undefined; + } + + if ( $scope.showMeridian ) { + if ( hours === 12 ) { + hours = 0; + } + if ( $scope.meridian === meridians[1] ) { + hours = hours + 12; + } + } + return hours; + } + + function getMinutesFromTemplate() { + var minutes = parseInt($scope.minutes, 10); + return ( minutes >= 0 && minutes < 60 ) ? minutes : undefined; + } + + function pad( value ) { + return ( angular.isDefined(value) && value.toString().length < 2 ) ? '0' + value : value; + } + + // Respond on mousewheel spin + this.setupMousewheelEvents = function( hoursInputEl, minutesInputEl ) { + var isScrollingUp = function(e) { + if (e.originalEvent) { + e = e.originalEvent; + } + //pick correct delta variable depending on event + var delta = (e.wheelDelta) ? e.wheelDelta : -e.deltaY; + return (e.detail || delta > 0); + }; + + hoursInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementHours() : $scope.decrementHours() ); + e.preventDefault(); + }); + + minutesInputEl.bind('mousewheel wheel', function(e) { + $scope.$apply( (isScrollingUp(e)) ? $scope.incrementMinutes() : $scope.decrementMinutes() ); + e.preventDefault(); + }); + + }; + + this.setupInputEvents = function( hoursInputEl, minutesInputEl ) { + if ( $scope.readonlyInput ) { + $scope.updateHours = angular.noop; + $scope.updateMinutes = angular.noop; + return; + } + + var invalidate = function(invalidHours, invalidMinutes) { + ngModelCtrl.$setViewValue( null ); + ngModelCtrl.$setValidity('time', false); + if (angular.isDefined(invalidHours)) { + $scope.invalidHours = invalidHours; + } + if (angular.isDefined(invalidMinutes)) { + $scope.invalidMinutes = invalidMinutes; + } + }; + + $scope.updateHours = function() { + var hours = getHoursFromTemplate(); + + if ( angular.isDefined(hours) ) { + selected.setHours( hours ); + refresh( 'h' ); + } else { + invalidate(true); + } + }; + + hoursInputEl.bind('blur', function(e) { + if ( !$scope.invalidHours && $scope.hours < 10) { + $scope.$apply( function() { + $scope.hours = pad( $scope.hours ); + }); + } + }); + + $scope.updateMinutes = function() { + var minutes = getMinutesFromTemplate(); + + if ( angular.isDefined(minutes) ) { + selected.setMinutes( minutes ); + refresh( 'm' ); + } else { + invalidate(undefined, true); + } + }; + + minutesInputEl.bind('blur', function(e) { + if ( !$scope.invalidMinutes && $scope.minutes < 10 ) { + $scope.$apply( function() { + $scope.minutes = pad( $scope.minutes ); + }); + } + }); + + }; + + this.render = function() { + var date = ngModelCtrl.$modelValue ? new Date( ngModelCtrl.$modelValue ) : null; + + if ( isNaN(date) ) { + ngModelCtrl.$setValidity('time', false); + $log.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.'); + } else { + if ( date ) { + selected = date; + } + makeValid(); + updateTemplate(); + } + }; + + // Call internally when we know that model is valid. + function refresh( keyboardChange ) { + makeValid(); + ngModelCtrl.$setViewValue( new Date(selected) ); + updateTemplate( keyboardChange ); + } + + function makeValid() { + ngModelCtrl.$setValidity('time', true); + $scope.invalidHours = false; + $scope.invalidMinutes = false; + } + + function updateTemplate( keyboardChange ) { + var hours = selected.getHours(), minutes = selected.getMinutes(); + + if ( $scope.showMeridian ) { + hours = ( hours === 0 || hours === 12 ) ? 12 : hours % 12; // Convert 24 to 12 hour system + } + + $scope.hours = keyboardChange === 'h' ? hours : pad(hours); + $scope.minutes = keyboardChange === 'm' ? minutes : pad(minutes); + $scope.meridian = selected.getHours() < 12 ? meridians[0] : meridians[1]; + } + + function addMinutes( minutes ) { + var dt = new Date( selected.getTime() + minutes * 60000 ); + selected.setHours( dt.getHours(), dt.getMinutes() ); + refresh(); + } + + $scope.incrementHours = function() { + addMinutes( hourStep * 60 ); + }; + $scope.decrementHours = function() { + addMinutes( - hourStep * 60 ); + }; + $scope.incrementMinutes = function() { + addMinutes( minuteStep ); + }; + $scope.decrementMinutes = function() { + addMinutes( - minuteStep ); + }; + $scope.toggleMeridian = function() { + addMinutes( 12 * 60 * (( selected.getHours() < 12 ) ? 1 : -1) ); + }; +}]) + +.directive('timepicker', function () { + return { + restrict: 'EA', + require: ['timepicker', '?^ngModel'], + controller:'TimepickerController', + replace: true, + scope: {}, + templateUrl: 'template/timepicker/timepicker.html', + link: function(scope, element, attrs, ctrls) { + var timepickerCtrl = ctrls[0], ngModelCtrl = ctrls[1]; + + if ( ngModelCtrl ) { + timepickerCtrl.init( ngModelCtrl, element.find('input') ); + } + } + }; +}); + +angular.module('ui.bootstrap.typeahead', ['ui.bootstrap.position', 'ui.bootstrap.bindHtml']) + +/** + * A helper service that can parse typeahead's syntax (string provided by users) + * Extracted to a separate service for ease of unit testing + */ + .factory('typeaheadParser', ['$parse', function ($parse) { + + // 00000111000000000000022200000000000000003333333333333330000000000044000 + var TYPEAHEAD_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+(.*)$/; + + return { + parse:function (input) { + + var match = input.match(TYPEAHEAD_REGEXP); + if (!match) { + throw new Error( + 'Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_"' + + ' but got "' + input + '".'); + } + + return { + itemName:match[3], + source:$parse(match[4]), + viewMapper:$parse(match[2] || match[1]), + modelMapper:$parse(match[1]) + }; + } + }; +}]) + + .directive('typeahead', ['$compile', '$parse', '$q', '$timeout', '$document', '$position', 'typeaheadParser', + function ($compile, $parse, $q, $timeout, $document, $position, typeaheadParser) { + + var HOT_KEYS = [9, 13, 27, 38, 40]; + + return { + require:'ngModel', + link:function (originalScope, element, attrs, modelCtrl) { + + //SUPPORTED ATTRIBUTES (OPTIONS) + + //minimal no of characters that needs to be entered before typeahead kicks-in + var minSearch = originalScope.$eval(attrs.typeaheadMinLength) || 1; + + //minimal wait time after last character typed before typehead kicks-in + var waitTime = originalScope.$eval(attrs.typeaheadWaitMs) || 0; + + //should it restrict model values to the ones selected from the popup only? + var isEditable = originalScope.$eval(attrs.typeaheadEditable) !== false; + + //binding to a variable that indicates if matches are being retrieved asynchronously + var isLoadingSetter = $parse(attrs.typeaheadLoading).assign || angular.noop; + + //a callback executed when a match is selected + var onSelectCallback = $parse(attrs.typeaheadOnSelect); + + var inputFormatter = attrs.typeaheadInputFormatter ? $parse(attrs.typeaheadInputFormatter) : undefined; + + var appendToBody = attrs.typeaheadAppendToBody ? originalScope.$eval(attrs.typeaheadAppendToBody) : false; + + //INTERNAL VARIABLES + + //model setter executed upon match selection + var $setModelValue = $parse(attrs.ngModel).assign; + + //expressions used by typeahead + var parserResult = typeaheadParser.parse(attrs.typeahead); + + var hasFocus; + + //create a child scope for the typeahead directive so we are not polluting original scope + //with typeahead-specific data (matches, query etc.) + var scope = originalScope.$new(); + originalScope.$on('$destroy', function(){ + scope.$destroy(); + }); + + // WAI-ARIA + var popupId = 'typeahead-' + scope.$id + '-' + Math.floor(Math.random() * 10000); + element.attr({ + 'aria-autocomplete': 'list', + 'aria-expanded': false, + 'aria-owns': popupId + }); + + //pop-up element used to display matches + var popUpEl = angular.element('
    '); + popUpEl.attr({ + id: popupId, + matches: 'matches', + active: 'activeIdx', + select: 'select(activeIdx)', + query: 'query', + position: 'position' + }); + //custom item template + if (angular.isDefined(attrs.typeaheadTemplateUrl)) { + popUpEl.attr('template-url', attrs.typeaheadTemplateUrl); + } + + var resetMatches = function() { + scope.matches = []; + scope.activeIdx = -1; + element.attr('aria-expanded', false); + }; + + var getMatchId = function(index) { + return popupId + '-option-' + index; + }; + + // Indicate that the specified match is the active (pre-selected) item in the list owned by this typeahead. + // This attribute is added or removed automatically when the `activeIdx` changes. + scope.$watch('activeIdx', function(index) { + if (index < 0) { + element.removeAttr('aria-activedescendant'); + } else { + element.attr('aria-activedescendant', getMatchId(index)); + } + }); + + var getMatchesAsync = function(inputValue) { + + var locals = {$viewValue: inputValue}; + isLoadingSetter(originalScope, true); + $q.when(parserResult.source(originalScope, locals)).then(function(matches) { + + //it might happen that several async queries were in progress if a user were typing fast + //but we are interested only in responses that correspond to the current view value + var onCurrentRequest = (inputValue === modelCtrl.$viewValue); + if (onCurrentRequest && hasFocus) { + if (matches.length > 0) { + + scope.activeIdx = 0; + scope.matches.length = 0; + + //transform labels + for(var i=0; i= minSearch) { + if (waitTime > 0) { + if (timeoutPromise) { + $timeout.cancel(timeoutPromise);//cancel previous timeout + } + timeoutPromise = $timeout(function () { + getMatchesAsync(inputValue); + }, waitTime); + } else { + getMatchesAsync(inputValue); + } + } else { + isLoadingSetter(originalScope, false); + resetMatches(); + } + + if (isEditable) { + return inputValue; + } else { + if (!inputValue) { + // Reset in case user had typed something previously. + modelCtrl.$setValidity('editable', true); + return inputValue; + } else { + modelCtrl.$setValidity('editable', false); + return undefined; + } + } + }); + + modelCtrl.$formatters.push(function (modelValue) { + + var candidateViewValue, emptyViewValue; + var locals = {}; + + if (inputFormatter) { + + locals['$model'] = modelValue; + return inputFormatter(originalScope, locals); + + } else { + + //it might happen that we don't have enough info to properly render input value + //we need to check for this situation and simply return model value if we can't apply custom formatting + locals[parserResult.itemName] = modelValue; + candidateViewValue = parserResult.viewMapper(originalScope, locals); + locals[parserResult.itemName] = undefined; + emptyViewValue = parserResult.viewMapper(originalScope, locals); + + return candidateViewValue!== emptyViewValue ? candidateViewValue : modelValue; + } + }); + + scope.select = function (activeIdx) { + //called from within the $digest() cycle + var locals = {}; + var model, item; + + locals[parserResult.itemName] = item = scope.matches[activeIdx].model; + model = parserResult.modelMapper(originalScope, locals); + $setModelValue(originalScope, model); + modelCtrl.$setValidity('editable', true); + + onSelectCallback(originalScope, { + $item: item, + $model: model, + $label: parserResult.viewMapper(originalScope, locals) + }); + + resetMatches(); + + //return focus to the input element if a match was selected via a mouse click event + // use timeout to avoid $rootScope:inprog error + $timeout(function() { element[0].focus(); }, 0, false); + }; + + //bind keyboard events: arrows up(38) / down(40), enter(13) and tab(9), esc(27) + element.bind('keydown', function (evt) { + + //typeahead is open and an "interesting" key was pressed + if (scope.matches.length === 0 || HOT_KEYS.indexOf(evt.which) === -1) { + return; + } + + evt.preventDefault(); + + if (evt.which === 40) { + scope.activeIdx = (scope.activeIdx + 1) % scope.matches.length; + scope.$digest(); + + } else if (evt.which === 38) { + scope.activeIdx = (scope.activeIdx ? scope.activeIdx : scope.matches.length) - 1; + scope.$digest(); + + } else if (evt.which === 13 || evt.which === 9) { + scope.$apply(function () { + scope.select(scope.activeIdx); + }); + + } else if (evt.which === 27) { + evt.stopPropagation(); + + resetMatches(); + scope.$digest(); + } + }); + + element.bind('blur', function (evt) { + hasFocus = false; + }); + + // Keep reference to click handler to unbind it. + var dismissClickHandler = function (evt) { + if (element[0] !== evt.target) { + resetMatches(); + scope.$digest(); + } + }; + + $document.bind('click', dismissClickHandler); + + originalScope.$on('$destroy', function(){ + $document.unbind('click', dismissClickHandler); + }); + + var $popup = $compile(popUpEl)(scope); + if ( appendToBody ) { + $document.find('body').append($popup); + } else { + element.after($popup); + } + } + }; + +}]) + + .directive('typeaheadPopup', function () { + return { + restrict:'EA', + scope:{ + matches:'=', + query:'=', + active:'=', + position:'=', + select:'&' + }, + replace:true, + templateUrl:'template/typeahead/typeahead-popup.html', + link:function (scope, element, attrs) { + + scope.templateUrl = attrs.templateUrl; + + scope.isOpen = function () { + return scope.matches.length > 0; + }; + + scope.isActive = function (matchIdx) { + return scope.active == matchIdx; + }; + + scope.selectActive = function (matchIdx) { + scope.active = matchIdx; + }; + + scope.selectMatch = function (activeIdx) { + scope.select({activeIdx:activeIdx}); + }; + } + }; + }) + + .directive('typeaheadMatch', ['$http', '$templateCache', '$compile', '$parse', function ($http, $templateCache, $compile, $parse) { + return { + restrict:'EA', + scope:{ + index:'=', + match:'=', + query:'=' + }, + link:function (scope, element, attrs) { + var tplUrl = $parse(attrs.templateUrl)(scope.$parent) || 'template/typeahead/typeahead-match.html'; + $http.get(tplUrl, {cache: $templateCache}).success(function(tplContent){ + element.replaceWith($compile(tplContent.trim())(scope)); + }); + } + }; + }]) + + .filter('typeaheadHighlight', function() { + + function escapeRegexp(queryToEscape) { + return queryToEscape.replace(/([.?*+^$[\]\\(){}|-])/g, '\\$1'); + } + + return function(matchItem, query) { + return query ? ('' + matchItem).replace(new RegExp(escapeRegexp(query), 'gi'), '$&') : matchItem; + }; + }); + +angular.module("template/accordion/accordion-group.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion-group.html", + "
    \n" + + "
    \n" + + "

    \n" + + " {{heading}}\n" + + "

    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/accordion/accordion.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/accordion/accordion.html", + "
    "); +}]); + +angular.module("template/alert/alert.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/alert/alert.html", + "
    \n" + + " \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/carousel/carousel.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/carousel.html", + "
    \n" + + "
      1\">\n" + + "
    1. \n" + + "
    \n" + + "
    \n" + + " 1\">\n" + + " 1\">\n" + + "
    \n" + + ""); +}]); + +angular.module("template/carousel/slide.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/carousel/slide.html", + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/datepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/datepicker.html", + "
    \n" + + " \n" + + " \n" + + " \n" + + "
    "); +}]); + +angular.module("template/datepicker/day.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/day.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    {{label.abbr}}
    {{ weekNumbers[$index] }}\n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/month.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/month.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    \n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/popup.html", + "
      \n" + + "
    • \n" + + "
    • \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    • \n" + + "
    \n" + + ""); +}]); + +angular.module("template/datepicker/year.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/datepicker/year.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
    \n" + + " \n" + + "
    \n" + + ""); +}]); + +angular.module("template/modal/backdrop.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/backdrop.html", + "
    \n" + + ""); +}]); + +angular.module("template/modal/window.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/modal/window.html", + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/pagination/pager.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pager.html", + ""); +}]); + +angular.module("template/pagination/pagination.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/pagination/pagination.html", + ""); +}]); + +angular.module("template/tooltip/tooltip-html-unsafe-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-html-unsafe-popup.html", + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/tooltip/tooltip-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tooltip/tooltip-popup.html", + "
    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/popover/popover.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/popover/popover.html", + "
    \n" + + "
    \n" + + "\n" + + "
    \n" + + "

    \n" + + "
    \n" + + "
    \n" + + "
    \n" + + ""); +}]); + +angular.module("template/progressbar/bar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/bar.html", + "
    "); +}]); + +angular.module("template/progressbar/progress.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progress.html", + "
    "); +}]); + +angular.module("template/progressbar/progressbar.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/progressbar/progressbar.html", + "
    \n" + + "
    \n" + + "
    "); +}]); + +angular.module("template/rating/rating.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/rating/rating.html", + "\n" + + " \n" + + " ({{ $index < value ? '*' : ' ' }})\n" + + " \n" + + ""); +}]); + +angular.module("template/tabs/tab.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tab.html", + "
  • \n" + + " {{heading}}\n" + + "
  • \n" + + ""); +}]); + +angular.module("template/tabs/tabset-titles.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tabset-titles.html", + "
      \n" + + "
    \n" + + ""); +}]); + +angular.module("template/tabs/tabset.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/tabs/tabset.html", + "\n" + + "
    \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + "
      \n" + + ""); +}]); + +angular.module("template/timepicker/timepicker.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/timepicker/timepicker.html", + "\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
       
      \n" + + " \n" + + " :\n" + + " \n" + + "
       
      \n" + + ""); +}]); + +angular.module("template/typeahead/typeahead-match.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-match.html", + ""); +}]); + +angular.module("template/typeahead/typeahead-popup.html", []).run(["$templateCache", function($templateCache) { + $templateCache.put("template/typeahead/typeahead-popup.html", + "
        \n" + + "
      • \n" + + "
        \n" + + "
      • \n" + + "
      "); +}]); diff --git a/themes/hellug-keycloak/common/resources/lib/angular/version.json b/themes/hellug-keycloak/common/resources/lib/angular/version.json new file mode 100755 index 0000000..7325f62 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/angular/version.json @@ -0,0 +1 @@ +{"raw":"v1.4.4","major":1,"minor":4,"patch":4,"prerelease":[],"build":[],"version":"1.4.4","codeName":"pylon-requirement","full":"1.4.4","branch":"v1.4.x","cdn":{"raw":"v1.4.3","major":1,"minor":4,"patch":3,"prerelease":[],"build":[],"version":"1.4.3","docsUrl":"http://code.angularjs.org/1.4.3/docs"}} \ No newline at end of file diff --git a/themes/hellug-keycloak/common/resources/lib/filesaver/FileSaver.js b/themes/hellug-keycloak/common/resources/lib/filesaver/FileSaver.js new file mode 100644 index 0000000..fb71494 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/filesaver/FileSaver.js @@ -0,0 +1,188 @@ +/* FileSaver.js + * A saveAs() FileSaver implementation. + * 1.3.2 + * 2016-06-16 18:25:19 + * + * By Eli Grey, http://eligrey.com + * License: MIT + * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md + */ + +/*global self */ +/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ + +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ + +var saveAs = saveAs || (function(view) { + "use strict"; + // IE <10 is explicitly unsupported + if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) { + return; + } + var + doc = view.document + // only get URL when necessary in case Blob.js hasn't overridden it yet + , get_URL = function() { + return view.URL || view.webkitURL || view; + } + , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") + , can_use_save_link = "download" in save_link + , click = function(node) { + var event = new MouseEvent("click"); + node.dispatchEvent(event); + } + , is_safari = /constructor/i.test(view.HTMLElement) || view.safari + , is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent) + , throw_outside = function(ex) { + (view.setImmediate || view.setTimeout)(function() { + throw ex; + }, 0); + } + , force_saveable_type = "application/octet-stream" + // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to + , arbitrary_revoke_timeout = 1000 * 40 // in ms + , revoke = function(file) { + var revoker = function() { + if (typeof file === "string") { // file is an object URL + get_URL().revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + }; + setTimeout(revoker, arbitrary_revoke_timeout); + } + , dispatch = function(filesaver, event_types, event) { + event_types = [].concat(event_types); + var i = event_types.length; + while (i--) { + var listener = filesaver["on" + event_types[i]]; + if (typeof listener === "function") { + try { + listener.call(filesaver, event || filesaver); + } catch (ex) { + throw_outside(ex); + } + } + } + } + , auto_bom = function(blob) { + // prepend BOM for UTF-8 XML and text/* types (including HTML) + // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF + if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { + return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type}); + } + return blob; + } + , FileSaver = function(blob, name, no_auto_bom) { + if (!no_auto_bom) { + blob = auto_bom(blob); + } + // First try a.download, then web filesystem, then object URLs + var + filesaver = this + , type = blob.type + , force = type === force_saveable_type + , object_url + , dispatch_all = function() { + dispatch(filesaver, "writestart progress write writeend".split(" ")); + } + // on any filesys errors revert to saving with object URLs + , fs_error = function() { + if ((is_chrome_ios || (force && is_safari)) && view.FileReader) { + // Safari doesn't allow downloading of blob urls + var reader = new FileReader(); + reader.onloadend = function() { + var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;'); + var popup = view.open(url, '_blank'); + if(!popup) view.location.href = url; + url=undefined; // release reference before dispatching + filesaver.readyState = filesaver.DONE; + dispatch_all(); + }; + reader.readAsDataURL(blob); + filesaver.readyState = filesaver.INIT; + return; + } + // don't create more object URLs than needed + if (!object_url) { + object_url = get_URL().createObjectURL(blob); + } + if (force) { + view.location.href = object_url; + } else { + var opened = view.open(object_url, "_blank"); + if (!opened) { + // Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html + view.location.href = object_url; + } + } + filesaver.readyState = filesaver.DONE; + dispatch_all(); + revoke(object_url); + } + ; + filesaver.readyState = filesaver.INIT; + + if (can_use_save_link) { + object_url = get_URL().createObjectURL(blob); + setTimeout(function() { + save_link.href = object_url; + save_link.download = name; + click(save_link); + dispatch_all(); + revoke(object_url); + filesaver.readyState = filesaver.DONE; + }); + return; + } + + fs_error(); + } + , FS_proto = FileSaver.prototype + , saveAs = function(blob, name, no_auto_bom) { + return new FileSaver(blob, name || blob.name || "download", no_auto_bom); + } + ; + // IE 10+ (native saveAs) + if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) { + return function(blob, name, no_auto_bom) { + name = name || blob.name || "download"; + + if (!no_auto_bom) { + blob = auto_bom(blob); + } + return navigator.msSaveOrOpenBlob(blob, name); + }; + } + + FS_proto.abort = function(){}; + FS_proto.readyState = FS_proto.INIT = 0; + FS_proto.WRITING = 1; + FS_proto.DONE = 2; + + FS_proto.error = + FS_proto.onwritestart = + FS_proto.onprogress = + FS_proto.onwrite = + FS_proto.onabort = + FS_proto.onerror = + FS_proto.onwriteend = + null; + + return saveAs; +}( + typeof self !== "undefined" && self + || typeof window !== "undefined" && window + || this.content +)); +// `self` is undefined in Firefox for Android content script context +// while `this` is nsIContentFrameMessageManager +// with an attribute `content` that corresponds to the window + +if (typeof module !== "undefined" && module.exports) { + module.exports.saveAs = saveAs; +} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) { + define("FileSaver.js", function() { + return saveAs; + }); +} diff --git a/themes/hellug-keycloak/common/resources/lib/fileupload/FileAPI.min.js b/themes/hellug-keycloak/common/resources/lib/fileupload/FileAPI.min.js new file mode 100644 index 0000000..7cc0ff4 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/fileupload/FileAPI.min.js @@ -0,0 +1,72 @@ +/**! + * FileAPI a set of tools for working with files + * + * @author RubaXa + * @build lib/canvas-to-blob lib/FileAPI.core lib/FileAPI.Image lib/FileAPI.Form lib/FileAPI.XHR lib/FileAPI.Flash + */ +(function(a){var k=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,g;if(g=a.Blob)try{g=Boolean(new Blob)}catch(j){g=!1}var m=g;if(g=m)if(g=a.Uint8Array)try{g=100===(new Blob([new Uint8Array(100)])).size}catch(f){g=!1}var c=g,e=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,q=(m||e)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var l,f,u,g;l=0<=a.split(",")[0].indexOf("base64")?atob(a.split(",")[1]):decodeURIComponent(a.split(",")[1]);f=new ArrayBuffer(l.length);u=new Uint8Array(f); +for(g=0;g= +a&&!c&&n.end()},isFail:function(){return c},fail:function(){!c&&b(c=!0)},end:function(){e||(e=!0,b())}};return n},each:g,afor:function(b,d){var a=0,c=b.length;l(b)&&c--?function B(){d(c!=a&&B,b[a],a++)}():d(!1)},extend:function(b){g(arguments,function(d){g(d,function(d,a){b[a]=d})});return b},isFile:function(b){return x&&b&&b instanceof v},isCanvas:function(b){return b&&U.test(b.nodeName)},getFilesFilter:function(b){return(b="string"==typeof b?b:b.getAttribute&&b.getAttribute("accept")||"")?RegExp("("+ +b.replace(/\./g,"\\.").replace(/,/g,"|")+")$","i"):/./},readAsDataURL:function(b,d){h.isCanvas(b)?c(b,d,"load",h.toDataURL(b)):e(b,d,"DataURL")},readAsBinaryString:function(b,d){p&&p.prototype.readAsBinaryString?e(b,d,"BinaryString"):e(b,function(b){if("load"==b.type)try{b.result=h.toBinaryString(b.result)}catch(a){b.type="error",b.message=a.toString()}d(b)},"DataURL")},readAsArrayBuffer:function(b,d){e(b,d,"ArrayBuffer")},readAsText:function(b,d,a){a||(a=d,d="utf-8");e(b,a,"Text",d)},toDataURL:function(b){if("string"== +typeof b)return b;if(b.toDataURL)return b.toDataURL("image/png")},toBinaryString:function(b){return a.atob(h.toDataURL(b).replace(I,""))},readAsImage:function(b,d,a){if(h.isFile(b))if(y){var e=y.createObjectURL(b);e===k?c(b,d,"error"):h.readAsImage(e,d,a)}else h.readAsDataURL(b,function(e){"load"==e.type?h.readAsImage(e.result,d,a):(a||"error"==e.type)&&c(b,d,e,null,{loaded:e.loaded,total:e.total})});else h.isCanvas(b)?c(b,d,"load",b):T.test(b.nodeName)?b.complete?c(b,d,"load",b):f(b,"error abort load", +function B(a){"load"==a.type&&y&&y.revokeObjectURL(b.src);m(b,"error abort load",B);c(b,d,a,b)}):b.iframe?c(b,d,{type:"error"}):(e=new Image,e.src=b.dataURL||b,h.readAsImage(e,d,a))},checkFileObj:function(b){var d={},a=h.accept;"object"==typeof b?d=b:d.name=(b+"").split(/\\|\//g).pop();null==d.type&&(d.type=d.name.split(".").pop());g(a,function(b,a){b=RegExp(b.replace(/\s/g,"|"),"i");b.test(d.type)&&(d.type=a.split("/")[0]+"/"+d.type)});return d},getDropFiles:function(b,d){var a=[],c=(b.originalEvent|| +b||"").dataTransfer||{},e=l(c.items)&&c.items[0]&&q(c.items[0]),n=h.queue(function(){d(a)});g((e?c.items:c.files)||[],function(b){n.inc();if(e)t(b,function(b,d){!b&&a.push.apply(a,d);n.next()});else{var d=function(d){d&&a.push(b);n.next()};if(!b.type&&0==b.size%4096&&102400>=b.size)if(p)try{var c=new p;f(c,K,function(b){b="error"!=b.type;d(b);b&&c.abort()});c.readAsDataURL(b)}catch(l){d(!1)}else d(null);else d(!0)}});n.check()},getFiles:function(b,d,a){var c=[];if(a)return h.filterFiles(h.getFiles(b), +d,a),null;b.jquery&&(b.each(function(){c=c.concat(h.getFiles(this))}),b=c,c=[]);"string"==typeof d&&(d=h.getFilesFilter(d));b.originalEvent?b=A(b.originalEvent):b.srcElement&&(b=A(b));b.dataTransfer?b=b.dataTransfer:b.target&&(b=b.target);b.files?c=b.files:!x&&L.test(b&&b.tagName)?h.trim(b.value)&&(c=[h.checkFileObj(b.value)],c[0].blob=b,c[0].iframe=!0):l(b)&&(c=b);return h.filter(c,function(b){return!d||d.test(b.name)})},getInfo:function(b,d){var a={},c=O.concat();h.isFile(b)?function B(){var e= +c.shift();e?e.test(b.type)?e(b,function(b,c){b?d(b):(h.extend(a,c),B())}):B():d(!1,a)}():d("not_support",a)},addInfoReader:function(b,d){d.test=function(d){return b.test(d)};O.push(d)},filter:function(b,d){for(var a=[],c=0,e=b.length,n;c>2,c=(c&3)<<4|e>>4;isNaN(e)?e=n=64:(e=(e&15)<<2|n>>6,n=isNaN(n)?64:n&63);d+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(l)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(c)+ +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(e)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(n)}return d}};h.addInfoReader(/^image/,function(b,d){if(!b.__dimensions){var a=b.__dimensions=h.defer();h.readAsImage(b,function(b){var d=b.target;a.resolve("load"==b.type?!1:"error",{width:d.width,height:d.height})})}b.__dimensions.then(d)});h.event.dnd=function(b,d,a){var c,e;a||(a=d,d=h.F);p?(j(b,"dragenter dragleave dragover",function(b){for(var a= +((b.originalEvent||b||"").dataTransfer||{}).types,n=a&&a.length;n--;)~a[n].indexOf("File")&&(b.preventDefault(),e!==b.type&&(e=b.type,"dragleave"!=e&&d.call(b.currentTarget,!0,b),clearTimeout(c),c=setTimeout(function(){d.call(b.currentTarget,"dragleave"!=e,b)},50)))}),j(b,"drop",function(b){b.preventDefault();e=0;d.call(b.currentTarget,!1,b);h.getDropFiles(b,function(d){a.call(b.currentTarget,d,b)})})):h.log("Drag'n'Drop -- not supported")};n&&!n.fn.dnd&&(n.fn.dnd=function(b,d){return this.each(function(){h.event.dnd(this, +b,d)})});a.FileAPI=h.extend(h,a.FileAPI);h.flashUrl||(h.flashUrl=h.staticPath+"FileAPI.flash.swf");h.flashImageUrl||(h.flashImageUrl=h.staticPath+"FileAPI.flash.image.swf")})(window); +(function(a,k,g){function j(a,c){if(!(this instanceof j))return new j(a);this.file=a;this.better=!c;this.matrix={sx:0,sy:0,sw:0,sh:0,dx:0,dy:0,dw:0,dh:0,resize:0,deg:0}}var m=Math.min,f=Math.round,c=!1,e={8:270,3:180,6:90};try{c=-1=s?(s=g,r=s/j):(r=c,s=r*j),s!=g||r!=c)e.sx=~~((g-s)/2),e.sy=~~((c-r)/2),g=s,c=r}else r&&("min"==r?(q=f(s=j?m(g,q):k*s),k=f(s>=j?q/s:m(c,k))));e.sw=g;e.sh=c;e.dw=q;e.dh=k;return e},_trans:function(a){this._load(this.file,function(c,e){c?a(c):this._apply(e,a)})},get:function(c){if(a.support.transform){var f=this;"auto"==f.matrix.deg?a.getInfo(this.file,function(a,g){f.matrix.deg= +e[g&&g.exif&&g.exif.Orientation]||0;f._trans(c)}):f._trans(c)}else c("not_support")},toData:function(a){this.get(a)}};j.exifOrientation=e;j.transform=function(c,e,f,q){a.getInfo(c,function(m,k){var y={},r=a.queue(function(a){q(a,y)});m?r.fail():a.each(e,function(a,e){if(!r.isFail()){var l=j(k.nodeType?k:c);if("function"==typeof a)a(k,l);else if(a.width)l[a.preview?"preview":"resize"](a.width,a.height,a.type);else a.maxWidth&&(k.width>a.maxWidth||k.height>a.maxHeight)&&l.resize(a.maxWidth,a.maxHeight, +"max");a.rotate===g&&f&&(a.rotate="auto");l.rotate(a.rotate);r.inc();l.toData(function(d,a){d?r.fail():(y[e]=a,r.next())})}})})};a.support.canvas=a.support.transform=c;a.Image=j})(FileAPI,document); +(function(a,k,g){var j=k.encodeURIComponent,m=k.FormData;k=function(){this.items=[]};k.prototype={append:function(a,c,e,g){this.items.push({name:a,blob:c&&c.blob||(void 0==c?"":c),file:c&&(e||c.name),type:c&&(g||c.type)})},each:function(a){for(var c=0,e=this.items.length;c',c.xhr.abort=function(){var a=e.getElementsByName("iframe")[0];if(a)try{a.stop?a.stop():a.contentWindow.stop?a.contentWindow.stop():a.contentWindow.document.execCommand("Stop")}catch(c){}e=null},j=e.getElementsByTagName("form")[0], +j.appendChild(f),k.log(j.parentNode.innerHTML),document.body.appendChild(e),c.xhr.node=e,a[q]=function(a,f,g){c.readyState=4;c.responseText=g;c.end(a,f);e=null},c.readyState=2,j.submit(),j=null):this.xhr&&this.xhr.aborted?k.log("Error: already aborted"):(e=c.xhr=k.getXHR(),f.params&&(j+=(0>j.indexOf("?")?"?":"&")+f.params.join("&")),e.open("POST",j,!0),k.withCredentials&&(e.withCredentials="true"),(!g.headers||!g.headers["X-Requested-With"])&&e.setRequestHeader("X-Requested-With","XMLHttpRequest"), +k.each(g.headers,function(a,c){e.setRequestHeader(c,a)}),g._chunked?(e.upload&&e.upload.addEventListener("progress",function(a){f.retry||g.progress({type:a.type,total:f.size,loaded:f.start+a.loaded,totalSize:f.size},c,g)},!1),e.onreadystatechange=function(){c.status=e.status;c.statusText=e.statusText;c.readyState=e.readyState;if(4==e.readyState){for(var a in{"":1,XML:1,Text:1,Body:1})c["response"+a]=e["response"+a];e.onreadystatechange=null;if(!e.status||0').replace(/#(\w+)#/ig,function(c,e){return a[e]})},t=function(a,c){if(a&&a.style){var e,f;for(e in c){f=c[e];"number"==typeof f&&(f+="px");try{a.style[e]=f}catch(g){}}}},l=function(d,c){a.each(c,function(a,c){var e=d[c];d[c]=function(){this.parent=e;return a.apply(this,arguments)}})},A=function(d){var c=d.wid=a.uid();p._fn[c]=d;return"FileAPI.Flash._fn."+c}, +u=function(a){try{p._fn[a.wid]=null,delete p._fn[a.wid]}catch(c){}},C=function(a,c){if(!v.test(a)){if(/^\.\//.test(a)||"/"!=a.charAt(0)){var e=location.pathname,e=e.substr(0,e.lastIndexOf("/"));a=(e+"/"+a).replace("/./","/")}"//"!=a.substr(0,2)&&(a="//"+location.host+a);v.test(a)||(a=location.protocol+a)}c&&(a+=(/\?/.test(a)?"&":"?")+c);return a},s=a.uid(),y=0,r={},v=/^https?:/i,p={_fn:{},init:function(){var d=g.body&&g.body.firstChild;if(d){do if(1==d.nodeType){a.log("FlashAPI.Flash.init...");var c= +g.createElement("div");t(c,{top:1,right:1,width:5,height:5,position:"absolute"});d.parentNode.insertBefore(c,d);p.publish(c,s);return}while(d=d.nextSibling)}10>y&&setTimeout(p.init,50*++y)},publish:function(d,c){d.innerHTML=q({id:c,src:C(a.flashUrl,"r="+a.version),wmode:"transparent",flashvars:"callback=FileAPI.Flash.event&flashId="+c+"&storeKey="+navigator.userAgent.match(/\d/ig).join("")+"_"+a.version+(p.isReady||(a.pingUrl?"&ping="+a.pingUrl:""))})},ready:function(){p.ready=a.F;p.isReady=!0;p.patch(); +a.event.on(g,"mouseover",p.mouseover);a.event.on(g,"click",function(a){p.mouseover(a)&&(a.preventDefault?a.preventDefault():a.returnValue=!0)})},getWrapper:function(a){do if(/js-fileapi-wrapper/.test(a.className))return a;while((a=a.parentNode)&&a!==g.body)},mouseover:function(d){d=a.event.fix(d).target;if(/input/i.test(d.nodeName)&&"file"==d.type){var c=d.getAttribute(s);if("i"==c||"r"==c)return!1;if("p"!=c){d.setAttribute(s,"i");var c=g.createElement("div"),e=p.getWrapper(d);if(!e){a.log("flash.mouseover.error: js-fileapi-wrapper not found"); +return}t(c,{top:0,left:0,width:d.offsetWidth+100,height:d.offsetHeight+100,zIndex:"1000000",position:"absolute"});e.appendChild(c);p.publish(c,a.uid());d.setAttribute(s,"p")}return!0}},event:function(d){var c=d.type;if("ready"==c){try{p.getInput(d.flashId).setAttribute(s,"r")}catch(e){}p.ready();setTimeout(function(){p.mouseenter(d)},50);return!0}"ping"===c?a.log("(flash -> js).ping:",[d.status,d.savedStatus],d.error):"log"===c?a.log("(flash -> js).log:",d.target):c in p&&setTimeout(function(){a.log("Flash.event."+ +d.type+":",d);p[c](d)},1)},mouseenter:function(d){var c=p.getInput(d.flashId);if(c){p.cmd(d,"multiple",null!=c.getAttribute("multiple"));var e=[],f={};a.each((c.getAttribute("accept")||"").split(/,\s*/),function(d){a.accept[d]&&a.each(a.accept[d].split(" "),function(a){f[a]=1})});a.each(f,function(a,d){e.push(d)});p.cmd(d,"accept",e.length?e.join(",")+","+e.join(",").toUpperCase():"*")}},get:function(a){return g[a]||k[a]||g.embeds[a]},getInput:function(d){try{var c=p.getWrapper(p.get(d));if(c)return c.getElementsByTagName("input")[0]}catch(e){a.log('Can not find "input" by flashId:', +d,e)}},select:function(d){var c=p.getInput(d.flashId),e=a.uid(c);d=d.target.files;a.each(d,function(d){a.checkFileObj(d)});r[e]=d;g.createEvent?(e=g.createEvent("Event"),e.initEvent("change",!0,!1),c.dispatchEvent(e)):g.createEventObject&&(e=g.createEventObject(),c.fireEvent("onchange",e))},cmd:function(d,c,e,f){try{return a.log("(js -> flash)."+c+":",e),p.get(d.flashId||d).cmd(c,e)}catch(g){a.log("(js -> flash).onError:",g),f||setTimeout(function(){p.cmd(d,c,e,!0)},50)}},patch:function(){a.flashEngine= +a.support.transform=!0;l(a,{getFiles:function(d,c,e){if(e)return a.filterFiles(a.getFiles(d),c,e),null;var f=a.isArray(d)?d:r[a.uid(d.target||d.srcElement||d)];if(!f)return this.parent.apply(this,arguments);c&&(c=a.getFilesFilter(c),f=a.filter(f,function(a){return c.test(a.name)}));return f},getInfo:function(d,c){if(d&&!d.flashId)this.parent.apply(this,arguments);else{if(!d.__info){var e=d.__info=a.defer();p.cmd(d,"getFileInfo",{id:d.id,callback:A(function F(a,c){u(F);e.resolve(a,d.info=c)})})}d.__info.then(c)}}}); +a.support.transform=!0;a.Image&&l(a.Image.prototype,{get:function(a,c){this.set({scaleMode:c||"noScale"});this.parent(a)},_load:function(d,c){a.log("FileAPI.Image._load:",d);if(d&&!d.flashId)this.parent.apply(this,arguments);else{var e=this;a.getInfo(d,function(a){c.call(e,a,d)})}},_apply:function(d,c){a.log("FileAPI.Image._apply:",d);if(d&&!d.flashId)this.parent.apply(this,arguments);else{var e=this.getMatrix(d.info);p.cmd(d,"imageTransform",{id:d.id,matrix:e,callback:A(function F(f,k){a.log("FileAPI.Image._apply.callback:", +f);u(F);if(f)c(f);else if(!a.support.dataURI||3E4 + * @version 1.1.10 + */ +if (window.XMLHttpRequest) { + if (window.FormData) { + // allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934 + XMLHttpRequest = (function(origXHR) { + return function() { + var xhr = new origXHR(); + xhr.send = (function(orig) { + return function() { + if (arguments[0] instanceof FormData && arguments[0].__setXHR_) { + var formData = arguments[0]; + formData.__setXHR_(xhr); + } + orig.apply(xhr, arguments); + } + })(xhr.send); + return xhr; + } + })(XMLHttpRequest); + } +} diff --git a/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js new file mode 100644 index 0000000..64d9182 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-html5-shim.min.js @@ -0,0 +1,2 @@ +/*! 1.1.10 */ +window.XMLHttpRequest&&window.FormData&&(XMLHttpRequest=function(a){return function(){var b=new a;return b.send=function(a){return function(){if(arguments[0]instanceof FormData&&arguments[0].__setXHR_){var c=arguments[0];c.__setXHR_(b)}a.apply(b,arguments)}}(b.send),b}}(XMLHttpRequest)); \ No newline at end of file diff --git a/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js new file mode 100644 index 0000000..f526e58 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.js @@ -0,0 +1,215 @@ +/**! + * AngularJS file upload shim for HTML5 FormData + * @author Danial + * @version 1.1.10 + */ +(function() { + +if (window.XMLHttpRequest) { + if (window.FormData) { + // allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934 + XMLHttpRequest = (function(origXHR) { + return function() { + var xhr = new origXHR(); + xhr.send = (function(orig) { + return function() { + if (arguments[0] instanceof FormData && arguments[0].__setXHR_) { + var formData = arguments[0]; + formData.__setXHR_(xhr); + } + orig.apply(xhr, arguments); + } + })(xhr.send); + return xhr; + } + })(XMLHttpRequest); + } else { + XMLHttpRequest = (function(origXHR) { + return function() { + var xhr = new origXHR(); + var origSend = xhr.send; + xhr.__requestHeaders = []; + xhr.open = (function(orig) { + xhr.upload = { + addEventListener: function(t, fn, b) { + if (t == 'progress') { + xhr.__progress = fn; + } + } + }; + return function(m, url, b) { + orig.apply(xhr, [m, url, b]); + xhr.__url = url; + } + })(xhr.open); + xhr.getResponseHeader = (function(orig) { + return function(h) { + return xhr.__fileApiXHR ? xhr.__fileApiXHR.getResponseHeader(h) : orig.apply(xhr, [h]); + } + })(xhr.getResponseHeader); + xhr.getAllResponseHeaders = (function(orig) { + return function() { + return xhr.__fileApiXHR ? xhr.__fileApiXHR.getAllResponseHeaders() : orig.apply(xhr); + } + })(xhr.getAllResponseHeaders); + xhr.abort = (function(orig) { + return function() { + return xhr.__fileApiXHR ? xhr.__fileApiXHR.abort() : (orig == null ? null : orig.apply(xhr)); + } + })(xhr.abort); + xhr.send = function() { + if (arguments[0] != null && arguments[0].__isShim && arguments[0].__setXHR_) { + var formData = arguments[0]; + if (arguments[0].__setXHR_) { + var formData = arguments[0]; + formData.__setXHR_(xhr); + } + var config = { + url: xhr.__url, + complete: function(err, fileApiXHR) { + Object.defineProperty(xhr, 'status', {get: function() {return fileApiXHR.status}}); + Object.defineProperty(xhr, 'statusText', {get: function() {return fileApiXHR.statusText}}); + Object.defineProperty(xhr, 'readyState', {get: function() {return 4}}); + Object.defineProperty(xhr, 'response', {get: function() {return fileApiXHR.response}}); + Object.defineProperty(xhr, 'responseText', {get: function() {return fileApiXHR.responseText}}); + xhr.__fileApiXHR = fileApiXHR; + xhr.onreadystatechange(); + }, + progress: function(e) { + xhr.__progress(e); + }, + headers: xhr.__requestHeaders + } + config.data = {}; + config.files = {} + for (var i = 0; i < formData.data.length; i++) { + var item = formData.data[i]; + if (item.val != null && item.val.name != null && item.val.size != null && item.val.type != null) { + config.files[item.key] = item.val; + } else { + config.data[item.key] = item.val; + } + } + + setTimeout(function() { + xhr.__fileApiXHR = FileAPI.upload(config); + }, 1); + } else { + origSend.apply(xhr, arguments); + } + } + return xhr; + } + })(XMLHttpRequest); + } +} + +if (!window.FormData) { + var hasFlash = false; + try { + var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash'); + if (fo) hasFlash = true; + } catch(e) { + if (navigator.mimeTypes["application/x-shockwave-flash"] != undefined) hasFlash = true; + } + var wrapFileApi = function(elem) { + if (!elem.__isWrapped && (elem.getAttribute('ng-file-select') != null || elem.getAttribute('data-ng-file-select') != null)) { + var wrap = document.createElement('div'); + wrap.innerHTML = '
      '; + wrap = wrap.firstChild; + var parent = elem.parentNode; + parent.insertBefore(wrap, elem); + parent.removeChild(elem); + wrap.appendChild(elem); + if (!hasFlash) { + wrap.appendChild(document.createTextNode('Flash is required')); + } + elem.__isWrapped = true; + } + }; + var changeFnWrapper = function(fn) { + return function(evt) { + var files = FileAPI.getFiles(evt); + if (!evt.target) { + evt.target = {}; + } + evt.target.files = files; + evt.target.files.item = function(i) { + return evt.target.files[i] || null; + } + fn(evt); + }; + }; + var isFileChange = function(elem, e) { + return (e.toLowerCase() === 'change' || e.toLowerCase() === 'onchange') && elem.getAttribute('type') == 'file'; + } + if (HTMLInputElement.prototype.addEventListener) { + HTMLInputElement.prototype.addEventListener = (function(origAddEventListener) { + return function(e, fn, b, d) { + if (isFileChange(this, e)) { + wrapFileApi(this); + origAddEventListener.apply(this, [e, changeFnWrapper(fn), b, d]); + } else { + origAddEventListener.apply(this, [e, fn, b, d]); + } + } + })(HTMLInputElement.prototype.addEventListener); + } + if (HTMLInputElement.prototype.attachEvent) { + HTMLInputElement.prototype.attachEvent = (function(origAttachEvent) { + return function(e, fn) { + if (isFileChange(this, e)) { + wrapFileApi(this); + origAttachEvent.apply(this, [e, changeFnWrapper(fn)]); + } else { + origAttachEvent.apply(this, [e, fn]); + } + } + })(HTMLInputElement.prototype.attachEvent); + } + + window.FormData = FormData = function() { + return { + append: function(key, val, name) { + this.data.push({ + key: key, + val: val, + name: name + }); + }, + data: [], + __isShim: true + }; + }; + + (function () { + //load FileAPI + if (!window.FileAPI || !FileAPI.upload) { + var base = '', script = document.createElement('script'), allScripts = document.getElementsByTagName('script'), i, index, src; + if (window.FileAPI && window.FileAPI.jsPath) { + base = window.FileAPI.jsPath; + } else { + for (i = 0; i < allScripts.length; i++) { + src = allScripts[i].src; + index = src.indexOf('angular-file-upload-shim.js') + if (index == -1) { + index = src.indexOf('angular-file-upload-shim.min.js'); + } + if (index > -1) { + base = src.substring(0, index); + break; + } + } + } + + if (!window.FileAPI || FileAPI.staticPath == null) { + FileAPI = { + staticPath: base + } + } + + script.setAttribute('src', base + "FileAPI.min.js"); + document.getElementsByTagName('head')[0].appendChild(script); + } + })(); +}})(); \ No newline at end of file diff --git a/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js new file mode 100644 index 0000000..e76e175 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload-shim.min.js @@ -0,0 +1,2 @@ +/*! 1.1.10 */ +!function(){if(window.XMLHttpRequest&&(XMLHttpRequest=window.FormData?function(a){return function(){var b=new a;return b.send=function(a){return function(){if(arguments[0]instanceof FormData&&arguments[0].__setXHR_){var c=arguments[0];c.__setXHR_(b)}a.apply(b,arguments)}}(b.send),b}}(XMLHttpRequest):function(a){return function(){var b=new a,c=b.send;return b.__requestHeaders=[],b.open=function(a){return b.upload={addEventListener:function(a,c){"progress"==a&&(b.__progress=c)}},function(c,d,e){a.apply(b,[c,d,e]),b.__url=d}}(b.open),b.getResponseHeader=function(a){return function(c){return b.__fileApiXHR?b.__fileApiXHR.getResponseHeader(c):a.apply(b,[c])}}(b.getResponseHeader),b.getAllResponseHeaders=function(a){return function(){return b.__fileApiXHR?b.__fileApiXHR.getAllResponseHeaders():a.apply(b)}}(b.getAllResponseHeaders),b.abort=function(a){return function(){return b.__fileApiXHR?b.__fileApiXHR.abort():null==a?null:a.apply(b)}}(b.abort),b.send=function(){if(null!=arguments[0]&&arguments[0].__isShim&&arguments[0].__setXHR_){var a=arguments[0];if(arguments[0].__setXHR_){var a=arguments[0];a.__setXHR_(b)}var d={url:b.__url,complete:function(a,c){Object.defineProperty(b,"status",{get:function(){return c.status}}),Object.defineProperty(b,"statusText",{get:function(){return c.statusText}}),Object.defineProperty(b,"readyState",{get:function(){return 4}}),Object.defineProperty(b,"response",{get:function(){return c.response}}),Object.defineProperty(b,"responseText",{get:function(){return c.responseText}}),b.__fileApiXHR=c,b.onreadystatechange()},progress:function(a){b.__progress(a)},headers:b.__requestHeaders};d.data={},d.files={};for(var e=0;e',c=c.firstChild;var d=b.parentNode;d.insertBefore(c,b),d.removeChild(b),c.appendChild(b),a||c.appendChild(document.createTextNode("Flash is required")),b.__isWrapped=!0}},e=function(a){return function(b){var c=FileAPI.getFiles(b);b.target||(b.target={}),b.target.files=c,b.target.files.item=function(a){return b.target.files[a]||null},a(b)}},f=function(a,b){return("change"===b.toLowerCase()||"onchange"===b.toLowerCase())&&"file"==a.getAttribute("type")};HTMLInputElement.prototype.addEventListener&&(HTMLInputElement.prototype.addEventListener=function(a){return function(b,c,g,h){f(this,b)?(d(this),a.apply(this,[b,e(c),g,h])):a.apply(this,[b,c,g,h])}}(HTMLInputElement.prototype.addEventListener)),HTMLInputElement.prototype.attachEvent&&(HTMLInputElement.prototype.attachEvent=function(a){return function(b,c){f(this,b)?(d(this),a.apply(this,[b,e(c)])):a.apply(this,[b,c])}}(HTMLInputElement.prototype.attachEvent)),window.FormData=FormData=function(){return{append:function(a,b,c){this.data.push({key:a,val:b,name:c})},data:[],__isShim:!0}},function(){if(!window.FileAPI||!FileAPI.upload){var a,b,c,d="",e=document.createElement("script"),f=document.getElementsByTagName("script");if(window.FileAPI&&window.FileAPI.jsPath)d=window.FileAPI.jsPath;else for(a=0;a-1){d=c.substring(0,b);break}window.FileAPI&&null!=FileAPI.staticPath||(FileAPI={staticPath:d}),e.setAttribute("src",d+"FileAPI.min.js"),document.getElementsByTagName("head")[0].appendChild(e)}}()}}(); \ No newline at end of file diff --git a/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.js b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.js new file mode 100644 index 0000000..0daaa69 --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.js @@ -0,0 +1,156 @@ +/**! + * AngularJS file upload/drop directive with http post and progress + * @author Danial + * @version 1.1.10 + */ +(function() { + +var angularFileUpload = angular.module('angularFileUpload', []); + +angularFileUpload.service('$upload', ['$http', '$rootScope', '$timeout', function($http, $rootScope, $timeout) { + this.upload = function(config) { + config.method = config.method || 'POST'; + config.headers = config.headers || {}; + config.headers['Content-Type'] = undefined; + config.transformRequest = config.transformRequest || $http.defaults.transformRequest; + var formData = new FormData(); + if (config.data) { + for (var key in config.data) { + var val = config.data[key]; + if (!config.formDataAppender) { + if (typeof config.transformRequest == 'function') { + val = config.transformRequest(val); + } else { + for (var i = 0; i < config.transformRequest.length; i++) { + var fn = config.transformRequest[i]; + if (typeof fn == 'function') { + val = fn(val); + } + } + } + formData.append(key, val); + } else { + config.formDataAppender(formData, key, val); + } + } + } + config.transformRequest = angular.identity; + formData.append(config.fileFormDataName || 'file', config.file, config.file.name); + + formData['__setXHR_'] = function(xhr) { + config.__XHR = xhr; + xhr.upload.addEventListener('progress', function(e) { + if (config.progress) { + $timeout(function() { + config.progress(e); + }); + } + }, false); + //fix for firefox not firing upload progress end + xhr.upload.addEventListener('load', function(e) { + if (e.lengthComputable) { + $timeout(function() { + config.progress(e); + }); + } + }, false); + }; + + config.data = formData; + + var promise = $http(config); + + promise.progress = function(fn) { + config.progress = fn; + return promise; + }; + + promise.abort = function() { + if (config.__XHR) { + $timeout(function() { + config.__XHR.abort(); + }); + } + return promise; + }; + promise.then = (function(promise, origThen) { + return function(s, e, p) { + config.progress = p || config.progress; + origThen.apply(promise, [s, e, p]); + return promise; + }; + })(promise, promise.then); + + return promise; + }; +}]); + +angularFileUpload.directive('ngFileSelect', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) { + return function(scope, elem, attr) { + var fn = $parse(attr['ngFileSelect']); + elem.bind('change', function(evt) { + var files = [], fileList, i; + fileList = evt.target.files; + if (fileList != null) { + for (i = 0; i < fileList.length; i++) { + files.push(fileList.item(i)); + } + } + $timeout(function() { + fn(scope, { + $files : files, + $event : evt + }); + }); + }); + elem.bind('click', function(){ + this.value = null; + }); + }; +} ]); + +angularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) { + return function(scope, elem, attr) { + if ('draggable' in document.createElement('span')) { + var fn = $parse(attr['ngFileDropAvailable']); + $timeout(function() { + fn(scope); + }); + } + }; +} ]); + +angularFileUpload.directive('ngFileDrop', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) { + return function(scope, elem, attr) { + if ('draggable' in document.createElement('span')) { + var fn = $parse(attr['ngFileDrop']); + elem[0].addEventListener("dragover", function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + elem.addClass(attr['ngFileDragOverClass'] || "dragover"); + }, false); + elem[0].addEventListener("dragleave", function(evt) { + elem.removeClass(attr['ngFileDragOverClass'] || "dragover"); + }, false); + elem[0].addEventListener("drop", function(evt) { + evt.stopPropagation(); + evt.preventDefault(); + elem.removeClass(attr['ngFileDragOverClass'] || "dragover"); + var files = [], fileList = evt.dataTransfer.files, i; + if (fileList != null) { + for (i = 0; i < fileList.length; i++) { + files.push(fileList.item(i)); + } + } + $timeout(function() { + fn(scope, { + $files : files, + $event : evt + }); + }); + }, false); + } + }; +} ]); + +})(); diff --git a/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.min.js b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.min.js new file mode 100644 index 0000000..ae51b1f --- /dev/null +++ b/themes/hellug-keycloak/common/resources/lib/fileupload/angular-file-upload.min.js @@ -0,0 +1,2 @@ +/*! 1.1.10 */ +!function(){var a=angular.module("angularFileUpload",[]);a.service("$upload",["$http","$rootScope","$timeout",function(a,b,c){this.upload=function(b){b.method=b.method||"POST",b.headers=b.headers||{},b.headers["Content-Type"]=void 0,b.transformRequest=b.transformRequest||a.defaults.transformRequest;var d=new FormData;if(b.data)for(var e in b.data){var f=b.data[e];if(b.formDataAppender)b.formDataAppender(d,e,f);else{if("function"==typeof b.transformRequest)f=b.transformRequest(f);else for(var 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 literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/common/resources/package-lock.json b/themes/hellug-keycloak/common/resources/package-lock.json new file mode 100644 index 0000000..6ace57f --- /dev/null +++ b/themes/hellug-keycloak/common/resources/package-lock.json @@ -0,0 +1,1560 @@ +{ + "name": "keycloak-npm-dependencies", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "keycloak-npm-dependencies", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "angular": "1.8.3", + "angular-cookies": "1.8.3", + "angular-loader": "1.8.3", + "angular-resource": "1.8.3", + "angular-route": "1.8.3", + "angular-sanitize": "1.8.3", + "angular-translate": "2.19.0", + "angular-translate-loader-url": "2.19.0", + "angular-treeview": "0.1.5", + "angular-ui-select2": "0.0.5", + "autofill-event": "0.0.1", + "bootstrap": "3.4.1", + "filesaver": "0.0.13", + "font-awesome": "4.7.0", + "jquery": "3.6.1", + "ng-file-upload": "12.2.13", + "patternfly": "3.59.5", + "rcue": "3.48.1", + "select2": "3.5.1", + "text-security": "3.2.1" + } + }, + "node_modules/@types/c3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@types/c3/-/c3-0.6.4.tgz", + "integrity": "sha512-W7i7oSmHsXYhseZJsIYexelv9HitGsWdQhx3mcy4NWso+GedpCYr02ghpkNvnZ4oTIjNeISdrOnM70s7HiuV+g==", + "optional": true, + "dependencies": { + "@types/d3": "^4" + } + }, + "node_modules/@types/d3": { + "version": "4.13.12", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-4.13.12.tgz", + "integrity": "sha512-/bbFtkOBc04gGGN8N9rMG5ps3T0eIj5I8bnYe9iIyeM5qoOrydPCbFYlEPUnj2h9ibc2i+QZfDam9jY5XTrTxQ==", + "optional": true, + "dependencies": { + "@types/d3-array": "^1", + "@types/d3-axis": "^1", + "@types/d3-brush": "^1", + "@types/d3-chord": "^1", + "@types/d3-collection": "*", + "@types/d3-color": "^1", + "@types/d3-dispatch": "^1", + "@types/d3-drag": "^1", + "@types/d3-dsv": "^1", + "@types/d3-ease": "^1", + "@types/d3-force": "^1", + "@types/d3-format": "^1", + "@types/d3-geo": "^1", + "@types/d3-hierarchy": "^1", + "@types/d3-interpolate": "^1", + "@types/d3-path": "^1", + "@types/d3-polygon": "^1", + "@types/d3-quadtree": "^1", + "@types/d3-queue": "*", + "@types/d3-random": "^1", + "@types/d3-request": "*", + "@types/d3-scale": "^1", + "@types/d3-selection": "^1", + "@types/d3-shape": "^1", + "@types/d3-time": "^1", + "@types/d3-time-format": "^2", + "@types/d3-timer": "^1", + "@types/d3-transition": "^1", + "@types/d3-voronoi": "*", + "@types/d3-zoom": "^1" + } + }, + "node_modules/@types/d3-array": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.9.tgz", + "integrity": "sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA==", + "optional": true + }, + "node_modules/@types/d3-axis": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.16.tgz", + "integrity": "sha512-p7085weOmo4W+DzlRRVC/7OI/jugaKbVa6WMQGCQscaMylcbuaVEGk7abJLNyGVFLeCBNrHTdDiqRGnzvL0nXQ==", + "optional": true, + "dependencies": { + "@types/d3-selection": "^1" + } + }, + "node_modules/@types/d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-4zGkBafJf5zCsBtLtvDj/pNMo5X9+Ii/1hUz0GvQ+wEwelUBm2AbIDAzJnp2hLDFF307o0fhxmmocHclhXC+tw==", + "optional": true, + "dependencies": { + "@types/d3-selection": "^1" + } + }, + "node_modules/@types/d3-chord": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.11.tgz", + "integrity": "sha512-0DdfJ//bxyW3G9Nefwq/LDgazSKNN8NU0lBT3Cza6uVuInC2awMNsAcv1oKyRFLn9z7kXClH5XjwpveZjuz2eg==", + "optional": true + }, + "node_modules/@types/d3-collection": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.10.tgz", + "integrity": "sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A==", + "optional": true + }, + "node_modules/@types/d3-color": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz", + "integrity": "sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA==", + "optional": true + }, + "node_modules/@types/d3-dispatch": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz", + "integrity": "sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ==", + "optional": true + }, + "node_modules/@types/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw==", + "optional": true, + "dependencies": { + "@types/d3-selection": "^1" + } + }, + "node_modules/@types/d3-dsv": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.2.1.tgz", + "integrity": "sha512-LLmJmjiqp/fTNEdij5bIwUJ6P6TVNk5hKM9/uk5RPO2YNgEu9XvKO0dJ7Iqd3psEdmZN1m7gB1bOsjr4HmO2BA==", + "optional": true + }, + "node_modules/@types/d3-ease": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.11.tgz", + "integrity": "sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA==", + "optional": true + }, + "node_modules/@types/d3-force": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.4.tgz", + "integrity": "sha512-fkorLTKvt6AQbFBQwn4aq7h9rJ4c7ZVcPMGB8X6eFFveAyMZcv7t7m6wgF4Eg93rkPgPORU7sAho1QSHNcZu6w==", + "optional": true + }, + "node_modules/@types/d3-format": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.2.tgz", + "integrity": "sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ==", + "optional": true + }, + "node_modules/@types/d3-geo": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.12.3.tgz", + "integrity": "sha512-yZbPb7/5DyL/pXkeOmZ7L5ySpuGr4H48t1cuALjnJy5sXQqmSSAYBiwa6Ya/XpWKX2rJqGDDubmh3nOaopOpeA==", + "optional": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==", + "optional": true + }, + "node_modules/@types/d3-interpolate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz", + "integrity": "sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg==", + "optional": true, + "dependencies": { + "@types/d3-color": "^1" + } + }, + "node_modules/@types/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==", + "optional": true + }, + "node_modules/@types/d3-polygon": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.8.tgz", + "integrity": "sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw==", + "optional": true + }, + "node_modules/@types/d3-quadtree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.9.tgz", + "integrity": "sha512-5E0OJJn2QVavITFEc1AQlI8gLcIoDZcTKOD3feKFckQVmFV4CXhqRFt83tYNVNIN4ZzRkjlAMavJa1ldMhf5rA==", + "optional": true + }, + "node_modules/@types/d3-queue": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-queue/-/d3-queue-3.0.8.tgz", + "integrity": "sha512-1FWOiI/MYwS5Z1Sa9EvS1Xet3isiVIIX5ozD6iGnwHonGcqL+RcC1eThXN5VfDmAiYt9Me9EWNEv/9J9k9RIKQ==", + "optional": true + }, + "node_modules/@types/d3-random": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.3.tgz", + "integrity": "sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ==", + "optional": true + }, + "node_modules/@types/d3-request": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-request/-/d3-request-1.0.6.tgz", + "integrity": "sha512-4nRKDUBg3EBx8VowpMvM3NAVMiMMI1qFUOYv3OJsclGjHX6xjtu09nsWhRQ0fvSUla3MEjb5Ch4IeaYarMEi1w==", + "optional": true, + "dependencies": { + "@types/d3-dsv": "^1" + } + }, + "node_modules/@types/d3-scale": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.17.tgz", + "integrity": "sha512-baIP5/gw+PS8Axs1lfZCeIjcOXen/jxQmgFEjbYThwaj2drvivOIrJMh2Ig4MeenrogCH6zkhiOxCPRkvN1scA==", + "optional": true, + "dependencies": { + "@types/d3-time": "^1" + } + }, + "node_modules/@types/d3-selection": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz", + "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA==", + "optional": true + }, + "node_modules/@types/d3-shape": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz", + "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", + "optional": true, + "dependencies": { + "@types/d3-path": "^1" + } + }, + "node_modules/@types/d3-time": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.1.tgz", + "integrity": "sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw==", + "optional": true + }, + "node_modules/@types/d3-time-format": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.1.tgz", + "integrity": "sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA==", + "optional": true + }, + "node_modules/@types/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg==", + "optional": true + }, + "node_modules/@types/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-J+a3SuF/E7wXbOSN19p8ZieQSFIm5hU2Egqtndbc54LXaAEOpLfDx4sBu/PKAKzHOdgKK1wkMhINKqNh4aoZAg==", + "optional": true, + "dependencies": { + "@types/d3-selection": "^1" + } + }, + "node_modules/@types/d3-voronoi": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz", + "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==", + "optional": true + }, + "node_modules/@types/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-3kHkL6sPiDdbfGhzlp5gIHyu3kULhtnHTTAl3UBZVtWB1PzcLL8vdmz5mTx7plLiUqOA2Y+yT2GKjt/TdA2p7Q==", + "optional": true, + "dependencies": { + "@types/d3-interpolate": "^1", + "@types/d3-selection": "^1" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==", + "optional": true + }, + "node_modules/angular": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz", + "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-cookies": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.8.3.tgz", + "integrity": "sha512-uRd+zWgqiVnly7+YFRosM8E9tUQeY82dAZdtvonh/CeD/sf5SKN/BNIlMlHxZtoAk72ahTIjqUQGfeHdYcSsRQ==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-loader": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-loader/-/angular-loader-1.8.3.tgz", + "integrity": "sha512-7Jn0hg811k5QAijcXCVCszySXTtakaNEe11MfGiZP3/eBkmSTkUc9z+DiAJ+VVmDlu+SVSF81Ahj0iXjSBQfwQ==" + }, + "node_modules/angular-resource": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-resource/-/angular-resource-1.8.3.tgz", + "integrity": "sha512-x3+4w2SyIDEIe6PUBTzcjDFI5MhZNWAPELUxkYK0QMOkOo4w3BN/qhpd+fO1deFiDS23mZKqT8kfctO1IDkCDA==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-route": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.8.3.tgz", + "integrity": "sha512-kpIcRmDR2+o1FxDVVYy8Rvfab86/7LDbOgTRb9T+X9ewPQiBRuDEnZtM3oJYBiQLvAXDYTJXHV48n/bGE9Mv2g==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-sanitize": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.3.tgz", + "integrity": "sha512-2rxdqzlUVafUeWOwvY/FtyWk1pFTyCtzreeiTytG9m4smpuAEKaIJAjYeVwWsoV+nlTOcgpwV4W1OCmR+BQbUg==", + "deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward." + }, + "node_modules/angular-translate": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz", + "integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==", + "dependencies": { + "angular": "^1.8.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/angular-translate-loader-url": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/angular-translate-loader-url/-/angular-translate-loader-url-2.19.0.tgz", + "integrity": "sha512-PptW0ExcwWKroEnXjIYg8fvvfnhM1buhVep1vOIowLqQV+HyRyonxGauEbCuOsMqPJARGM24WJtPnk4X2blhSg==", + "dependencies": { + "angular-translate": "~2.19.0" + } + }, + "node_modules/angular-treeview": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/angular-treeview/-/angular-treeview-0.1.5.tgz", + "integrity": "sha1-7Hl9TQAbIBcsmD5l2FXrzYFStPo=" + }, + "node_modules/angular-ui-select2": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/angular-ui-select2/-/angular-ui-select2-0.0.5.tgz", + "integrity": "sha1-FedkOv1pypBj1AXrO+L5XdXsh/U=", + "engines": { + "node": ">= 0.8.4" + } + }, + "node_modules/autofill-event": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/autofill-event/-/autofill-event-0.0.1.tgz", + "integrity": "sha1-w4LPmJshth/0oSs1l+GUNHHTz3o=" + }, + "node_modules/bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bootstrap-datepicker": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz", + "integrity": "sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==", + "optional": true, + "dependencies": { + "jquery": ">=1.7.1 <4.0.0" + } + }, + "node_modules/bootstrap-sass": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", + "integrity": "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==", + "optional": true + }, + "node_modules/bootstrap-select": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.12.2.tgz", + "integrity": "sha1-WNCVs/1YSzFEOGb745tv3U5OEqQ=", + "optional": true, + "dependencies": { + "jquery": ">=1.8" + } + }, + "node_modules/bootstrap-slider": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", + "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=", + "optional": true + }, + "node_modules/bootstrap-switch": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz", + "integrity": "sha1-cOCusqh3wNx2aZHeEI4hcPwpov8=", + "optional": true, + "peerDependencies": { + "bootstrap": "^3.1.1", + "jquery": ">=1.9.0" + } + }, + "node_modules/bootstrap-touchspin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz", + "integrity": "sha1-l3nerHKq9Xfl52K4USx0fIcdlZc=", + "optional": true + }, + "node_modules/c3": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.24.tgz", + "integrity": "sha512-mVCFtN5ZWUT5UE7ilFQ7KBQ7TUCdKIq6KsDt1hH/1m6gC1tBjvzFTO7fqhaiWHfhNOjjM7makschdhg6DkWQMA==", + "optional": true, + "dependencies": { + "d3": "~3.5.0" + } + }, + "node_modules/d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", + "optional": true + }, + "node_modules/datatables.net": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.11.4.tgz", + "integrity": "sha512-z9LG4O0VYOYzp+rnArLExvnUWV8ikyWBcHYZEKDfVuz7BKxQdEq4a/tpO0Trbm+FL1+RY7UEIh+UcYNY/hwGxA==", + "optional": true, + "dependencies": { + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-bs": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.11.4.tgz", + "integrity": "sha512-lQaytqSOcSv51jFoT7RyDbaoziCStSDl5Ym1yOBP+ZXIOsS9fd4zOFZyDQlmGFyUpa8JAy84C4r8jM1GQ3/olA==", + "optional": true, + "dependencies": { + "datatables.net": ">=1.11.3", + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-colreorder": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.5.5.tgz", + "integrity": "sha512-AUwv5A/87I4hg7GY/WbhRrDhqng9b019jLvvKutHibSPCEtMDWqyNtuP0q8zYoquqU9UQ1/nqXLW/ld8TzIDYQ==", + "optional": true, + "dependencies": { + "datatables.net": ">=1.11.3", + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-colreorder-bs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz", + "integrity": "sha1-Op3LCN7r612FQHlZHgbkk615OlM=", + "optional": true, + "dependencies": { + "datatables.net-bs": ">=1.10.9", + "datatables.net-colreorder": ">=1.2.0", + "jquery": ">=1.7" + } + }, + "node_modules/datatables.net-select": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.7.tgz", + "integrity": "sha512-C3XDi7wpruGjDXV36dc9hN/FrAX9GOFvBZ7+KfKJTBNkGFbbhdzHS91SMeGiwRXPYivAyxfPTcVVndVaO83uBQ==", + "optional": true, + "dependencies": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "node_modules/drmonty-datatables-colvis": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz", + "integrity": "sha1-lque37SGQ8wu3aP4e4iTPN7oEnw=", + "optional": true, + "dependencies": { + "jquery": ">=1.7.0" + } + }, + "node_modules/eonasdan-bootstrap-datetimepicker": { + "version": "4.17.49", + "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.49.tgz", + "integrity": "sha512-7KZeDpkj+A6AtPR3XjX8gAnRPUkPSfW0OmMANG1dkUOPMtLSzbyoCjDIdEcfRtQPU5X0D9Gob7wWKn0h4QWy7A==", + "optional": true, + "dependencies": { + "bootstrap": "^3.3", + "jquery": "^3.5.1", + "moment": "^2.10", + "moment-timezone": "^0.4.0" + }, + "peerDependencies": { + "bootstrap": "^3.3", + "jquery": "^1.8.3 || ^2.0 || ^3.0", + "moment": "^2.10", + "moment-timezone": "^0.4.0 || ^0.5.0" + } + }, + "node_modules/filesaver": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/filesaver/-/filesaver-0.0.13.tgz", + "integrity": "sha1-+psqwTcdQ2/l7ckoXtmY0eJ4K+4=", + "dependencies": { + "mkdirp": "^0.5.0", + "safename": "0.0.4" + } + }, + "node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", + "engines": { + "node": ">=0.10.3" + } + }, + "node_modules/font-awesome-sass": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz", + "integrity": "sha1-TtppPpFQCc4Asijglk3F7Km8NOE=", + "optional": true + }, + "node_modules/google-code-prettify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz", + "integrity": "sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ=", + "optional": true + }, + "node_modules/jquery": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", + "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==" + }, + "node_modules/jquery-match-height": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz", + "integrity": "sha1-+NnzulMU2qsQnPB0CGdL4gS+Xw4=", + "optional": true + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", + "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", + "optional": true, + "dependencies": { + "moment": ">= 2.6.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ng-file-upload": { + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/ng-file-upload/-/ng-file-upload-12.2.13.tgz", + "integrity": "sha1-AYAPOHLlJvlTEPhHfpnk8S0NjRQ=" + }, + "node_modules/patternfly": { + "version": "3.59.5", + "resolved": "https://registry.npmjs.org/patternfly/-/patternfly-3.59.5.tgz", + "integrity": "sha512-SMQynv9eFrWWG0Ujta5+jPjxHdQB3xkTLiDW5VP8XXc0nGUxXb4EnZh21qiMeGGJYaKpu9CzaPEpCvuBxgYWHQ==", + "dependencies": { + "bootstrap": "~3.4.1", + "font-awesome": "^4.7.0", + "jquery": "~3.4.1" + }, + "optionalDependencies": { + "@types/c3": "^0.6.0", + "bootstrap-datepicker": "^1.7.1", + "bootstrap-sass": "^3.4.0", + "bootstrap-select": "1.12.2", + "bootstrap-slider": "^9.9.0", + "bootstrap-switch": "3.3.4", + "bootstrap-touchspin": "~3.1.1", + "c3": "~0.4.11", + "d3": "~3.5.17", + "datatables.net": "^1.10.15", + "datatables.net-colreorder": "^1.4.1", + "datatables.net-colreorder-bs": "~1.3.2", + "datatables.net-select": "~1.2.0", + "drmonty-datatables-colvis": "~1.1.2", + "eonasdan-bootstrap-datetimepicker": "^4.17.47", + "font-awesome-sass": "^4.7.0", + "google-code-prettify": "~1.0.5", + "jquery-match-height": "^0.7.2", + "moment": "^2.19.1", + "moment-timezone": "^0.4.1", + "patternfly-bootstrap-combobox": "~1.1.7", + "patternfly-bootstrap-treeview": "~2.1.10" + } + }, + "node_modules/patternfly-bootstrap-combobox": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz", + "integrity": "sha1-al48zRFwwhs8S0qhaKdBPh3btuE=", + "optional": true + }, + "node_modules/patternfly-bootstrap-treeview": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.10.tgz", + "integrity": "sha512-P9+iFu34CwX+R5Fd7/EWbxTug0q9mDj53PnZIIh5ie54KX2kD0+54lCWtpD9SVylDwDtDv3n3A6gbFVkx7HsuA==", + "optional": true, + "dependencies": { + "bootstrap": "^3.4.1", + "jquery": "^3.4.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/patternfly/node_modules/jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + }, + "node_modules/rcue": { + "version": "3.48.1", + "resolved": "https://registry.npmjs.org/rcue/-/rcue-3.48.1.tgz", + "integrity": "sha1-WJYbLVG/ez9uS8ETufYUiwWWP+M=", + "hasShrinkwrap": true, + "dependencies": { + "bootstrap": "~3.3.7", + "font-awesome": "^4.7.0", + "jquery": "~3.2.1", + "patternfly": "3.48.1" + }, + "optionalDependencies": { + "bootstrap-datepicker": "^1.7.1", + "bootstrap-select": "^1.12.2", + "bootstrap-slider": "^9.9.0", + "bootstrap-switch": "~3.3.4", + "bootstrap-touchspin": "~3.1.1", + "c3": "~0.4.11", + "d3": "~3.5.17", + "datatables.net": "^1.10.15", + "datatables.net-colreorder": "^1.4.1", + "datatables.net-colreorder-bs": "~1.3.2", + "datatables.net-select": "~1.2.0", + "drmonty-datatables-colvis": "~1.1.2", + "eonasdan-bootstrap-datetimepicker": "^4.17.47", + "google-code-prettify": "~1.0.5", + "jquery-match-height": "^0.7.2", + "moment": "^2.19.1", + "moment-timezone": "^0.4.1", + "patternfly-bootstrap-combobox": "~1.1.7", + "patternfly-bootstrap-treeview": "~2.1.0" + } + }, + "node_modules/rcue/node_modules/bootstrap": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz" + }, + "node_modules/rcue/node_modules/bootstrap-datepicker": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.8.0.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/bootstrap-select": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.13.1.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/bootstrap-slider": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/bootstrap-switch": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/bootstrap-touchspin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/c3": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.23.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/datatables.net": { + "version": "1.10.16", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.16.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/datatables.net-colreorder": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.4.1.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/datatables.net-colreorder-bs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/datatables.net-select": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.5.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/drmonty-datatables-colvis": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/eonasdan-bootstrap-datetimepicker": { + "version": "4.17.47", + "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz" + }, + "node_modules/rcue/node_modules/google-code-prettify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz" + }, + "node_modules/rcue/node_modules/jquery-match-height": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/moment-timezone": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/patternfly": { + "version": "3.48.1", + "resolved": "https://registry.npmjs.org/patternfly/-/patternfly-3.48.1.tgz" + }, + "node_modules/rcue/node_modules/patternfly-bootstrap-combobox": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz", + "optional": true + }, + "node_modules/rcue/node_modules/patternfly-bootstrap-treeview": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.5.tgz", + "optional": true + }, + "node_modules/safename": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/safename/-/safename-0.0.4.tgz", + "integrity": "sha1-uCw7bbcNlDoFgvkFL7+/67tYmvU=" + }, + "node_modules/select2": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/select2/-/select2-3.5.1.tgz", + "integrity": "sha1-8oGUibvGX9bTKL5yu+K5XdfofP4=" + }, + "node_modules/text-security": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/text-security/-/text-security-3.2.1.tgz", + "integrity": "sha512-MjDQ3lyLeLqcGqZfQCZ6kvjQiuNfJaicdgIczPJDtD4tj0vIPT8WwIOKTi8wgXCVS/F1WJmapO3SppXemrwbIA==" + } + }, + "dependencies": { + "@types/c3": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@types/c3/-/c3-0.6.4.tgz", + "integrity": "sha512-W7i7oSmHsXYhseZJsIYexelv9HitGsWdQhx3mcy4NWso+GedpCYr02ghpkNvnZ4oTIjNeISdrOnM70s7HiuV+g==", + "optional": true, + "requires": { + "@types/d3": "^4" + } + }, + "@types/d3": { + "version": "4.13.12", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-4.13.12.tgz", + "integrity": "sha512-/bbFtkOBc04gGGN8N9rMG5ps3T0eIj5I8bnYe9iIyeM5qoOrydPCbFYlEPUnj2h9ibc2i+QZfDam9jY5XTrTxQ==", + "optional": true, + "requires": { + "@types/d3-array": "^1", + "@types/d3-axis": "^1", + "@types/d3-brush": "^1", + "@types/d3-chord": "^1", + "@types/d3-collection": "*", + "@types/d3-color": "^1", + "@types/d3-dispatch": "^1", + "@types/d3-drag": "^1", + "@types/d3-dsv": "^1", + "@types/d3-ease": "^1", + "@types/d3-force": "^1", + "@types/d3-format": "^1", + "@types/d3-geo": "^1", + "@types/d3-hierarchy": "^1", + "@types/d3-interpolate": "^1", + "@types/d3-path": "^1", + "@types/d3-polygon": "^1", + "@types/d3-quadtree": "^1", + "@types/d3-queue": "*", + "@types/d3-random": "^1", + "@types/d3-request": "*", + "@types/d3-scale": "^1", + "@types/d3-selection": "^1", + "@types/d3-shape": "^1", + "@types/d3-time": "^1", + "@types/d3-time-format": "^2", + "@types/d3-timer": "^1", + "@types/d3-transition": "^1", + "@types/d3-voronoi": "*", + "@types/d3-zoom": "^1" + } + }, + "@types/d3-array": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-1.2.9.tgz", + "integrity": "sha512-E/7RgPr2ylT5dWG0CswMi9NpFcjIEDqLcUSBgNHe/EMahfqYaTx4zhcggG3khqoEB/leY4Vl6nTSbwLUPjXceA==", + "optional": true + }, + "@types/d3-axis": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-1.0.16.tgz", + "integrity": "sha512-p7085weOmo4W+DzlRRVC/7OI/jugaKbVa6WMQGCQscaMylcbuaVEGk7abJLNyGVFLeCBNrHTdDiqRGnzvL0nXQ==", + "optional": true, + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-brush": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-1.1.5.tgz", + "integrity": "sha512-4zGkBafJf5zCsBtLtvDj/pNMo5X9+Ii/1hUz0GvQ+wEwelUBm2AbIDAzJnp2hLDFF307o0fhxmmocHclhXC+tw==", + "optional": true, + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-chord": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-1.0.11.tgz", + "integrity": "sha512-0DdfJ//bxyW3G9Nefwq/LDgazSKNN8NU0lBT3Cza6uVuInC2awMNsAcv1oKyRFLn9z7kXClH5XjwpveZjuz2eg==", + "optional": true + }, + "@types/d3-collection": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-collection/-/d3-collection-1.0.10.tgz", + "integrity": "sha512-54Fdv8u5JbuXymtmXm2SYzi1x/Svt+jfWBU5junkhrCewL92VjqtCBDn97coBRVwVFmYNnVTNDyV8gQyPYfm+A==", + "optional": true + }, + "@types/d3-color": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.2.tgz", + "integrity": "sha512-fYtiVLBYy7VQX+Kx7wU/uOIkGQn8aAEY8oWMoyja3N4dLd8Yf6XgSIR/4yWvMuveNOH5VShnqCgRqqh/UNanBA==", + "optional": true + }, + "@types/d3-dispatch": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-1.0.9.tgz", + "integrity": "sha512-zJ44YgjqALmyps+II7b1mZLhrtfV/FOxw9owT87mrweGWcg+WK5oiJX2M3SYJ0XUAExBduarysfgbR11YxzojQ==", + "optional": true + }, + "@types/d3-drag": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-1.2.5.tgz", + "integrity": "sha512-7NeTnfolst1Js3Vs7myctBkmJWu6DMI3k597AaHUX98saHjHWJ6vouT83UrpE+xfbSceHV+8A0JgxuwgqgmqWw==", + "optional": true, + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-dsv": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-1.2.1.tgz", + "integrity": "sha512-LLmJmjiqp/fTNEdij5bIwUJ6P6TVNk5hKM9/uk5RPO2YNgEu9XvKO0dJ7Iqd3psEdmZN1m7gB1bOsjr4HmO2BA==", + "optional": true + }, + "@types/d3-ease": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-1.0.11.tgz", + "integrity": "sha512-wUigPL0kleGZ9u3RhzBP07lxxkMcUjL5IODP42mN/05UNL+JJCDnpEPpFbJiPvLcTeRKGIRpBBJyP/1BNwYsVA==", + "optional": true + }, + "@types/d3-force": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-1.2.4.tgz", + "integrity": "sha512-fkorLTKvt6AQbFBQwn4aq7h9rJ4c7ZVcPMGB8X6eFFveAyMZcv7t7m6wgF4Eg93rkPgPORU7sAho1QSHNcZu6w==", + "optional": true + }, + "@types/d3-format": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-1.4.2.tgz", + "integrity": "sha512-WeGCHAs7PHdZYq6lwl/+jsl+Nfc1J2W1kNcMeIMYzQsT6mtBDBgtJ/rcdjZ0k0rVIvqEZqhhuD5TK/v3P2gFHQ==", + "optional": true + }, + "@types/d3-geo": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-1.12.3.tgz", + "integrity": "sha512-yZbPb7/5DyL/pXkeOmZ7L5ySpuGr4H48t1cuALjnJy5sXQqmSSAYBiwa6Ya/XpWKX2rJqGDDubmh3nOaopOpeA==", + "optional": true, + "requires": { + "@types/geojson": "*" + } + }, + "@types/d3-hierarchy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-1.1.8.tgz", + "integrity": "sha512-AbStKxNyWiMDQPGDguG2Kuhlq1Sv539pZSxYbx4UZeYkutpPwXCcgyiRrlV4YH64nIOsKx7XVnOMy9O7rJsXkg==", + "optional": true + }, + "@types/d3-interpolate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-1.4.2.tgz", + "integrity": "sha512-ylycts6llFf8yAEs1tXzx2loxxzDZHseuhPokrqKprTQSTcD3JbJI1omZP1rphsELZO3Q+of3ff0ZS7+O6yVzg==", + "optional": true, + "requires": { + "@types/d3-color": "^1" + } + }, + "@types/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ==", + "optional": true + }, + "@types/d3-polygon": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-1.0.8.tgz", + "integrity": "sha512-1TOJPXCBJC9V3+K3tGbTqD/CsqLyv/YkTXAcwdsZzxqw5cvpdnCuDl42M4Dvi8XzMxZNCT9pL4ibrK2n4VmAcw==", + "optional": true + }, + "@types/d3-quadtree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-1.0.9.tgz", + "integrity": "sha512-5E0OJJn2QVavITFEc1AQlI8gLcIoDZcTKOD3feKFckQVmFV4CXhqRFt83tYNVNIN4ZzRkjlAMavJa1ldMhf5rA==", + "optional": true + }, + "@types/d3-queue": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-queue/-/d3-queue-3.0.8.tgz", + "integrity": "sha512-1FWOiI/MYwS5Z1Sa9EvS1Xet3isiVIIX5ozD6iGnwHonGcqL+RcC1eThXN5VfDmAiYt9Me9EWNEv/9J9k9RIKQ==", + "optional": true + }, + "@types/d3-random": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-1.1.3.tgz", + "integrity": "sha512-XXR+ZbFCoOd4peXSMYJzwk0/elP37WWAzS/DG+90eilzVbUSsgKhBcWqylGWe+lA2ubgr7afWAOBaBxRgMUrBQ==", + "optional": true + }, + "@types/d3-request": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-request/-/d3-request-1.0.6.tgz", + "integrity": "sha512-4nRKDUBg3EBx8VowpMvM3NAVMiMMI1qFUOYv3OJsclGjHX6xjtu09nsWhRQ0fvSUla3MEjb5Ch4IeaYarMEi1w==", + "optional": true, + "requires": { + "@types/d3-dsv": "^1" + } + }, + "@types/d3-scale": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-1.0.17.tgz", + "integrity": "sha512-baIP5/gw+PS8Axs1lfZCeIjcOXen/jxQmgFEjbYThwaj2drvivOIrJMh2Ig4MeenrogCH6zkhiOxCPRkvN1scA==", + "optional": true, + "requires": { + "@types/d3-time": "^1" + } + }, + "@types/d3-selection": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz", + "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA==", + "optional": true + }, + "@types/d3-shape": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.8.tgz", + "integrity": "sha512-gqfnMz6Fd5H6GOLYixOZP/xlrMtJms9BaS+6oWxTKHNqPGZ93BkWWupQSCYm6YHqx6h9wjRupuJb90bun6ZaYg==", + "optional": true, + "requires": { + "@types/d3-path": "^1" + } + }, + "@types/d3-time": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-1.1.1.tgz", + "integrity": "sha512-ULX7LoqXTCYtM+tLYOaeAJK7IwCT+4Gxlm2MaH0ErKLi07R5lh8NHCAyWcDkCCmx1AfRcBEV6H9QE9R25uP7jw==", + "optional": true + }, + "@types/d3-time-format": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.3.1.tgz", + "integrity": "sha512-fck0Z9RGfIQn3GJIEKVrp15h9m6Vlg0d5XXeiE/6+CQiBmMDZxfR21XtjEPuDeg7gC3bBM0SdieA5XF3GW1wKA==", + "optional": true + }, + "@types/d3-timer": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-1.0.10.tgz", + "integrity": "sha512-ZnAbquVqy+4ZjdW0cY6URp+qF/AzTVNda2jYyOzpR2cPT35FTXl78s15Bomph9+ckOiI1TtkljnWkwbIGAb6rg==", + "optional": true + }, + "@types/d3-transition": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-1.3.2.tgz", + "integrity": "sha512-J+a3SuF/E7wXbOSN19p8ZieQSFIm5hU2Egqtndbc54LXaAEOpLfDx4sBu/PKAKzHOdgKK1wkMhINKqNh4aoZAg==", + "optional": true, + "requires": { + "@types/d3-selection": "^1" + } + }, + "@types/d3-voronoi": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@types/d3-voronoi/-/d3-voronoi-1.1.9.tgz", + "integrity": "sha512-DExNQkaHd1F3dFPvGA/Aw2NGyjMln6E9QzsiqOcBgnE+VInYnFBHBBySbZQts6z6xD+5jTfKCP7M4OqMyVjdwQ==", + "optional": true + }, + "@types/d3-zoom": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-1.8.3.tgz", + "integrity": "sha512-3kHkL6sPiDdbfGhzlp5gIHyu3kULhtnHTTAl3UBZVtWB1PzcLL8vdmz5mTx7plLiUqOA2Y+yT2GKjt/TdA2p7Q==", + "optional": true, + "requires": { + "@types/d3-interpolate": "^1", + "@types/d3-selection": "^1" + } + }, + "@types/geojson": { + "version": "7946.0.8", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.8.tgz", + "integrity": "sha512-1rkryxURpr6aWP7R786/UQOkJ3PcpQiWkAXBmdWc7ryFWqN6a4xfK7BtjXvFBKO9LjQ+MWQSWxYeZX1OApnArA==", + "optional": true + }, + "angular": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz", + "integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==" + }, + "angular-cookies": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.8.3.tgz", + "integrity": "sha512-uRd+zWgqiVnly7+YFRosM8E9tUQeY82dAZdtvonh/CeD/sf5SKN/BNIlMlHxZtoAk72ahTIjqUQGfeHdYcSsRQ==" + }, + "angular-loader": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-loader/-/angular-loader-1.8.3.tgz", + "integrity": "sha512-7Jn0hg811k5QAijcXCVCszySXTtakaNEe11MfGiZP3/eBkmSTkUc9z+DiAJ+VVmDlu+SVSF81Ahj0iXjSBQfwQ==" + }, + "angular-resource": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-resource/-/angular-resource-1.8.3.tgz", + "integrity": "sha512-x3+4w2SyIDEIe6PUBTzcjDFI5MhZNWAPELUxkYK0QMOkOo4w3BN/qhpd+fO1deFiDS23mZKqT8kfctO1IDkCDA==" + }, + "angular-route": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.8.3.tgz", + "integrity": "sha512-kpIcRmDR2+o1FxDVVYy8Rvfab86/7LDbOgTRb9T+X9ewPQiBRuDEnZtM3oJYBiQLvAXDYTJXHV48n/bGE9Mv2g==" + }, + "angular-sanitize": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.3.tgz", + "integrity": "sha512-2rxdqzlUVafUeWOwvY/FtyWk1pFTyCtzreeiTytG9m4smpuAEKaIJAjYeVwWsoV+nlTOcgpwV4W1OCmR+BQbUg==" + }, + "angular-translate": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz", + "integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==", + "requires": { + "angular": "^1.8.0" + } + }, + "angular-translate-loader-url": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/angular-translate-loader-url/-/angular-translate-loader-url-2.19.0.tgz", + "integrity": "sha512-PptW0ExcwWKroEnXjIYg8fvvfnhM1buhVep1vOIowLqQV+HyRyonxGauEbCuOsMqPJARGM24WJtPnk4X2blhSg==", + "requires": { + "angular-translate": "~2.19.0" + } + }, + "angular-treeview": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/angular-treeview/-/angular-treeview-0.1.5.tgz", + "integrity": "sha1-7Hl9TQAbIBcsmD5l2FXrzYFStPo=" + }, + "angular-ui-select2": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/angular-ui-select2/-/angular-ui-select2-0.0.5.tgz", + "integrity": "sha1-FedkOv1pypBj1AXrO+L5XdXsh/U=" + }, + "autofill-event": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/autofill-event/-/autofill-event-0.0.1.tgz", + "integrity": "sha1-w4LPmJshth/0oSs1l+GUNHHTz3o=" + }, + "bootstrap": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.4.1.tgz", + "integrity": "sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA==" + }, + "bootstrap-datepicker": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.9.0.tgz", + "integrity": "sha512-9rYYbaVOheGYxjOr/+bJCmRPihfy+LkLSg4fIFMT9Od8WwWB/MB50w0JO1eBgKUMbb7PFHQD5uAfI3ArAxZRXA==", + "optional": true, + "requires": { + "jquery": ">=1.7.1 <4.0.0" + } + }, + "bootstrap-sass": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", + "integrity": "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==", + "optional": true + }, + "bootstrap-select": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.12.2.tgz", + "integrity": "sha1-WNCVs/1YSzFEOGb745tv3U5OEqQ=", + "optional": true, + "requires": { + "jquery": ">=1.8" + } + }, + "bootstrap-slider": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", + "integrity": "sha1-EQPWvADPv6jPyaJZmrUYxVZD2j8=", + "optional": true + }, + "bootstrap-switch": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz", + "integrity": "sha1-cOCusqh3wNx2aZHeEI4hcPwpov8=", + "optional": true, + "requires": {} + }, + "bootstrap-touchspin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz", + "integrity": "sha1-l3nerHKq9Xfl52K4USx0fIcdlZc=", + "optional": true + }, + "c3": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.24.tgz", + "integrity": "sha512-mVCFtN5ZWUT5UE7ilFQ7KBQ7TUCdKIq6KsDt1hH/1m6gC1tBjvzFTO7fqhaiWHfhNOjjM7makschdhg6DkWQMA==", + "optional": true, + "requires": { + "d3": "~3.5.0" + } + }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "integrity": "sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g=", + "optional": true + }, + "datatables.net": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.11.4.tgz", + "integrity": "sha512-z9LG4O0VYOYzp+rnArLExvnUWV8ikyWBcHYZEKDfVuz7BKxQdEq4a/tpO0Trbm+FL1+RY7UEIh+UcYNY/hwGxA==", + "optional": true, + "requires": { + "jquery": ">=1.7" + } + }, + "datatables.net-bs": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/datatables.net-bs/-/datatables.net-bs-1.11.4.tgz", + "integrity": "sha512-lQaytqSOcSv51jFoT7RyDbaoziCStSDl5Ym1yOBP+ZXIOsS9fd4zOFZyDQlmGFyUpa8JAy84C4r8jM1GQ3/olA==", + "optional": true, + "requires": { + "datatables.net": ">=1.11.3", + "jquery": ">=1.7" + } + }, + "datatables.net-colreorder": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.5.5.tgz", + "integrity": "sha512-AUwv5A/87I4hg7GY/WbhRrDhqng9b019jLvvKutHibSPCEtMDWqyNtuP0q8zYoquqU9UQ1/nqXLW/ld8TzIDYQ==", + "optional": true, + "requires": { + "datatables.net": ">=1.11.3", + "jquery": ">=1.7" + } + }, + "datatables.net-colreorder-bs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz", + "integrity": "sha1-Op3LCN7r612FQHlZHgbkk615OlM=", + "optional": true, + "requires": { + "datatables.net-bs": ">=1.10.9", + "datatables.net-colreorder": ">=1.2.0", + "jquery": ">=1.7" + } + }, + "datatables.net-select": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.7.tgz", + "integrity": "sha512-C3XDi7wpruGjDXV36dc9hN/FrAX9GOFvBZ7+KfKJTBNkGFbbhdzHS91SMeGiwRXPYivAyxfPTcVVndVaO83uBQ==", + "optional": true, + "requires": { + "datatables.net": "^1.10.15", + "jquery": ">=1.7" + } + }, + "drmonty-datatables-colvis": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz", + "integrity": "sha1-lque37SGQ8wu3aP4e4iTPN7oEnw=", + "optional": true, + "requires": { + "jquery": ">=1.7.0" + } + }, + "eonasdan-bootstrap-datetimepicker": { + "version": "4.17.49", + "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.49.tgz", + "integrity": "sha512-7KZeDpkj+A6AtPR3XjX8gAnRPUkPSfW0OmMANG1dkUOPMtLSzbyoCjDIdEcfRtQPU5X0D9Gob7wWKn0h4QWy7A==", + "optional": true, + "requires": { + "bootstrap": "^3.3", + "jquery": "^3.5.1", + "moment": "^2.10", + "moment-timezone": "^0.4.0" + } + }, + "filesaver": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/filesaver/-/filesaver-0.0.13.tgz", + "integrity": "sha1-+psqwTcdQ2/l7ckoXtmY0eJ4K+4=", + "requires": { + "mkdirp": "^0.5.0", + "safename": "0.0.4" + } + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=" + }, + "font-awesome-sass": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz", + "integrity": "sha1-TtppPpFQCc4Asijglk3F7Km8NOE=", + "optional": true + }, + "google-code-prettify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz", + "integrity": "sha1-n0d/Ik2/piNy5e+AOn4VdBBAAIQ=", + "optional": true + }, + "jquery": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", + "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==" + }, + "jquery-match-height": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz", + "integrity": "sha1-+NnzulMU2qsQnPB0CGdL4gS+Xw4=", + "optional": true + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "optional": true + }, + "moment-timezone": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", + "integrity": "sha1-gfWYw61eIs2teWtn7NjYjQ9bqgY=", + "optional": true, + "requires": { + "moment": ">= 2.6.0" + } + }, + "ng-file-upload": { + "version": "12.2.13", + "resolved": "https://registry.npmjs.org/ng-file-upload/-/ng-file-upload-12.2.13.tgz", + "integrity": "sha1-AYAPOHLlJvlTEPhHfpnk8S0NjRQ=" + }, + "patternfly": { + "version": "3.59.5", + "resolved": "https://registry.npmjs.org/patternfly/-/patternfly-3.59.5.tgz", + "integrity": "sha512-SMQynv9eFrWWG0Ujta5+jPjxHdQB3xkTLiDW5VP8XXc0nGUxXb4EnZh21qiMeGGJYaKpu9CzaPEpCvuBxgYWHQ==", + "requires": { + "@types/c3": "^0.6.0", + "bootstrap": "~3.4.1", + "bootstrap-datepicker": "^1.7.1", + "bootstrap-sass": "^3.4.0", + "bootstrap-select": "1.12.2", + "bootstrap-slider": "^9.9.0", + "bootstrap-switch": "3.3.4", + "bootstrap-touchspin": "~3.1.1", + "c3": "~0.4.11", + "d3": "~3.5.17", + "datatables.net": "^1.10.15", + "datatables.net-colreorder": "^1.4.1", + "datatables.net-colreorder-bs": "~1.3.2", + "datatables.net-select": "~1.2.0", + "drmonty-datatables-colvis": "~1.1.2", + "eonasdan-bootstrap-datetimepicker": "^4.17.47", + "font-awesome": "^4.7.0", + "font-awesome-sass": "^4.7.0", + "google-code-prettify": "~1.0.5", + "jquery": "~3.4.1", + "jquery-match-height": "^0.7.2", + "moment": "^2.19.1", + "moment-timezone": "^0.4.1", + "patternfly-bootstrap-combobox": "~1.1.7", + "patternfly-bootstrap-treeview": "~2.1.10" + }, + "dependencies": { + "jquery": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.4.1.tgz", + "integrity": "sha512-36+AdBzCL+y6qjw5Tx7HgzeGCzC81MDDgaUP8ld2zhx58HdqXGoBd+tHdrBMiyjGQs0Hxs/MLZTu/eHNJJuWPw==" + } + } + }, + "patternfly-bootstrap-combobox": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz", + "integrity": "sha1-al48zRFwwhs8S0qhaKdBPh3btuE=", + "optional": true + }, + "patternfly-bootstrap-treeview": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.10.tgz", + "integrity": "sha512-P9+iFu34CwX+R5Fd7/EWbxTug0q9mDj53PnZIIh5ie54KX2kD0+54lCWtpD9SVylDwDtDv3n3A6gbFVkx7HsuA==", + "optional": true, + "requires": { + "bootstrap": "^3.4.1", + "jquery": "^3.4.1" + } + }, + "rcue": { + "version": "3.48.1", + "resolved": "https://registry.npmjs.org/rcue/-/rcue-3.48.1.tgz", + "integrity": "sha1-WJYbLVG/ez9uS8ETufYUiwWWP+M=", + "requires": { + "bootstrap": "~3.3.7", + "bootstrap-datepicker": "^1.7.1", + "bootstrap-select": "^1.12.2", + "bootstrap-slider": "^9.9.0", + "bootstrap-switch": "~3.3.4", + "bootstrap-touchspin": "~3.1.1", + "c3": "~0.4.11", + "d3": "~3.5.17", + "datatables.net": "^1.10.15", + "datatables.net-colreorder": "^1.4.1", + "datatables.net-colreorder-bs": "~1.3.2", + "datatables.net-select": "~1.2.0", + "drmonty-datatables-colvis": "~1.1.2", + "eonasdan-bootstrap-datetimepicker": "^4.17.47", + "font-awesome": "^4.7.0", + "google-code-prettify": "~1.0.5", + "jquery": "~3.2.1", + "jquery-match-height": "^0.7.2", + "moment": "^2.19.1", + "moment-timezone": "^0.4.1", + "patternfly": "3.48.1", + "patternfly-bootstrap-combobox": "~1.1.7", + "patternfly-bootstrap-treeview": "~2.1.0" + }, + "dependencies": { + "bootstrap": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz" + }, + "bootstrap-datepicker": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/bootstrap-datepicker/-/bootstrap-datepicker-1.8.0.tgz", + "optional": true + }, + "bootstrap-select": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/bootstrap-select/-/bootstrap-select-1.13.1.tgz", + "optional": true + }, + "bootstrap-slider": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/bootstrap-slider/-/bootstrap-slider-9.10.0.tgz", + "optional": true + }, + "bootstrap-switch": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/bootstrap-switch/-/bootstrap-switch-3.3.4.tgz", + "optional": true + }, + "bootstrap-touchspin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bootstrap-touchspin/-/bootstrap-touchspin-3.1.1.tgz", + "optional": true + }, + "c3": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/c3/-/c3-0.4.23.tgz", + "optional": true + }, + "d3": { + "version": "3.5.17", + "resolved": "https://registry.npmjs.org/d3/-/d3-3.5.17.tgz", + "optional": true + }, + "datatables.net": { + "version": "1.10.16", + "resolved": "https://registry.npmjs.org/datatables.net/-/datatables.net-1.10.16.tgz", + "optional": true + }, + "datatables.net-colreorder": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder/-/datatables.net-colreorder-1.4.1.tgz", + "optional": true + }, + "datatables.net-colreorder-bs": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/datatables.net-colreorder-bs/-/datatables.net-colreorder-bs-1.3.3.tgz", + "optional": true + }, + "datatables.net-select": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/datatables.net-select/-/datatables.net-select-1.2.5.tgz", + "optional": true + }, + "drmonty-datatables-colvis": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz", + "optional": true + }, + "eonasdan-bootstrap-datetimepicker": { + "version": "4.17.47", + "resolved": "https://registry.npmjs.org/eonasdan-bootstrap-datetimepicker/-/eonasdan-bootstrap-datetimepicker-4.17.47.tgz", + "optional": true + }, + "font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz" + }, + "google-code-prettify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/google-code-prettify/-/google-code-prettify-1.0.5.tgz", + "optional": true + }, + "jquery": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz" + }, + "jquery-match-height": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/jquery-match-height/-/jquery-match-height-0.7.2.tgz", + "optional": true + }, + "moment": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "optional": true + }, + "moment-timezone": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.4.1.tgz", + "optional": true + }, + "patternfly": { + "version": "3.48.1", + "resolved": "https://registry.npmjs.org/patternfly/-/patternfly-3.48.1.tgz" + }, + "patternfly-bootstrap-combobox": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-combobox/-/patternfly-bootstrap-combobox-1.1.7.tgz", + "optional": true + }, + "patternfly-bootstrap-treeview": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/patternfly-bootstrap-treeview/-/patternfly-bootstrap-treeview-2.1.5.tgz", + "optional": true + } + } + }, + "safename": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/safename/-/safename-0.0.4.tgz", + "integrity": "sha1-uCw7bbcNlDoFgvkFL7+/67tYmvU=" + }, + "select2": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/select2/-/select2-3.5.1.tgz", + "integrity": "sha1-8oGUibvGX9bTKL5yu+K5XdfofP4=" + }, + "text-security": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/text-security/-/text-security-3.2.1.tgz", + "integrity": "sha512-MjDQ3lyLeLqcGqZfQCZ6kvjQiuNfJaicdgIczPJDtD4tj0vIPT8WwIOKTi8wgXCVS/F1WJmapO3SppXemrwbIA==" + } + } +} diff --git a/themes/hellug-keycloak/common/resources/package.json b/themes/hellug-keycloak/common/resources/package.json new file mode 100644 index 0000000..f0a037b --- /dev/null +++ b/themes/hellug-keycloak/common/resources/package.json @@ -0,0 +1,29 @@ +{ + "name": "keycloak-npm-dependencies", + "version": "1.0.0", + "description": "Keycloak NPM Dependencies", + "license": "Apache-2.0", + "repository": "https://github.com/keycloak/keycloak", + "dependencies": { + "angular": "1.8.3", + "angular-cookies": "1.8.3", + "angular-loader": "1.8.3", + "angular-resource": "1.8.3", + "angular-route": "1.8.3", + "angular-sanitize": "1.8.3", + "angular-translate": "2.19.0", + "angular-translate-loader-url": "2.19.0", + "angular-treeview": "0.1.5", + "angular-ui-select2": "0.0.5", + "autofill-event": "0.0.1", + "bootstrap": "3.4.1", + "filesaver": "0.0.13", + "font-awesome": "4.7.0", + "jquery": "3.6.1", + "ng-file-upload": "12.2.13", + "patternfly": "3.59.5", + "rcue": "3.48.1", + "select2": "3.5.1", + "text-security": "3.2.1" + } +} diff --git a/themes/hellug-keycloak/email/messages/messages_el.properties b/themes/hellug-keycloak/email/messages/messages_el.properties new file mode 100644 index 0000000..bf6dd42 --- /dev/null +++ b/themes/hellug-keycloak/email/messages/messages_el.properties @@ -0,0 +1,53 @@ +# encoding: UTF-8 +requiredAction.terms_and_conditions=Όροι και Συνθήκες +requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=Δημιουργία Κωδικών Ανάκτησης +requiredAction.VERIFY_EMAIL=Επιβεβαίωση Email +requiredAction.UPDATE_PROFILE=Ενημέρωση Προφίλ +requiredAction.UPDATE_PASSWORD=Ενημέρωση Κωδικού Πρόσβασης +requiredAction.CONFIGURE_TOTP=Ρύθμιση OTP +executeActionsBodyHtml=

      Ο διαχειριστής σας ζητάει να ενημερώστε το λογαριασμός σας στο {2} με το να κάνετε την/τις ακόλουθες ενέργεια/ες:{3}. Πατήστε το σύνδεσμο παρακάτω για να ξεκινήσετε τη διαδικασία.

      Σύνδεσμος για ενημέρωση λογαριασμού

      Αυτός ο σύνδεσμος θα λήξει σε {4}.

      Αν δεν έχετε ενημερωθεί ότι ο διαχειριστής ζήτησε αυτήν την ενημέρωση, τότε απλώς αγνοήστε αυτό το μήνυμα και δεν θα αλλάξει τίποτα.

      +executeActionsBody=Ο διαχειριστής σας ζητάει να ενημερώστε το λογαριασμός σας στο {2} με το να κάνετε την/τις ακόλουθες ενέργεια/ες:{3}. Πατήστε το σύνδεσμο παρακάτω για να ξεκινήσετε τη διαδικασία.\n\n{0}\n\nΑυτός ο σύνδεσμος θα λήξει σε {4}.\n\nΑν δεν έχετε ενημερωθεί ότι ο διαχειριστής ζήτησε αυτήν την ενημέρωση, τότε απλώς αγνοήστε αυτό το μήνυμα και δεν θα αλλάξει τίποτα. +passwordResetBodyHtml=

      Κάποιος ζήτησε να αλλάξει τα διαπιστευτήρια του λογαριασμού σας στο {2}. Αν είσαστε εσείς, πατήστε το σύνδεσμο παρακάτω για να τα αλλάξετε.

      Σύνδεσμος για να αλλάξετε τα διαπιστευτήρια

      Αυτός ο σύνδεσμος και κωδικός θα λήξει σε {3}.

      Αν δεν θέλετε να αλλάξετε τα διαπιστευτήρια σας, τότε αγνοήστε αυτό το μήνυμα και δε θα αλλάξει τίποτα.

      +passwordResetBody=Κάποιος ζήτησε να αλλάξει τα διαπιστευτήρια του λογαριασμού σας στο {2}. Αν είσαστε εσείς, πατήστε το σύνδεσμο παρακάτω για να τα αλλάξετε.\n\n{0}\n\nΑυτός ο σύνδεσμος και κωδικός θα λήξει σε {3}.\n\nΑν δεν θέλετε να αλλάξετε τα διαπιστευτήρια σας, τότε αγνοήστε αυτό το μήνυμα και δε θα αλλάξει τίποτα. +identityProviderLinkBodyHtml=

      Κάποιος θέλει να συνδέσει το λογαριασμό σας στο {1} με ένα λογαριασμό του χρήστη {2} στο {0}. Αν είσαστε εσείς, πατήστε το σύνδεσμο παρακάτω για να συνδεθούν οι λογαριασμοί

      Σύνδεσμος για σύνδεση λογαριασμών

      Αυτός ο σύνδεσμος θα λήξει σε {5}.

      Αν δεν θέλετε να συνδέσετε το λογαριασμό, τότε αγνοήστε αυτό το μήνυμα. Αν συνδεθούν οι λογαριασμοί τότε θα μπορεί να γίνει είσοδος στο {1} μέσω του {0}.

      +identityProviderLinkBody=Κάποιος θέλει να συνδέσει το λογαριασμό σας στο "{1}" με ένα λογαριασμό του χρήστη {2} στο "{0}". Αν είσαστε εσείς, πατήστε το σύνδεσμο παρακάτω για να συνδεθούν οι λογαριασμοί\n\n{3}\n\nΑυτός ο σύνδεσμος θα λήξει σε {5}.\n\nΑν δεν θέλετε να συνδέσετε το λογαριασμό, τότε αγνοήστε αυτό το μήνυμα. Αν συνδεθούν οι λογαριασμοί τότε θα μπορεί να γίνει είσοδος στο {1} μέσω του {0}. +emailUpdateConfirmationBodyHtml=

      Για να ενημερώσετε το λογαριασμό σας {2} με διεύθυνση email {1}, πατήστε το σύνδεσμο παρακάτω

      {0}

      Ο σύνδεσμος θα λήξει σε {3}.

      Αν δεν θέλετε να προχωρήσετε με αυτή την αλλαγή, τότε αγνοήστε αυτό το μήνυμα.

      +emailUpdateConfirmationBody=Για να ενημερώσετε το λογαριασμό σας {2} με διεύθυνση email {1}, πατήστε το σύνδεσμο παρακάτω\n\n{0}\n\nΟ σύνδεσμος θα λήξει σε {3}.\n\nΑν δεν θέλετε να προχωρήσετε με αυτή την αλλαγή, τότε αγνοήστε αυτό το μήνυμα. +emailVerificationBodyCode=Παρακαλώ επιβεβαιώστε τη διεύθυνση email σας, εισάγοντας το παρακάτω κωδικό.\n\n{0}\n\n. +emailVerificationBodyCodeHtml=

      Παρακαλώ επιβεβαιώστε τη διεύθυνση email σας, εισάγοντας το παρακάτω κωδικό.

      {0}

      +linkExpirationFormatter.timePeriodUnit.days.1=μέρα +linkExpirationFormatter.timePeriodUnit.days=μέρες +linkExpirationFormatter.timePeriodUnit.hours.1=ώρα +#for language which have more unit plural forms depending on the value (eg. Czech and other Slavic langs) you can override unit text for some other values like this: +#linkExpirationFormatter.timePeriodUnit.minutes.2=minuty +#linkExpirationFormatter.timePeriodUnit.minutes.3=minuty +#linkExpirationFormatter.timePeriodUnit.minutes.4=minuty +linkExpirationFormatter.timePeriodUnit.hours=ώρες +linkExpirationFormatter.timePeriodUnit.minutes.1=λεπτό +linkExpirationFormatter.timePeriodUnit.minutes=λεπτά +linkExpirationFormatter.timePeriodUnit.seconds.1=δευτερόλεπτο + +# units for link expiration timeout formatting +linkExpirationFormatter.timePeriodUnit.seconds=δευτερόλεπτα +eventUpdateTotpBodyHtml=

      Η πρόσβαση μέσω OTP ενημερώθηκε στο λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή.

      +eventUpdateTotpBody=Η πρόσβαση μέσω OTP ενημερώθηκε στο λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή. +eventUpdateTotpSubject=Ενημέρωση OTP +eventUpdatePasswordBodyHtml=

      Ο κωδικός πρόσβασης σας άλλαξε στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή.

      +eventUpdatePasswordBody=Ο κωδικός πρόσβασης σας άλλαξε στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή. +eventUpdatePasswordSubject=Ενημέρωση κωδικού πρόσβασης +eventRemoveTotpBodyHtml=

      Η πρόσβαση μέσω OTP αφαιρέθηκε από το λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή.

      +eventRemoveTotpBody=Η πρόσβαση μέσω OTP αφαιρέθηκε από το λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή. +eventRemoveTotpSubject=Αφαίρεση OTP +eventLoginErrorBodyHtml=

      Ανιχνεύθηκε μία αποτυχημένη προσπάθεια εισόδου στο λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή.

      +eventLoginErrorBody=Ανιχνεύθηκε μία αποτυχημένη προσπάθεια εισόδου στο λογαριασμό σας στις {0} από το {1}. Αν δεν είσαστε εσείς, τότε παρακαλώ επικοινωνήστε με ένα διαχειριστή. +eventLoginErrorSubject=Σφάλμα εισόδου +executeActionsSubject=Ενημέρωση Του Λογαριασμού Σας +passwordResetSubject=Αλλαγή κωδικού πρόσβασης +identityProviderLinkSubject=Σύνδεση {0} +emailTestBodyHtml=

      Αυτό είναι ένα δοκιμαστικό μήνυμα

      +emailTestBody=Αυτό είναι ένα δοκιμαστικό μήνυμα +emailTestSubject=[KEYCLOAK] - Δοκιμαστικό μήνυμα SMTP +emailUpdateConfirmationSubject=Επιβεβαίωση νέου email +emailVerificationBodyHtml=

      Κάποιος δημιούργησε ένα λογαριασμό {2} με αυτή τη διεύθυνση email. Αν είσαστε εσείς, τότε πατήστε το σύνδεσμο παρακάτω για να επιβεβαιώσετε το email σας

      Σύνδεσμος για επιβεβαίωση διεύθυνσης email

      Αυτός ο σύνδεσμος θα λήξει σε {3}.

      Αν δεν δημιουργήσατε το λογαριασμό τότε απλώς αγνοήστε αυτό το μήνυμα.

      +emailVerificationBody=Κάποιος δημιούργησε ένα {2} λογαριασμό με αυτή τη διεύθυνση email. Αν είσασταν εσείς, τότε πατήστε το παρακάτω σύνδεσμο για να επιβεβαιώσετε τη διεύθυνση email σας\n\n{0}\n\nΑυτός ο σύνδεσμος θα λήξει μέσα σε {3}.\n\nΑν δεν δημιουργήσατε εσείς αυτό το λογαριασμό, τότε απλώς αγνοήστε αυτό το μήνυμα. +emailVerificationSubject=Επιβεβαίωση email diff --git a/themes/hellug-keycloak/email/messages/messages_en.properties b/themes/hellug-keycloak/email/messages/messages_en.properties old mode 100755 new mode 100644 index ad6b61f..bcf622c --- a/themes/hellug-keycloak/email/messages/messages_en.properties +++ b/themes/hellug-keycloak/email/messages/messages_en.properties @@ -1,55 +1,2 @@ -emailVerificationSubject=Verify email -emailVerificationBody=Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address\n\n{0}\n\nThis link will expire within {3}.\n\nIf you didn''t create this account, just ignore this message. -emailVerificationBodyHtml=

      Someone has created a {2} account with this email address. If this was you, click the link below to verify your email address

      Link to e-mail address verification

      This link will expire within {3}.

      If you didn''t create this account, just ignore this message.

      -emailUpdateConfirmationSubject=Verify new email -emailUpdateConfirmationBody=To update your {2} account with email address {1}, click the link below\n\n{0}\n\nThis link will expire within {3}.\n\nIf you don''t want to proceed with this modification, just ignore this message. -emailUpdateConfirmationBodyHtml=

      To update your {2} account with email address {1}, click the link below

      {0}

      This link will expire within {3}.

      If you don''t want to proceed with this modification, just ignore this message.

      -emailTestSubject=[KEYCLOAK] - SMTP test message -emailTestBody=This is a test message -emailTestBodyHtml=

      This is a test message

      -identityProviderLinkSubject=Link {0} -identityProviderLinkBody=Someone wants to link your "{1}" account with "{0}" account of user {2} . If this was you, click the link below to link accounts\n\n{3}\n\nThis link will expire within {5}.\n\nIf you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}. -identityProviderLinkBodyHtml=

      Someone wants to link your {1} account with {0} account of user {2}. If this was you, click the link below to link accounts

      Link to confirm account linking

      This link will expire within {5}.

      If you don''t want to link account, just ignore this message. If you link accounts, you will be able to login to {1} through {0}.

      -passwordResetSubject=Reset password -passwordResetBody=Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.\n\n{0}\n\nThis link and code will expire within {3}.\n\nIf you don''t want to reset your credentials, just ignore this message and nothing will be changed. -passwordResetBodyHtml=

      Someone just requested to change your {2} account''s credentials. If this was you, click on the link below to reset them.

      Link to reset credentials

      This link will expire within {3}.

      If you don''t want to reset your credentials, just ignore this message and nothing will be changed.

      -executeActionsSubject=Update Your Account -executeActionsBody=Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.\n\n{0}\n\nThis link will expire within {4}.\n\nIf you are unaware that your administrator has requested this, just ignore this message and nothing will be changed. -executeActionsBodyHtml=

      Your administrator has just requested that you update your {2} account by performing the following action(s): {3}. Click on the link below to start this process.

      Link to account update

      This link will expire within {4}.

      If you are unaware that your administrator has requested this, just ignore this message and nothing will be changed.

      -eventLoginErrorSubject=Login error -eventLoginErrorBody=A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an administrator. -eventLoginErrorBodyHtml=

      A failed login attempt was detected to your account on {0} from {1}. If this was not you, please contact an administrator.

      -eventRemoveTotpSubject=Remove OTP -eventRemoveTotpBody=OTP was removed from your account on {0} from {1}. If this was not you, please contact an administrator. -eventRemoveTotpBodyHtml=

      OTP was removed from your account on {0} from {1}. If this was not you, please contact an administrator.

      -eventUpdatePasswordSubject=Update password -eventUpdatePasswordBody=Your password was changed on {0} from {1}. If this was not you, please contact an administrator. -eventUpdatePasswordBodyHtml=

      Your password was changed on {0} from {1}. If this was not you, please contact an administrator.

      -eventUpdateTotpSubject=Update OTP -eventUpdateTotpBody=OTP was updated for your account on {0} from {1}. If this was not you, please contact an administrator. -eventUpdateTotpBodyHtml=

      OTP was updated for your account on {0} from {1}. If this was not you, please contact an administrator.

      - -requiredAction.CONFIGURE_TOTP=Configure OTP -requiredAction.terms_and_conditions=Terms and Conditions -requiredAction.UPDATE_PASSWORD=Update Password -requiredAction.UPDATE_PROFILE=Update Profile -requiredAction.VERIFY_EMAIL=Verify Email -requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=Generate Recovery Codes - -# units for link expiration timeout formatting -linkExpirationFormatter.timePeriodUnit.seconds=seconds -linkExpirationFormatter.timePeriodUnit.seconds.1=second -linkExpirationFormatter.timePeriodUnit.minutes=minutes -linkExpirationFormatter.timePeriodUnit.minutes.1=minute -#for language which have more unit plural forms depending on the value (eg. Czech and other Slavic langs) you can override unit text for some other values like this: -#linkExpirationFormatter.timePeriodUnit.minutes.2=minuty -#linkExpirationFormatter.timePeriodUnit.minutes.3=minuty -#linkExpirationFormatter.timePeriodUnit.minutes.4=minuty -linkExpirationFormatter.timePeriodUnit.hours=hours -linkExpirationFormatter.timePeriodUnit.hours.1=hour -linkExpirationFormatter.timePeriodUnit.days=days -linkExpirationFormatter.timePeriodUnit.days.1=day - -emailVerificationBodyCode=Please verify your email address by entering in the following code.\n\n{0}\n\n. -emailVerificationBodyCodeHtml=

      Please verify your email address by entering in the following code.

      {0}

      - +# encoding: UTF-8 +locale_el=Ελληνικά diff --git a/themes/hellug-keycloak/email/theme.properties b/themes/hellug-keycloak/email/theme.properties index f1dbb72..4e9016a 100644 --- a/themes/hellug-keycloak/email/theme.properties +++ b/themes/hellug-keycloak/email/theme.properties @@ -1 +1,2 @@ -parent=base \ No newline at end of file +parent=base +locales=en,el diff --git a/themes/hellug-keycloak/login/messages/messages_el.properties b/themes/hellug-keycloak/login/messages/messages_el.properties new file mode 100644 index 0000000..7dd8cb4 --- /dev/null +++ b/themes/hellug-keycloak/login/messages/messages_el.properties @@ -0,0 +1,468 @@ +# encoding: UTF-8 +doLogIn=Είσοδος +doRegister=Εγγραφή +doCancel=Ακύρωση +doSubmit=Εφαρμογή +doBack=Επιστροφή +doYes=Ναι +doNo=Όχι +doContinue=Συνέχεια +doIgnore=Αγνόηση +doAccept=Αποδοχή +doDecline=Απόρριψη +doForgotPassword=Ξεχάσατε το κωδικό; +doClickHere=Πατήστε Εδώ +doImpersonate=Προσποίηση +doTryAgain=Δοκιμή Ξανά +doTryAnotherWay=Δοκιμή με άλλη μέθοδο +doConfirmDelete=Επιβεβαίωση διαγραφής +errorDeletingAccount=Σφάλμα κατά τη διαγραφή του λογαριασμού +deletingAccountForbidden=Δεν έχετε το δικαίωμα να διαγράψετε τον λογαριασμό σας, επικοινωνήστε με τον διαχειριστή. +kerberosNotConfigured=Το Kerberos Δεν Έχει Ρυθμιστεί +kerberosNotConfiguredTitle=Το Kerberos Δεν Έχει Ρυθμιστεί +bypassKerberosDetail=Είτε δεν έχετε συνδεθεί μέσω Kerberos ή ο περιηγητής σας δεν έχει ρυθμιστεί για είσοδο με Kerberos. Πατήστε για να συνεχίσετε την είσοδο με άλλες μεθόδους +kerberosNotSetUp=Το Kerberos δεν έχει ρυθμιστεί. Δεν μπορείτε να εισέλθετε. +registerTitle=Εγγραφή +loginAccountTitle=Είσοδος στο λογαριασμό σας +loginTitle=Είσοδος στο {0} +loginTitleHtml={0} +impersonateTitle={0} Προσποίηση Χρήστη +impersonateTitleHtml={0} Προσποίηση Χρήστη +realmChoice=Περιοχή +unknownUser=Άγνωστος χρήστης +loginTotpTitle=Ρύθμιση Authenticator Κινητού +loginProfileTitle=Ενημέρωση Πληροφοριών Λογαριασμού +loginIdpReviewProfileTitle=Ενημέρωση Πληροφοριών Λογαριασμού +loginTimeout=Η προσπάθεια εισόδου σας έληξε. Είσοδος από την αρχή. +reauthenticate=Για να συνεχίσετε παρακαλώ για αυθεντικοποίηση ξανά +oauthGrantTitle=Δώστε Πρόσβαση στο {0} +oauthGrantTitleHtml={0} +oauthGrantInformation=Βεβαιωθείτε ότι εμπιστεύεστε το {0} μαθαίνοντας πως το {0} θα χειρίζεται τα δεδομένα σας. +oauthGrantReview=Μπορείτε να ελέγξετε τα +oauthGrantTos=όροι της υπηρεσίας. +oauthGrantPolicy=πολιτική ιδιωτικότητας. +errorTitle=Ζητάμε συγνώμη... +errorTitleHtml=Ζητάμε συγνώμη ... +emailVerifyTitle=Πιστοποίηση Email +emailForgotTitle=Ξεχάσατε το Κωδικό; +updateEmailTitle=Ενημέρωση email +emailUpdateConfirmationSentTitle=Στάλθηκε email επιβεβαίωσης +emailUpdateConfirmationSent=Ένα email επιβεβαίωσης στάλθηκε στο {0}. Ακολουθήστε τις οδηγίες εκεί, ώστε να ολοκληρώσετε την ενημέρωση του email. +emailUpdatedTitle=Ενημέρωση email +emailUpdated=Το email του λογαριασμού άλλαξε επιτυχώς σε {0}. +updatePasswordTitle=Ενημέρωση κωδικού +codeSuccessTitle=Επιτυχής κωδικός +codeErrorTitle=Αριθμός σφάλματος\: {0} +displayUnsupported=Μη υποστηριζόμενος τύπος οθόνης +browserRequired=Απαιτείται browser για την είσοδο +browserContinue=Απαιτείται browser για την ολοκλήρωση της εισόδου +browserContinuePrompt=Εκκίνηση browser και συνέχεια στην είσοδο [ν/ο]: +browserContinueAnswer=ν + +# Transports +usb=USB +nfc=NFC +bluetooth=Bluetooth +internal=Εσωτερικό +unknown=Άγνωστο +termsTitle=Όροι και Συνθήκες +termsText=

      Δεν έχουν οριστεί Όροι και Συνθήκες

      +termsPlainText=Δεν έχουν οριστεί Όροι και Συνθήκες. +recaptchaFailed=Άκυρο Recaptcha +recaptchaNotConfigured=Απαιτείται Recaptcha, αλλά δεν έχει ρυθμιστεί +consentDenied=Άρνηση Συναίνεσης. +noAccount=Νέος χρήστης; +username=Όνομα χρήστη +usernameOrEmail=Όνομα χρήστη ή email +firstName=Όνομα +givenName=Όνομα +fullName=Ονοματεπώνυμο +lastName=Επώνυμο +familyName=Επώνυμο +email=Email +password=Κωδικός Πρόσβασης +passwordConfirm=Επιβεβαίωση κωδικού +passwordNew=Νέος Κωδικός Πρόσβασης +passwordNewConfirm=Επιβεβαίωση Νέου Κωδικού +rememberMe=Να με θυμάσαι +authenticatorCode=Κωδικός μίας-χρήσης +address=Διεύθυνση +street=Οδός +locality=Πόλη ή Δήμος +region=Νομός ή Περιφέρεια +postal_code=Ταχυδρομικός Κώδικας +country=Χώρα +emailVerified=Επιβεβαιωμένο Email +website=Ιστοσελίδα +phoneNumber=Τηλέφωνο +phoneNumberVerified=Επιβεβαιωμένο τηλέφωνο +gender=Φύλο +birthday=Ημερομηνία γέννησης +zoneinfo=Ζώνη ώρας +gssDelegationCredential=GSS διαπιστευτήρια εξουσιοδότησης +logoutOtherSessions=Έξοδος από άλλες συσκευές +profileScopeConsentText=Προφίλ χρήστη +emailScopeConsentText=Διεύθυνση email +addressScopeConsentText=Διεύθυνση +phoneScopeConsentText=Τηλέφωνο +offlineAccessScopeConsentText=Πρόσβαση εκτός-σύνδεσης +samlRoleListScopeConsentText=Οι Ρόλοι Μου +rolesScopeConsentText=Ρόλοι χρήστη +restartLoginTooltip=Επανεκκίνηση Εισόδου +loginTotpIntro=Πρέπει να ορίσετε μια γεννήτρια Κωδικών Μίας Χρήσης για να έχετε πρόσβαση στο λογαριασμό +loginTotpStep1=Εγκαταστήστε μία από τις ακόλουθες εφαρμογές στο κινητό σας: +loginTotpStep2=Ανοίξτε την εφαρμογή και σαρώστε το Κώδικα QR: +loginTotpStep3=Εισάγετε το κωδικό μίας-χρήσης όπως παρέχεται από την εφαρμογή και πατήστε το Υποβολή για να ολοκληρώσετε. +loginTotpStep3DeviceName=Παρέχετε ένα Όνομα Συσκευής για ευκολία διαχείρισης των συσκευών OTP. +loginTotpManualStep2=Ανοίξτε την εφαρμογή και εισάγετε το μυστικό κλειδί: +loginTotpManualStep3=Χρησιμοποιείστε τις παρακάτω τιμές ρυθμίσεων αν η εφαρμογή το υποστηρίζει: +loginTotpUnableToScan=Πρόβλημα στη σάρωση; +loginTotpScanBarcode=Σάρωση του QR; +loginCredential=Διαπιστευτήρια +loginOtpOneTime=Κωδικός μίας-χρήσης +loginTotpType=Τύπος +loginTotpAlgorithm=Αλγόριθμος +loginTotpDigits=Ψηφία +loginTotpInterval=Διάστημα +loginTotpCounter=Μετρητής +loginTotpDeviceName=Όνομα Συσκευής +loginTotp.totp=Χρονικός +loginTotp.hotp=Σειριακός +totpAppFreeOTPName=FreeOTP +totpAppGoogleName=Google Authenticator +totpAppMicrosoftAuthenticatorName=Microsoft Authenticator +loginChooseAuthenticator=Επιλέξτε μέθοδο εισόδου +oauthGrantRequest=Παραχωρείτε αυτά τα δικαιώματα πρόσβασης; +inResource=σε +oauth2DeviceVerificationTitle=Σύνδεση Συσκευής +verifyOAuth2DeviceUserCode=Εισάγετε τον κωδικό που παρέχεται από την συσκευή και πατήστε Υποβολή +oauth2DeviceInvalidUserCodeMessage=Άκυρος κωδικός, παρακαλώ προσπαθήστε ξανά. +oauth2DeviceExpiredUserCodeMessage=Ο κωδικός έχει λήξει. Παρακαλώ πηγαίνετε πίσω στη συσκευή σας και προσπαθήστε να συνδεθείτε ξανά. +oauth2DeviceVerificationCompleteHeader=Επιτυχής σύνδεση συσκευής +oauth2DeviceVerificationCompleteMessage=Μπορείτε να κλείσετε το παράθυρο του browser και να επιστρέψετε στη συσκευή σας. +oauth2DeviceVerificationFailedHeader=Η σύνδεση της συσκευής απέτυχε +oauth2DeviceVerificationFailedMessage=Μπορείτε να κλείσετε αυτόν τον περιηγητή και να πάτε πίσω στη συσκευή σας και να πρσπαθήσετε να συνδεθείτε ξανά. +oauth2DeviceConsentDeniedMessage=Δεν δώθηκε συγκατάθεση για σύνδεση στη συσκευή. +oauth2DeviceAuthorizationGrantDisabledMessage=Ο πελάτης δεν επιτρέπεται να ξεκινήσει το OAuth 2.0 για τη χορήγηση εξουσιοδότησης της συσκευής. Αυτή η ροή είναι απενεργοποιημένη για τον πελάτη. +emailVerifyInstruction1=Σας στάλθηκε ένα email με οδηγίες για το πως να επιβεβαιώσετε τη διεύθυνση σας {0}. +emailVerifyInstruction2=Δεν έχετε λάβει έναν κωδικό επαλήθευσης στο email σας; +emailVerifyInstruction3=να ξανασταλεί το email. +emailLinkIdpTitle=Σύνδεση {0} +emailLinkIdp1=Στάλθηκε ένα email με οδηγίες για να συνδέσετε το {0} λογαριασμό {1} με το {2} λογαριασμό. +emailLinkIdp2=Δεν έχετε λάβει έναν κωδικό επαλήθευσης στο email σας; +emailLinkIdp3=να ξανασταλεί το email. +emailLinkIdp4=Αν έχετε ήδη επαλυθεύσει το email σε έναν διαφορετικό περιηγητή +emailLinkIdp5=για συνέχεια. +backToLogin=« Επιστροφή στην Είσοδο +emailInstruction=Εισάγετε το όνομα χρήστη ή τη διεύθυνση email και θα σας σταλούν οδηγίες για το πως να δημιουργήσετε ένα νέο κωδικό. +emailInstructionUsername=Εισάγετε το όνομα χρήστη και θα σας σταλούν οδηγίες για το πως να δημιουργήσετε ένα νέο κωδικό. +copyCodeInstruction=Παρακαλώ αντιγράψτε αυτό το κωδικό στην εφαρμογή σας: +pageExpiredTitle=Η σελίδα έληξε +pageExpiredMsg1=Για επανεκκίνηση της εισόδου +pageExpiredMsg2=Για συνέχεια της εισόδου +personalInfo=Προσωπικά Στοιχεία: +role_admin=Διαχειριστής +role_realm-admin=Διαχειριστή Τόπου +role_create-realm=Δημιουργία τομέα +role_create-client=Δημιουργία πελάτη +role_view-realm=Εμφάνιση τομέα +role_view-users=Εμφάνιση χρηστών +role_view-applications=Εμφάνιση εφαρμογών +role_view-clients=Εμφάνιση πελατών +role_view-events=Εμφάνιση συμβάντων +role_view-identity-providers=Εμφάνιση παρόχων ταυτότητας +role_manage-realm=Διαχείριση τομέα +role_manage-users=Διαχείριση χρηστών +role_manage-applications=Διαχείριση εφαρμογών +role_manage-identity-providers=Διαχείριση παρόχων ταυτότητας +role_manage-clients=Διαχείριση πελατών +role_manage-events=Διαχείριση συμβάντων +role_view-profile=Εμφάνιση προφίλ +role_manage-account=Διαχείριση λογαριασμού +role_manage-account-links=Διαχείριση συνδέσεων λογαριασμού +role_read-token=Ανάγνωση διακριτικού +role_offline-access=Πρόσβαση εκτός-σύνδεσης +client_account=Λογαριασμός +client_account-console=Κονσόλα Λογαριασμού +client_security-admin-console=Κονσόλα Διαχειριστή Ασφάλειας +client_admin-cli=CLI Διαχείρισης +client_realm-management=Διαχείριση Τομέα +client_broker=Μεσολαβητής +requiredFields=Απαιτούμενα πεδία +invalidUserMessage=Μη έγκυρο όνομα χρήστη ή κωδικός πρόσβασης. +invalidUsernameMessage=Μη έγκυρο όνομα χρήστη. +invalidUsernameOrEmailMessage=Μη έγκυρο όνομα χρήστη ή email. +invalidPasswordMessage=Μη έγκυρος κωδικός πρόσβασης. +invalidEmailMessage=Μη έγκυρη διεύθυνση email. +accountDisabledMessage=Ο λογαριασμός έχει απενεργοποιηθεί, επικοινωνήστε με το διαχειριστή. +accountTemporarilyDisabledMessage=Ο λογαριασμός έχει απενεργοποιηθεί προσωρινά, επικοινωνήστε με το διαχειριστή ή δοκιμάστε αργότερα. +expiredCodeMessage=Λήξη χρόνου σύνδεσης. Παρακαλώ συνδεθείτε ξανά. +expiredActionMessage=Η ενέργεια έληξε. Προχωρείστε τώρα με σύνδεση. +expiredActionTokenNoSessionMessage=Η ενέργεια έληξε. +expiredActionTokenSessionExistsMessage=Η ενέργεια έλειξε. Παρακαλώ αρχίστε ξανά. +sessionLimitExceeded=Πάρα πολλές συνεδρίες +missingFirstNameMessage=Παρακαλώ ορίστε ένα όνομα. +missingLastNameMessage=Παρακαλώ ορίστε επώνυμο. +missingEmailMessage=Παρακαλώ ορίστε email. +missingUsernameMessage=Παρακαλώ ορίστε όνομα χρήστη. +missingPasswordMessage=Παρακαλώ ορίστε κωδικό πρόσβασης. +missingTotpMessage=Παρακαλώ εισάγετε ένα κωδικό από εφαρμογή ταυτοποίησης. +missingTotpDeviceNameMessage=Παρακαλώ ορίστε όνομα συσκευής. +notMatchPasswordMessage=Οι κωδικοί πρόσβασης δε ταιριάζουν. +error-invalid-value=Μη έγκυρη τιμή. +error-invalid-blank=Παρακαλώ ορίστε τιμή. +error-empty=Παρακαλώ ορίστε τιμή. +error-invalid-length=Το μήκος πρέπει να είναι μεταξύ {1} και {2}. +error-invalid-length-too-short=Ελάχιστο μήκος {1}. +error-invalid-length-too-long=Μέγιστο μήκος {2}. +error-invalid-email=Μη έγκυρη διεύθυνση email. +error-invalid-number=Μη έγκυρος αριθμός. +error-number-out-of-range=Ο αριθμός πρέπει να είναι μεταξύ {1} και {2}. +error-number-out-of-range-too-small=Ο αριθμός πρέπει να έχει ελάχιστη τιμή {1}. +error-number-out-of-range-too-big=Ο αριθμός πρέπει να έχει μέγιστη τιμή {1}. +error-pattern-no-match=Μη έγκυρη τιμή. +error-invalid-uri=Μη έγκυρο URL. +error-invalid-uri-scheme=Μη έγκυρο σχήμα URL. +error-invalid-uri-fragment=Μη έγκυρο κομμάτι URL. +error-user-attribute-required=Παρακαλώ ορίστε αυτό το πεδίο. +error-invalid-date=Μη έγκυρη ημερομηνία. +error-user-attribute-read-only=Αυτό το πεδίο είναι για ανάγνωση μόνο. +error-username-invalid-character=Η τιμή περιέχει μη έγκυρους χαρακτήρες. +error-person-name-invalid-character=Η τιμή περιέχει μη έγκυρο χαρακτήρα. +invalidPasswordExistingMessage=Μη έγκυρος υπάρχοντας κωδικός πρόσβασης. +invalidPasswordBlacklistedMessage=Μη έγκυρος κωδικός πρόσβασης: ο κωδικός πρόσβασης είναι απαγορευμένος. +invalidPasswordConfirmMessage=Η επιβεβαίωση του κωδικού πρόσβασης δε ταιριάζει. +invalidTotpMessage=Μη έγκυρος κωδικός μίας χρήσης. +usernameExistsMessage=Το όνομα χρήστη υπάρχει ήδη. +emailExistsMessage=Το email υπάρχει ήδη. +federatedIdentityExistsMessage=Ο χρήστης με {0} {1} υπάρχει ήδη. Παρακαλώ συνδεθείτε στη διαχείριση λογαριασμού για να συνδέσετε το λογαριασμό. +federatedIdentityUnavailableMessage=Δεν υπάρχει ο χρήστης {0} που συνδέθηκε με το πάροχο ταυτότητας {1} . Επικοινωνήστε με το διαχειριστή. +confirmLinkIdpTitle=Ο λογαριασμός υπάρχει ήδη +federatedIdentityConfirmLinkMessage=Ο χρήστης {0} {1} υπάρχει ήδη. Σίγουρα να συνεχίσω; +federatedIdentityConfirmReauthenticateMessage=Αυθεντικοποίηση για σύνδεση του λογαριασμού σας με το {0} +nestedFirstBrokerFlowMessage=Ο {0} χρήστης {1} δεν έχει συνδεθεί με κάποιο γνωστό χρήστη. +confirmLinkIdpReviewProfile=Εξέταση προφίλ +confirmLinkIdpContinue=Προσθήκη σε υπάρχων λογαριασμό +configureTotpMessage=Ρυθμίστε μια Εφαρμογή Ταυτοποίησης στο κινητό σας για να ενεργοποιήσετε το λογαριασμό. +configureBackupCodesMessage=Πρέπει να ορίσετε Κωδικούς Ασφαλείας για να ενεργοποιήσετε το λογαριασμό σας. +updateProfileMessage=Πρέπει να ενημερώσετε το προφίλ χρήστη σας για να ενεργοποιήσετε το λογαριασμό σας. +updatePasswordMessage=Πρέπει να αλλάξετε το κωδικό πρόσβασης για να ενεργοποιήσετε το λογαριασμό σας. +updateEmailMessage=Πρέπει να ενημερώσετε το email σας για να ενεργοποιήσετε το λογαριασμός σας. +resetPasswordMessage=Πρέπει να αλλάξετε το κωδικό πρόσβασης σας. +verifyEmailMessage=Πρέπει να επιβεβαιώσετε το email σας για να ενεργοποιήσετε το λογαριασμό σας. +linkIdpMessage=Πρέπει να επιβεβαιώσετε το email σας για να συνδέσετε το λογαριασμό σας με το {0}. +emailSentMessage=Θα λάβετε ένα email σύντομα με επιπλέων πληροφορίες. +emailSendErrorMessage=Αποτυχία αποστολής email, παρακαλώ δοκιμάστε αργότερα. +accountUpdatedMessage=Ο λογαριασμός σας έχει ενημερωθεί. +accountPasswordUpdatedMessage=Ο κωδικός πρόσβασης ενημερώθηκε. +delegationCompleteHeader=Επιτυχής Είσοδος +delegationCompleteMessage=Μπορείτε να κλείστε αυτό το παράθυρο του browser και να επιστρέψετε στην εφαρμογή κονσόλας. +delegationFailedHeader=Αποτυχία Εισόδου +delegationFailedMessage=Μπορείτε να κλείσετε αυτό το παράθυρο και να επιστρέψετε στην εφαρμογή κονσόλας σας και να δοκιμάσετε να μπείτε ξανά. +noAccessMessage=Καμία πρόσβαση +invalidPasswordMinLengthMessage=Μη έγκυρος κωδικός πρόσβασης: ελάχιστο μήκος {0}. +invalidPasswordMaxLengthMessage=Μη έγκυρος κωδικός πρόσβασης: μέγιστο μήκος {0}. +invalidPasswordMinDigitsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} ψηφία. +invalidPasswordMinLowerCaseCharsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} πεζούς χαρακτήρες. +invalidPasswordMinUpperCaseCharsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} κεφαλαίους χαρακτήρες. +invalidPasswordMinSpecialCharsMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να περιέχει τουλάχιστον {0} ειδικούς χαρακτήρες. +invalidPasswordNotUsernameMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να μην είναι ίδιο με το όνομα χρήστη. +invalidPasswordNotEmailMessage=Μη έγκυρος κωδικός πρόσβασης: πρέπει να μην είναι ίδιο με το email. +invalidPasswordRegexPatternMessage=Μη έγκυρος κωδικός πρόσβασης: δε ταιριάζει με τα μοτίβα regex. +invalidPasswordHistoryMessage=Μη έγκυρος κωδικός πρόσβασης: δε πρέπει να είναι το ίδιο με τους τελευταίους {0} κωδικούς. +invalidPasswordGenericMessage=Μη έγκυρος κωδικός πρόσβασης: ο νέος κωδικός δε συμφωνεί με τις πολιτικές κωδικών. +failedToProcessResponseMessage=Αδυναμία επεξεργασίας της απάντησης +httpsRequiredMessage=Απαιτείται HTTPS +realmNotEnabledMessage=Ο τομέας δεν είναι ενεργός +invalidRequestMessage=Μη Έγκυρη Αίτηση +successLogout=Έχετε αποσυνδεθεί +failedLogout=Αποτυχία αποσύνδεσης +unknownLoginRequesterMessage=Άγνωστος αιτών σύνδεσης +loginRequesterNotEnabledMessage=Δεν έχει ενεργοποιηθεί ο αιτών Σύνδεσης +bearerOnlyMessage=Εφαρμογές τύπου Bearer-only δεν επιτρέπονται να εκκινήσουν είσοδο μέσω browser +standardFlowDisabledMessage=Ο πελάτης δεν επιτρέπεται να ξεκινά είσοδο μέσω browser με το δοθέν response_type. Η πρότυπη ροή έχει απενεργοποιηθεί για αυτό το πελάτη. +implicitFlowDisabledMessage=Ο πελάτης δεν επιτρέπεται να ξεκινά είσοδο μέσω browser με το δοθέν response_type. Η έμμεση ροή έχει απενεργοποιηθεί για αυτό το πελάτη. +invalidRedirectUriMessage=Μη έγκυρο redirect uri +unsupportedNameIdFormatMessage=Μη υποστηριζόμενη NamedIDFormat +invalidRequesterMessage=Μη έγκυρος αιτών +registrationNotAllowedMessage=Η εγγραφή δεν επιτρέπεται +resetCredentialNotAllowedMessage=Η Επαναφορά Διαπιστευτηρίων δεν επιτρέπεται +permissionNotApprovedMessage=Η άδεια δεν εγκρίθηκε. +noRelayStateInResponseMessage=Δεν υπάρχει κατάσταση μεταβίβασης στην απάντηση από το πάροχο ταυτότητας. +insufficientPermissionMessage=Δεν επαρκούν τα δικαιώματα για σύνδεση των ταυτοτήτων. +couldNotProceedWithAuthenticationRequestMessage=Αδυναμία ολοκλήρωσης του ελέγχου ταυτότητας στο πάροχο ταυτότητας. +couldNotObtainTokenMessage=Αδυναμία απόκτησης διακριτικού από το πάροχο ταυτότητας. +unexpectedErrorRetrievingTokenMessage=Απρόσμενο σφάλμα κατά την απόκτηση διακριτικού από το πάροχο ταυτότητας. +unexpectedErrorHandlingResponseMessage=Απρόσμενο σφάλμα κατά το χειρισμό της απάντησης από το πάροχο ταυτότητας. +identityProviderAuthenticationFailedMessage=Η ταυτοποίηση απέτυχε. Αδυναμία ελέγχου της ταυτότητας με το πάροχο ταυτότητας. +couldNotSendAuthenticationRequestMessage=Αδυναμία αποστολής του αιτήματος ελέγχου ταυτότητας στο πάροχο ταυτότητας. +unexpectedErrorHandlingRequestMessage=Απρόσμενο σφάλμα κατά το χειρισμό του αιτήματος ταυτοποποίησης στο πάροχο ταυτότητας. +invalidAccessCodeMessage=Μη έγκυρος κωδικός πρόσβασης. +sessionNotActiveMessage=Η συνεδρία δεν είναι ενεργή. +invalidCodeMessage=Συνέβη ένα σφάλμα, παρακαλώ για επανασύνδεση μέσω της εφαρμογής σας. +cookieNotFoundMessage=Δε βρέθηκε το cookie. Παρακαλώ βεβαιωθείτε ότι τα cookies είναι ενεργά στο browser σας. +insufficientLevelOfAuthentication=Δεν ικανοποιήθηκε το επίπεδο ταυτοποίησης που ζητήθηκε. +identityProviderUnexpectedErrorMessage=Απρόσμενο σφάλμα κατά τη ταυτοποίηση με το πάροχο ταυτότητας +identityProviderMissingStateMessage=Λείπει η παράμετρος state από την απάντηση του παρόχου ταυτότητας. +identityProviderInvalidResponseMessage=Μη έγκυρη απάντηση από το πάροχο ταυτότητας. +identityProviderInvalidSignatureMessage=Μη έγκυρη υπογραφή στην απάντηση από το πάροχο ταυτότητας. +identityProviderNotFoundMessage=Αδυναμία εύρεσης ενός παρόχου ταυτότητας με το αναγνωριστικό. +identityProviderLinkSuccess=Επιβεβαιώσατε το email σας επιτυχώς. Παρακαλώ επιστρέψτε στο αρχικό browser και συνεχίστε εκεί την είσοδο. +staleCodeMessage=Αυτή η σελίδα δεν είναι πια έγκυρη, παρακαλώ επιστρέψτε στην εφαρμογή σας και συνδεθείτε ξανά +realmSupportsNoCredentialsMessage=Ο τομέας δεν υποστηρίζει κανένα τύπο διαπιστευτηρίων. +credentialSetupRequired=Αδυναμία εισόδου, απαιτείται ρύθμιση των διαπιστευτηρίων. +identityProviderNotUniqueMessage=Ο τομέας υποστηρίζει πολλαπλούς παρόχους ταυτότητας. Αδυναμία επιλογής του παρόχου ταυτότητας που θα χρησιμοποιηθεί για τη ταυτοποίηση. +emailVerifiedMessage=Η διεύθυνση email σας έχει επιβεβαιωθεί. +staleEmailVerificationLink=Ο σύνδεσμός που πατήσατε είναι παλιός και δεν είναι έγκυρος πια. Ίσως έχετε ήδη επιβεβαιώσει το email σας. +identityProviderAlreadyLinkedMessage=Η ομόσπονδη ταυτότητα που επιστρέφει το {0} είναι ήδη συνδεδεμένη με ένα άλλο χρήστη. +confirmAccountLinking=Επιβεβαιώστε τη σύνδεση του λογαριασμού {0} στο πάροχο ταυτότητας {1} με το λογαριασμό σας. +confirmEmailAddressVerification=Επιβεβαιώστε την εγκυρότητα της διεύθυνσης email {0}. +confirmExecutionOfActions=Πραγματοποιήστε την ακόλουθη ενέργεια(ες) +locale_ar=\u0639\u0631\u0628\u064A +locale_ca=Catal\u00E0 +locale_cs=\u010Ce\u0161tina +locale_da=Dansk +locale_de=Deutsch +locale_en=English +locale_es=Espa\u00F1ol +locale_fr=Fran\u00E7ais +locale_gr=\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC +locale_hu=Magyar +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_lt=Lietuvi\u0173 +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polski +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_tr=T\u00FCrk\u00E7e +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_fi=Suomi +backToApplication=« Επιστροφή στην Εφαρμογή +missingParameterMessage=Λείπουν οι παράμετροι: {0} +clientNotFoundMessage=Ο πελάτης δε βρέθηκε. +clientDisabledMessage=Ο πελάτης απενεργοποιήθηκε. +invalidParameterMessage=Μη έγκυρη παράμετρος: {0} +alreadyLoggedIn=Έχετε ήδη συνδεθεί. +differentUserAuthenticated=Έχετε ήδη ταυτοποιηθεί σε αυτή τη συνεδρία ως ο άλλος χρήστης ''{0}''. Παρακαλώ πρώτα να αποσυνδεθείτε. +brokerLinkingSessionExpired=Αιτήθηκε σύνδεση με λογαριασμό μεσολαβητή, αλλά η τρέχουσα συνεδρία δεν είναι πια έγκυρη. +proceedWithAction=» Πατήστε εδώ για να προχωρήσετε +acrNotFulfilled=Δεν ικανοποιούνται οι απαιτήσεις ταυτοποίησης +requiredAction.CONFIGURE_TOTP=Ρύθμιση OTP +requiredAction.terms_and_conditions=Όροι και Συνθήκες +requiredAction.UPDATE_PASSWORD=Ενημέρωση Κωδικού Πρόσβασης +requiredAction.UPDATE_PROFILE=Ενημέρωση Προφίλ +requiredAction.VERIFY_EMAIL=Επιβεβαίωση Email +requiredAction.CONFIGURE_RECOVERY_AUTHN_CODES=Δημιουργία Κωδικών Ανάκτησης +requiredAction.webauthn-register-passwordless=Εγγραφή σε Webauthn Χωρίς-Κωδικό-Πρόσβασης +invalidTokenRequiredActions=Οι απαιτούμενες ενέργειες που περιλαμβάνονται σε αυτό το σύνδεσμο δεν είναι έγκυρες +doX509Login=Θα συνδεθείτε ως: +clientCertificate=Πιστοποιητικό πελάτη X509: +noCertificate=[Κανένα Πιστοποιητικό] + + +pageNotFound=Η σελίδα δε βρέθηκε +internalServerError=Συνέβη ένα εσωτερικό σφάλμα στην υπηρεσία +console-username=Όνομα Χρήστη: +console-password=Κωδικός Πρόσβασης: +console-otp=Κωδικός Μίας Χρήσης: +console-new-password=Νέος Κωδικός Πρόσβασης: +console-confirm-password=Επιβεβαίωση Κωδικού: +console-update-password=Απαιτείται η ενημέρωση του κωδικού πρόσβασης σας. +console-verify-email=Πρέπει να επιβεβαιώσετε την διεύθυνση email σας. Στάλθηκε ένα email στο {0} το οποίο περιέχει ένα κωδικό επιβεβαίωσης. Παρακαλώ εισάγετε το κωδικό στο παρακάτω πεδίο. +console-email-code=Κωδικός Email: +console-accept-terms=Αποδοχή Όρων [ν/ο]: +console-accept=ν + +# Openshift messages +openshift.scope.user_info=Πληροφορίες χρήστη +openshift.scope.user_check-access=Πληροφορίες πρόσβασης χρήστη +openshift.scope.user_full=Πλήρης Πρόσβαση +openshift.scope.list-projects=Εμφάνιση λίστας έργων + +# SAML authentication +saml.post-form.title=Ανακατεύθυνση Ταυτοποίησης +saml.post-form.message=Ανακατεύθυνση, παρακαλώ αναμένατε. +saml.post-form.js-disabled=Έχει απενεργοποιηθεί η JavaScript. Συνιστούμε να την ενεργοποιήσετε. Πατήστε το κουμπί παρακάτω για να συνεχίσετε. +saml.artifactResolutionServiceInvalidResponse=Αδυναμία επίλυσης του στοιχείου. + +#authenticators +otp-display-name=Εφαρμογής Ταυτοποίησης +otp-help-text=Εισάγετε ένα κωδικό επιβεβαίωσης από την εφαρμογή ταυτοποίησης. +password-display-name=Κωδικός Πρόσβασης +password-help-text=Συνδεθείτε βάζοντας το κωδικό πρόσβασης σας. +auth-username-form-display-name=Όνομα Χρήστη +auth-username-form-help-text=Ξεκινήστε την είσοδο με το όνομα του χρήστη σας +auth-username-password-form-display-name=Όνομα χρήστη και κωδικός πρόσβασης +auth-username-password-form-help-text=Συνδεθείτε με το όνομα χρήστη και το κωδικό πρόσβασης σας. + +# Recovery Codes +auth-recovery-authn-code-form-display-name=Κωδικός Ανάκτησης Ταυτοποίησης +auth-recovery-authn-code-form-help-text=Δώστε ένα κωδικό ανάκτησης ταυτοποίησης από μια προϋπάρχουσα λίστα. +auth-recovery-code-info-message=Δώστε το καθορισμένο κωδικό ανάκτησης. +auth-recovery-code-prompt=Κωδικός ανάκτησης #{0} +auth-recovery-code-header=Σύνδεση με ένα κωδικό ανάκτησης ταυτοποίησης +recovery-codes-error-invalid=Μη έγκυρος κωδικός ανάκτησης ταυτοποίησης +recovery-code-config-header=Κωδικοί Ανάκτησης Ταυτοποίησης +recovery-code-config-warning-title=Αυτοί οι κωδικοί ανάκτησης δεν θα είναι πια ορατή μετά που θα βγείτε από τη σελίδα +recovery-code-config-warning-message=Βεβαιωθείτε ότι τους εκτυπώσατε, κατεβάσατε ή αντιγράψατε στο διαχειριστή κωδικών σας με ασφάλεια. Η ακύρωση αυτής της διαδικασίας θα αφαιρέσει αυτούς του κωδικούς ανάκτησης από το λογαριασμό σας. +recovery-codes-print=Εκτύπωση +recovery-codes-download=Λήψη +recovery-codes-copy=Αντιγραφή +recovery-codes-copied=Αντιγράφηκε +recovery-codes-confirmation-message=Αποθήκευσα αυτούς του κωδικούς με ασφάλεια +recovery-codes-action-complete=Ολοκλήρωση διαδικασίας +recovery-codes-action-cancel=Ακύρωση διαδικασίας +recovery-codes-download-file-header=Κρατήστε αυτούς του κωδικούς ανάκτησης κάπου ασφαλές. +recovery-codes-download-file-description=Οι κωδικοί ανάκτησης είναι μυστικά μίας χρήσης που επιτρέπουν να συνδεθείτε στο λογαριασμό αν δεν έχετε πρόσβαση στην εφαρμογή ταυτοποίησης. +recovery-codes-download-file-date=Αυτοί οι κωδικοί δημιουργήθηκαν στις +recovery-codes-label-default=Κωδικοί ανάκτησης + +# WebAuthn +webauthn-display-name=Κλειδί Ασφαλείας +webauthn-help-text=Χρήση του κλειδιού ασφαλείας σας για σύνδεση. +webauthn-passwordless-display-name=Κλειδί Ασφαλείας +webauthn-passwordless-help-text=Χρήση του κλειδιού ασφαλείας για σύνδεση χωρίς κωδικό πρόσβασης. +webauthn-login-title=Είσοδος με Κλειδί Ασφαλείας +webauthn-registration-title=Εγγραφή Κλειδιού Ασφαλείας +webauthn-available-authenticators=Διαθέσιμα Κλειδιά Ασφαλείας +webauthn-unsupported-browser-text=Το WebAuthn δεν υποστηρίζεται από αυτό το browser. Δοκιμάστε κάποιον άλλο ή επικοινωνήστε με το διαχειριστή. +webauthn-doAuthenticate=Σύνδεση με το Κλειδί Ασφαλείας +webauthn-createdAt-label=Δημιουργήθηκε + +# WebAuthn Error +webauthn-error-title=Σφάλμα Κλειδιού Ασφαλείας +webauthn-error-registration=Αποτυχία εγγραφής του κλειδιού ασφαλείας σας.
      {0} +webauthn-error-api-get=Αποτυχία ταυτοποίησης μέσω του Κλειδιού ασφαλείας.
      {0} +webauthn-error-different-user=Ο αρχικός ταυτοποιημένος χρήστης δεν είναι ο ίδιος με αυτό που ταυτοποιήθηκε με το Κλειδί ασφαλείας. +webauthn-error-auth-verification=Μη έγκυρο αποτέλεσμα ταυτοποίησης του Κλειδιού ασφαλείας.
      {0} +webauthn-error-register-verification=Μη έγκυρο αποτέλεσμα εγγραφής του Κλειδιού ασφαλείας.
      {0} +webauthn-error-user-not-found=Άγνωστος χρήστης ταυτοποιήθηκε με το Κλειδί ασφαλείας. + +# Identity provider +identity-provider-redirector=Σύνδεση με ένα άλλο Πάροχο Ταυτότητας +identity-provider-login-label=Ή σύνδεση με +idp-email-verification-display-name=Πιστοποίηση Email +idp-email-verification-help-text=Σύνδεση του λογαριασμού με επιβεβαίωση του email σας. +idp-username-password-form-display-name=Όνομα χρήστη και κωδικός πρόσβασης +idp-username-password-form-help-text=Σύνδεση του λογαριασμού σας μέσω της εισόδου σας. +finalDeletionConfirmation=Αν διαγράψετε το λογαριασμό σας, η ανάκτηση θα είναι αδύνατη. Για να παραμείνει, πατήστε Ακύρωση. +irreversibleAction=Αυτή η ενέργεια είναι μη αναστρέψιμη +deleteAccountConfirm=Επιβεβαίωση διαγραφής λογαριασμού +deletingImplies=Η διαγραφή του λογαριασμού σας συνεπάγεται: +errasingData=Διαγραφή όλων των δεδομένων σας +loggingOutImmediately=Άμεση αποσύνδεση σας +accountUnusable=Κάθε μεταγενέστερη χρήση αυτής της εφαρμογής δεν θα είναι δυνατή με αυτό το λογαριασμό +userDeletedSuccessfully=Ο χρήστης διαγράφηκε με επιτυχία +access-denied=Δεν επιτρέπεται η πρόσβαση +access-denied-when-idp-auth=Δεν επιτρέπεται η πρόσβαση κατά τη ταυτοποίηση με {0} +frontchannel-logout.title=Αποσύνδεση +frontchannel-logout.message=Αποσυνδέεστε από τις παρακάτω εφαρμογές +logoutConfirmTitle=Αποσύνδεση +logoutConfirmHeader=Σίγουρα να γίνει αποσύνδεση; +doLogout=Αποσύνδεση +readOnlyUsernameMessage=Δε μπορείτε να ενημερώσετε το όνομα χρήστη σας καθώς είναι μόνο-για-ανάγνωση. diff --git a/themes/hellug-keycloak/login/messages/messages_en.properties b/themes/hellug-keycloak/login/messages/messages_en.properties new file mode 100644 index 0000000..bcf622c --- /dev/null +++ b/themes/hellug-keycloak/login/messages/messages_en.properties @@ -0,0 +1,2 @@ +# encoding: UTF-8 +locale_el=Ελληνικά diff --git a/themes/hellug-keycloak/login/resources/css/login-hellug.css b/themes/hellug-keycloak/login/resources/css/login-hellug.css deleted file mode 100644 index 3668b1b..0000000 --- a/themes/hellug-keycloak/login/resources/css/login-hellug.css +++ /dev/null @@ -1,21 +0,0 @@ -.login-pf body { - background: url("../node_modules/rcue/dist/img/bg-login.png") no-repeat left top fixed; - background-size: auto; - height: 100%; -} - -@media (max-width: 767px) { - .login-pf body { - background: white; - } -} - -@media (min-width: 767px) { - .login-pf { - background-attachment: fixed; - } -} -#kc-header-wrapper sup { - font-size: 35%; - top: -1.4em; -} diff --git a/themes/hellug-keycloak/login/resources/img/feedback-error-arrow-down.png b/themes/hellug-keycloak/login/resources/img/feedback-error-arrow-down.png deleted file mode 100644 index 6f2d9d2aeb1c1461767988a042aae50492d454bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmV+c0{;DpP)pbFH`>7=NJimT8HPR1b>!7GRq%%D)H?|Wo% zC@Pq9$n!u*^5*>k`A#3+kZfF(`zJ152&b=J2><{9!0hZbO_;oR8NR%F9kLkE@5Z(} z|9X+Rqj^|(^f2UQ`B&qbstQ}zSHs@7Mx_7%0O*T*Sywa1;J+C|`oj73Q8;qyTvEs3fk{(-JWjQ|4!;N?Hk9Wu}T8~06?E)T~0nO z$|9aN^E2gq`rLgk&kqde>9h9ceYG2J7l(CKD-8eu0DaQs4ti*V_8>1|L40001@p8^a34>6V-IeVqb00000NkvXXu0mjf D@HyfE diff --git a/themes/hellug-keycloak/login/resources/img/feedback-error-sign.png b/themes/hellug-keycloak/login/resources/img/feedback-error-sign.png deleted file mode 100644 index 0dd500445d7249ddd1b1dea7dc79d5e2f75cf223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 343 zcmV-d0jU0oP)Rb^f-HfiA|a#ZS&BN>m{U!Bf9XBlP=AUsPhep z0;u>nQCxb~G6c;4tOM)aDVebC2LF?__!*$Y%|S5$e;ZcIdR+o#XrlC>L#@3RFZO+y z4ac0_$8S?_3L#)o1cV>wsb|~_2qr}-{Xy0sk1ddFrS2NjYBy!#lv@hhf%T~P1a2ls zg9cR!$Y8{U0euD81vt(&PyxuVl0?xy+oT=qfZ( zU<;qzo;L~X{8Dl*OuQ;g6C?jcvTY4MH)UgY@3N+I%Y&B-aM#Gmz4*K9-@h9B>+j#Q z@1I{-{^;BJ=zrF!cK!}Pr!g=bh|HcT>Z=m}wDHmbyC0nDaV#gVm&uycGotW zpv;r|b9e9Fzj)!!_FHF``Wx|qb*+1{*5LE=)%xG0rlsBtdT?-dwR{mlor@ArQ!T)1>sQ|BRGRy6pUXk5Eq%Jj zt#hDSUl#1`1Hp4rtdp{v4HrVu6{1-oD!M}vd diff --git a/themes/hellug-keycloak/login/resources/img/feedback-success-sign.png b/themes/hellug-keycloak/login/resources/img/feedback-success-sign.png deleted file mode 100644 index 640bd71cab7bdfc7a8adcf28ffaf6db736a1c008..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 410 zcmeAS@N?(olHy`uVBq!ia0vp^f*{Pn1|+R>-G2comSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9oo-U3d z7QI&|@AYC16lmSQ(|nzi6W2vA0hQiX{shsj9%4*QVx6m7=T11}S0g4pTOrBJ(L2zj zqqUbmAu&;Tnwis)`FE;yFXbH4TM_-V#F%}bS9C7N)nccy^_%s?ydQOE$UA=bQASGdP zUS5*^?Y}eFBd=Y%8?p303zx;a-hVOO%tz8T)jmnDmV3_E#n4nO@i}MX#=5_=rbOm! z*!s=OFZw-8%CQyiuZC^?Jc-4l;#4*gQu&X%Q~loCIB2_ BsrLW? diff --git a/themes/hellug-keycloak/login/resources/img/feedback-warning-arrow-down.png b/themes/hellug-keycloak/login/resources/img/feedback-warning-arrow-down.png deleted file mode 100644 index 6f2d9d2aeb1c1461767988a042aae50492d454bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 513 zcmV+c0{;DpP)pbFH`>7=NJimT8HPR1b>!7GRq%%D)H?|Wo% zC@Pq9$n!u*^5*>k`A#3+kZfF(`zJ152&b=J2><{9!0hZbO_;oR8NR%F9kLkE@5Z(} z|9X+Rqj^|(^f2UQ`B&qbstQ}zSHs@7Mx_7%0O*T*Sywa1;J+C|`oj73Q8;qyTvEs3fk{(-JWjQ|4!;N?Hk9Wu}T8~06?E)T~0nO z$|9aN^E2gq`rLgk&kqde>9h9ceYG2J7l(CKD-8eu0DaQs4ti*V_8>1|L40001@p8^a34>6V-IeVqb00000NkvXXu0mjf D@HyfE diff --git a/themes/hellug-keycloak/login/resources/img/feedback-warning-sign.png b/themes/hellug-keycloak/login/resources/img/feedback-warning-sign.png deleted file mode 100644 index f9392a356fd3b383997c1ef289b48d02be96c351..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmV;10(t$3P)5ebW)JIb`v2;&5sUEt7(pdR?_rqvF~(w z&wHPH?%{G}o6t%tD3-YcoIt#ZimsMn=fj5~SV}0ANdw)$JIs+vm8VEr5vY*RCc!0O zJeKiMnQmZjF~P}|ITC|_fPR3sChh|hh#}5v^?!j1No^OL5!{Yt{P|l#ojGW*>A`F% zG;=oe?E0{aNj(7$L<2hJOpDEg;c-0Uu3}QpfZdv9Yul(xOFAm{YCmuc7-<=Hz6#rb zwStWR%+Uk1dKH(KznaJbxtT_8h1rkY@F&AK;#}dXHiv>reL9ZVhZt;6c{&UPfawRU z3PX!QX+>?W8zy57-1{e1nf<%`Ip2$C{RJ2WP8EB!V*#i*Ll@AAxI)U6d9kg;Tft2N zvI|T#k_Ga${UDcC6K25hA)et;?S`pV)*0TbLbSFYPx%LC5OMf>LI(kYhG{MW?Gclt z?kz+j>;xV-pszlvScx&iWL1nHDUdjgc-@-yi~8Zf?-uKCu&$j zmGV@tHY^&3ufPQiVR|G&lMFKJqcV3b2BIPt0$RTQ1o3gEnU}InzE6h&(}7s>n+PkJ gT)C0w?I} + + + + + Welcome to ${productNameFull} + + + + + + + + <#if properties.stylesCommon?has_content> + <#list properties.stylesCommon?split(' ') as style> + + + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + + + +
      +
      +
      +
      + ${productName} +

      Welcome to ${productNameFull}

      +
      +
      + <#if adminConsoleEnabled> +
      +
      + <#if successMessage?has_content> +

      ${successMessage}

      + <#elseif errorMessage?has_content> +

      ${errorMessage}

      +

      Administration Console

      + <#elseif bootstrap> + <#if localUser> +

      Administration Console

      +

      Please create an initial admin user to get started.

      + <#else> +

      + You need local access to create the initial admin user.

      Open ${localAdminUrl} +
      ${adminUserCreationMessage}. +

      + + + + <#if bootstrap && localUser> +
      +

      + + +

      + +

      + + +

      + +

      + + +

      + + + + +
      + + + +
      +
      + <#-- adminConsoleEnabled --> +
      +
      +

      Documentation

      +
      + + User Guide, Admin REST API and Javadocs + +
      +
      +
      +
      + <#if properties.displayCommunityLinks = "true"> + + + + +
      +
      +
      +
      +
      + + diff --git a/themes/hellug-keycloak/welcome/resources/admin-console.png b/themes/hellug-keycloak/welcome/resources/admin-console.png new file mode 100644 index 0000000000000000000000000000000000000000..ac734972ff042a5afcc95ab6e2c0303a22f71b2e GIT binary patch literal 712 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 literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/welcome/resources/bg-login.png b/themes/hellug-keycloak/welcome/resources/bg-login.png deleted file mode 100644 index c408a6511bd6aec62fdc984d59e5f720d5222891..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5040 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 diff --git a/themes/hellug-keycloak/welcome/resources/bg.png b/themes/hellug-keycloak/welcome/resources/bg.png index 531d5638b44894d6aa41c95a8273a91896f165b4..b722a001b320de8a297a800267f24499f017036c 100644 GIT binary patch literal 72796 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�uUMdUXaHskh$;TuNe>sE5A1;RU9ye9>rOq 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 S!r$><9D)niopX*Ii2es&w#-ui diff --git a/themes/hellug-keycloak/welcome/resources/bug.png b/themes/hellug-keycloak/welcome/resources/bug.png new file mode 100644 index 0000000000000000000000000000000000000000..4f00775caaf81996e72105047c9f2655259dedf6 GIT binary patch literal 1397 zcmV-*1&aEKP)CrLy>RCwC$TTN&iM-=|7h&mw_c5#fH&|nd2l@h4b__mN}14|E0 zTii>Ju}pK10zEFoDSPO_rOF|`mB`0l8o6;V?m|{QY)*C86cVETAQ87oXoRFFtt(UG z96SoE)z1EFwTkpWAkAoI=Y8|${mzc;@9$%fDTD#1aIYTB2;u~QB>7B`<{AJ6fFko; z&5w1A_;FbgC zLB`x+1aYY^C4dpc9DoJAzUlG9n2kmdpN;?kijN!k^+^Md>;KWFTa|e(-8TTxm_Hkz z!ll$H%tj-+<2K7xeEs7e__%J!Q+*05HAZPxTx@~MU4F03jIQQ0+r8&Oe`U}@L zig@1qU)y!wE1eMP67v%Pa$4qZT%5DaJOErsoWPBXa~K=#u-2YghHfdrG=On+!xx_< zs3LDfv(X4HzZdUNjKrJ<7J!WU$NTRb$C;Ve9Zz;4aRO)KQ-;q73;>KE# z&wDA=F-L+NHGcqL1TjgNGb2|0URPMNnI3s{hZe2*}gcf!1*V8{f7AdxBajyyq=kJ9dQw4uWOoUFQQxn(Aun z_mS5Q;pF5|>i;W^CMwUHww^ILHj2r}D7F7#b0x-xFHt_OT9HgF&!rWK@c}nZ0zSO=4fLyDx6s9nr0q|9yZt9GQBb5TMzzE`^ z%yT)~5y%XH^kcY`kU-^Cr7{j~tLW6)t1zw}*VMU! zuu0-WGRX(90o>h^ox1~l?*~*GO;_XH0?<|qaFdvD3_xdwN%0c^#p@lhLk}zenr@2k z06g$f3iO_3_wJA@07yBk&0H#_s&4?u#lN*pgCWyRme=ojY88}H70c`Qw3VP1WsNRFc@BW8CQpsMcXs#i z<@$ZxEd1{3NK_h4tZWpq@Gols< zmW!hyhr6Fc`wgrX)d8H>3#E5<_w>w`6IWLq(r&qxgpdQ~vy>3HRhE{BQe5kz6}(QK z!MX(@WRv+cfXkHbmtrULTutV=c_Iy49x`6Q!BzPTc}C4G2qBxy-=uUe>YX{6=Omfu zk^mN+xTz{y1MsoTbF9|acMF0YC77kOUom^Li}dG+AV|ox00000NkvXXu0mjf D>3@or literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/welcome/resources/css/welcome-hellug.css b/themes/hellug-keycloak/welcome/resources/css/welcome-hellug.css deleted file mode 100644 index 68e903c..0000000 --- a/themes/hellug-keycloak/welcome/resources/css/welcome-hellug.css +++ /dev/null @@ -1,12 +0,0 @@ -body { - background-image: url(../bg.png),url(../bg-login.png); - background-repeat: no-repeat,no-repeat; - background-position: right bottom, left top; - background-size: auto, auto; - background-color: #1a1a1a; - height: 100%; -} - -.welcome-header { - color: #fff; -} diff --git a/themes/hellug-keycloak/welcome/resources/css/welcome.css b/themes/hellug-keycloak/welcome/resources/css/welcome.css new file mode 100644 index 0000000..c6a679a --- /dev/null +++ b/themes/hellug-keycloak/welcome/resources/css/welcome.css @@ -0,0 +1,140 @@ +body { + background: #fff url(../bg.png) no-repeat center bottom fixed; + background-size: cover; +} +.welcome-header { + margin-top: 10px; + margin-bottom: 50px; + margin-left: -10px; +} +.welcome-header img { + width: 150px; + margin-bottom: 40px; +} +.welcome-message { + margin-top: 20px; +} +.h-l { + min-height: 370px; + padding: 10px 20px 10px; + overflow: hidden; +} +.h-l h3 { + margin-bottom: 10px; +} +.h-m { + height: 110px; + padding-top: 23px; +} +.card-pf img { + width: 22px; + margin-right: 10px; + vertical-align: bottom; +} +img.doc-img { + width: auto; + height: 22px; +} +.link { + font-size: 16px; + vertical-align: baseline; + margin-left: 5px; +} +h3 { + font-weight: 550; +} +h3 a:link, +h3 a:visited { + color: #333; + font-weight: 550; +} +h3 a:hover, +h3 a:hover .link { + text-decoration: none; + color: #00659c; +} +.h-l h3 a img { + height: 30px; + width: auto; +} + +.description { + margin-top: 30px; +} + +.card-pf { + border-top: 1px solid rgba(3, 3, 3, 0.1); + box-shadow: 0 1px 1px rgba(3, 3, 3, 0.275); +} + +.welcome-form label, +.welcome-form input { + display: block; + width: 100%; +} + +.welcome-form label { + color: #828486; + font-weight: normal; + margin-top: 18px; +} +.welcome-form input { + border: 0; + border-bottom: solid 1px #cbcbcb; +} +.welcome-form input:focus { + border-bottom: solid 1px #5e99c6; + outline-width: 0; +} +.welcome-form button { + margin-top: 10px; +} +.error { + color: #c00; + border-color: #c00; + padding: 5px 10px; +} +.success { + color: #3f9c35; + border-color: #3f9c35; + padding: 5px 10px; +} +.welcome-form + .welcome-primary-link, +.welcome-message + .welcome-primary-link { + display: none; +} + +.footer img { + float: right; + width: 150px; + margin-top: 30px; +} + +@media (max-width: 768px) { + .welcome-header { + margin-top: 10px; + margin-bottom: 20px; + } + .welcome-header img { + margin-bottom: 20px; + } + h3 { + margin-top: 10px; + } + .h-l, + .h-m { + height: auto; + min-height: auto; + padding: 5px 10px; + } + .h-l img { + display: inline; + margin-bottom: auto; + } + .description { + display: none; + } + .footer img { + margin-top: 10px; + } +} diff --git a/themes/hellug-keycloak/welcome/resources/keycloak-project.png b/themes/hellug-keycloak/welcome/resources/keycloak-project.png new file mode 100644 index 0000000000000000000000000000000000000000..cd63e5ab3f4d336d98442deed73272fa0b47edb5 GIT binary patch literal 1611 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 E08=aAq5uE@ literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/welcome/resources/logo.png b/themes/hellug-keycloak/welcome/resources/logo.png index 93d38e3dc01bbb33b5aa3f8426138554008c8d2c..134440b16ebf5c23935f14502c08903a530d7829 100644 GIT binary patch literal 7539 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 E08=aAq5uE@ literal 26839 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 diff --git a/themes/hellug-keycloak/welcome/resources/mail.png b/themes/hellug-keycloak/welcome/resources/mail.png new file mode 100644 index 0000000000000000000000000000000000000000..3a63e7b855b579a170e559a232e386d561542cf3 GIT binary patch literal 1037 zcmV+o1oHcdP)T2Cy$)U9 zZdp7YFBPaeaOG=McRPR&D4pN~sH2jds;Vf5N+!aSigM17{Pc&g>$$jn=_QqXlS(GS zcvmB*wkQ;hVaoLV&NUwUrW?-X9x1zcq;2I|9QXq1!My$u{8tf9f$bh&qz3~42YtpV zzewvPg4y;?5sJn*0cP3qB1~8-5iA^y!MH{jJ(Pn!!^Ykzag3MhL$oh|Mf+h<_pTME zC*?SG--n&_Il_?`UiUsPs)oILe1S##Au$Eh?pR_H&js{WchR%~%a#|$b^2Z?B3O@1 z1VJUmY5{tyn^;y0S^bP_G%VXEtg(T%y7XYOS|JP?1q&`5jlsB1!?NZ5FFxt5?&R}e z0!laBnprAJ#X^|0N;HXu>{Qr3f!?}buy){}&!D%u;U%c>wqHhsy4SI~r&U_;r01eFv_S|!Fi8*(omy5Uw#54EsT(;tjLZ*@P&DJ2w*L2unB z_Nb1=8kpa7LrTb|tiS+ZP+kv%MuFODKFhl$`_aAqBp07%S6!e92ivjE1{fw35b&wA z^YAi#pj0fxvi1dfWFpqs#@=aOykmUw2P3T1n;(^9s$Z7zT)b=^EZ|dE7?WdCEg^dM z?$b`r-Ywb>i9R)n|5j;rvnZ?ic)2WMQZ2#!sGQgmX3egwybDERm@&KHq|ZU>sm2LK zTA%U;1_0`25eymyu_a{c9pe+JluxQ9SQwLMAwe49e^Oxw=xw zQ%v>CAQcPn-r{C?XW2d>p7D~4gfYWXUXUG2?sq1wl2ugF#XwsfmbJ>fLFFBc@y`6F zn|KsUj@oKI=11iz&wE9Yipk#ThFdYImf+*&5jGFb5RBa1NxSjRXL)g{pkTKT(#&oI zuW#VH4CmC7iViG!7o~h*p&pli$BHE$!5+bi73}Jodw(MZ32SCm#cw};0RV)2iZfu_ zgkP`9x@Ong0qm4mCVnm1w+0x;rT~~q1ZpJlo(B`9^k&W<$SS3jt?36p00000NkvXX Hu0mjf{@~(i literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/welcome/resources/user.png b/themes/hellug-keycloak/welcome/resources/user.png new file mode 100644 index 0000000000000000000000000000000000000000..0d61bb470927ad8c25aaed14dbd338b6f4a865fe GIT binary patch literal 2423 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 literal 0 HcmV?d00001 diff --git a/themes/hellug-keycloak/welcome/theme.properties b/themes/hellug-keycloak/welcome/theme.properties index bc3dc15..b63f3ff 100644 --- a/themes/hellug-keycloak/welcome/theme.properties +++ b/themes/hellug-keycloak/welcome/theme.properties @@ -1,6 +1,5 @@ parent=keycloak +styles=css/welcome-hellug.css -styles=css/welcome.css css/welcome-hellug.css - -documentationUrl=https://wiki.hellug.gr/index.php?title=%CE%A5%CF%80%CE%B7%CF%81%CE%B5%CF%83%CE%AF%CE%B1_Hellug_Auth +documentationUrl=https://https://wiki.hellug.gr/index.php?title=%CE%A5%CF%80%CE%B7%CF%81%CE%B5%CF%83%CE%AF%CE%B1_Hellug_Auth displayCommunityLinks=false