Compare commits

..

1737 Commits

Author SHA1 Message Date
Girish Ramakrishnan ccaabd6f06 Fix text for custom apps 2020-06-29 19:43:45 -07:00
Girish Ramakrishnan 9ba79cfb32 Fix infinite loop when postinstall has <br/> in it 2020-06-29 19:39:26 -07:00
Johannes Zellner 62e0e34e12 Do not hide info button for custom apps but show note about that in the dialog 2020-06-29 16:27:50 +02:00
Johannes Zellner 2d50ae4b00 Show self-signed error for external ldap setup 2020-06-26 15:18:25 +02:00
Johannes Zellner 11b567391c Allow self-signed cert for external ldap 2020-06-25 17:54:55 +02:00
Johannes Zellner e50e488c8a Improve how sftp is mentioned in access controls 2020-06-25 10:36:25 +02:00
Girish Ramakrishnan 2a9d32309e Fix the app info dialog 2020-06-24 23:06:12 -07:00
Johannes Zellner de0370011c Support old default autoupdate pattern 2020-06-24 12:21:27 +02:00
Girish Ramakrishnan 4a844e582e Fix wording of subscription dialog 2020-06-23 17:25:27 -07:00
Girish Ramakrishnan d36aad4adc polish the wording 2020-06-23 09:49:11 -07:00
Girish Ramakrishnan 11240b6bbb improve wording a bit 2020-06-23 09:06:47 -07:00
Johannes Zellner b52d3231e4 Add support for special app login page like wordpress has 2020-06-23 12:50:44 +02:00
Johannes Zellner c9ba4ba50a Add nfs storage provider 2020-06-22 15:51:18 +02:00
Johannes Zellner 4db07b5254 Fix form error handling for mount points 2020-06-22 15:44:59 +02:00
Johannes Zellner 83688f9fd8 Add link to cifs/sshfs docs 2020-06-22 15:43:19 +02:00
Johannes Zellner 7a384846f8 Add MSP as purpose option 2020-06-19 22:04:41 +02:00
Girish Ramakrishnan 923f7f3aa8 Do not count stopped apps for memory use 2020-06-18 10:25:21 -07:00
Johannes Zellner 8e0cfcda88 Keep subscription setup screens consistent 2020-06-18 17:59:59 +02:00
Johannes Zellner cd90af35a1 Fix active category selection if appstore search is empty 2020-06-18 17:13:20 +02:00
Johannes Zellner d2ac8536b3 402 is a license error and also returned if no appstore account setup 2020-06-18 14:50:24 +02:00
Johannes Zellner 5100a28ff1 Remove unused features 2020-06-18 14:34:06 +02:00
Johannes Zellner 0830e9293d Disable domain remove button for dashboard domain 2020-06-18 14:06:34 +02:00
Johannes Zellner 4a981cd2e2 Show subscription setup for domain adding 2020-06-18 13:56:37 +02:00
Johannes Zellner b1d956f7bf Show subscription setup dialog for more users 2020-06-18 12:57:12 +02:00
Johannes Zellner 75b2c7236a Use the same pattern for subscription setup in settings and users view 2020-06-18 12:29:25 +02:00
Johannes Zellner c8278e7b24 Add subscription setup link to paid branding feature 2020-06-18 12:16:16 +02:00
Girish Ramakrishnan dbf6520860 more newlines 2020-06-17 20:37:28 -07:00
Johannes Zellner e593e48d40 Remove debug console.log 2020-06-17 13:16:27 +02:00
Johannes Zellner 39bccea953 Simplify footer branding html 2020-06-17 13:15:52 +02:00
Johannes Zellner 98f62eba9d Improve error case layout in setup 2020-06-17 12:43:04 +02:00
Girish Ramakrishnan 4e65728979 Better text 2020-06-16 12:31:29 -07:00
Johannes Zellner b58ca1506e Add more information to dnssetup screen 2020-06-16 15:28:58 +02:00
Johannes Zellner e0334b3ac8 Fix oversight to set correct view after admin setup 2020-06-16 13:23:32 +02:00
Johannes Zellner 0fa230527c Improve text layout in setupdns 2020-06-16 13:14:56 +02:00
Johannes Zellner 13c5085cb1 Fix scroll position in appstore when switching categories 2020-06-16 11:37:10 +02:00
Johannes Zellner 300a3919ab Fix appstore case without apps listed 2020-06-16 11:20:28 +02:00
Johannes Zellner e65d946633 Swap logs and info button 2020-06-16 11:08:37 +02:00
Johannes Zellner 412bd1c1f4 Make nginx logs available in log viewer 2020-06-15 17:30:32 +02:00
Johannes Zellner 1d15fd3178 Allow to specify region for custom s3 v4 compat 2020-06-15 16:51:56 +02:00
Johannes Zellner cb94737519 Fix bug where location change makes the app temporarily disappear 2020-06-14 16:31:06 +02:00
Johannes Zellner 01683e9383 Another attempt to fix app polling
Using taskId only to update app info leads to various outdated states if
an app task has finished. We need to also update once the task has
finished at least once. So instead of individual app polling, we can
simply rely on the all apps listing api, which we poll anyways and not
rely on the restricted properties in the main apps view.

The app configure will fetch the updated full properties now, not
relying on the Clients internal caching
2020-06-14 13:35:30 +02:00
Johannes Zellner 1960969325 Fix scrollbar quirk for chrome 2020-06-13 23:11:49 +02:00
Johannes Zellner b49721f514 Fix toolbar with layout 2020-06-13 23:11:17 +02:00
Johannes Zellner 6876e82d64 Highligh currently selected category button instead of showing the title 2020-06-13 23:01:48 +02:00
Johannes Zellner 15a7beae57 Show selected category in dropdown button 2020-06-13 22:56:24 +02:00
Johannes Zellner 297a635613 'Recently updated' becomes 'popular' used to be 'featured' 2020-06-13 22:47:10 +02:00
Johannes Zellner e0778c52e8 Fix appstore search margin on mobile 2020-06-13 22:43:35 +02:00
Johannes Zellner e09b9964be Do not overlay the scrollbar 2020-06-13 22:39:37 +02:00
Johannes Zellner 1d27926220 Shorten the appstore search placeholder text 2020-06-13 22:22:44 +02:00
Johannes Zellner 7427d549cc Make the appstore view not so wide 2020-06-13 22:22:25 +02:00
Johannes Zellner 37aeb3f713 Fix border radius in dropdown 2020-06-13 22:17:38 +02:00
Johannes Zellner 7bf06da9f8 Don't add 1sec delay for search input focus 2020-06-13 22:16:16 +02:00
Johannes Zellner b6157d58c8 Show if no app passwords are created 2020-06-12 15:46:34 +02:00
Johannes Zellner 4767fe5515 Fix z-index of appstore view to not overlay the menu 2020-06-12 15:44:13 +02:00
Johannes Zellner 750acdbcd7 Swap navbar icons to make sense 2020-06-12 15:41:23 +02:00
Johannes Zellner 29543fbc85 Use 'My Apps' everywhere 2020-06-12 15:34:54 +02:00
Johannes Zellner 05913d0ae0 Rename owner role to superadmin in UI bits 2020-06-12 15:20:18 +02:00
Johannes Zellner a31617fcb0 Rework the appstore view 2020-06-12 15:02:41 +02:00
Johannes Zellner ec71b622fc Ensure action items are aligned on mobile 2020-06-11 19:33:59 +02:00
Johannes Zellner 3dd659639d Add action item tooltips 2020-06-11 19:32:23 +02:00
Johannes Zellner 4aca2b64b9 Just show the rendered postinstall message as docs in info dialog 2020-06-11 15:32:24 +02:00
Johannes Zellner 4c2c27c686 move logs button into app grid 2020-06-11 15:24:18 +02:00
Johannes Zellner 429f45a09a add info dialog for apps 2020-06-10 18:00:50 +02:00
Johannes Zellner 886c668107 Show default memory requirement in app install 2020-06-10 11:31:29 +02:00
Johannes Zellner c0df62cd5b Give more info in dns setup what is happening with the domain 2020-06-10 11:28:47 +02:00
Johannes Zellner a8e6d727fa Add logic for email setup and invite setup forms 2020-06-09 15:39:27 +02:00
Johannes Zellner ccf1c78cbb Add ability to develop the setup screen more easily 2020-06-09 15:03:35 +02:00
Johannes Zellner 4e25688dd9 We always require owner email 2020-06-09 14:58:03 +02:00
Johannes Zellner 3378bf7a1e Remove provider from setup 2020-06-09 14:53:43 +02:00
Johannes Zellner 2bbafb5604 Remove unused pre-fill logic in setup 2020-06-09 14:53:19 +02:00
Girish Ramakrishnan 1e82774460 set poll frequency same as the apps.js 2020-06-08 20:26:25 -07:00
Girish Ramakrishnan dce865c3cb only fetch app when there is an active task
fixes cloudron/box#677
2020-06-08 18:01:19 -07:00
Girish Ramakrishnan 81bf84b50a re-use existing progress and message properties
now, when we go back to the app grid, it reflects immediately
2020-06-08 17:54:50 -07:00
Girish Ramakrishnan 94b6f5bffd Call postProcess in getApps 2020-06-08 17:20:18 -07:00
Johannes Zellner 5440a3b62b Ensure we send the info also for cifs 2020-06-08 18:00:04 +02:00
Johannes Zellner 24737382f9 Add CIFS storage backend 2020-06-08 17:52:56 +02:00
Johannes Zellner 5fa3215a4d Ensure additional group ldap settings are shown 2020-06-08 14:50:32 +02:00
Girish Ramakrishnan 105141be53 show warning for unstable updates
part of cloudron/box#698
2020-06-05 17:07:33 -07:00
Johannes Zellner e19edcb67a Do not crash when retention policy is unknown to the dashboard code 2020-06-05 14:35:34 +02:00
Johannes Zellner be0b61a628 Fix backup location display for sshfs 2020-06-05 13:03:16 +02:00
Johannes Zellner 8d79244068 Reorder backup provider list 2020-06-05 12:48:27 +02:00
Johannes Zellner 8ee66d3abf Add sshfs backup configuration 2020-06-05 12:47:33 +02:00
Johannes Zellner fb94416b1b Give more information about ldap sync 2020-06-05 08:59:04 +02:00
Johannes Zellner 70a925b416 Handle ldap groups in group edit form 2020-06-05 08:18:40 +02:00
Johannes Zellner 959f245ce4 Show ldap indicator for groups 2020-06-04 14:11:05 +02:00
Johannes Zellner b3eb650315 Allow to enable/disable group sync 2020-06-04 12:30:31 +02:00
Johannes Zellner bdf7da6ef6 Mention that ldap sync is not automatic 2020-06-04 11:01:18 +02:00
Johannes Zellner 36d49b8217 Refresh 20 apps in parallel 2020-06-03 23:38:00 +02:00
Johannes Zellner 18ac61e8ab custom asyncForEach() is gone 2020-06-03 23:17:06 +02:00
Johannes Zellner b524da23d5 custom asyncForEachParallel() is gone 2020-06-03 23:11:44 +02:00
Johannes Zellner eeac846f5a custom asyncSeries() is gone 2020-06-03 23:08:05 +02:00
Johannes Zellner 0410ba51ca Add a proper async library 2020-06-03 22:59:17 +02:00
Johannes Zellner ca3bf6fe5c Add a way to specify LDAP group related configs 2020-06-03 22:12:50 +02:00
Johannes Zellner 4353a05350 Just accept all image types for profile pictures
This works as we render things on the browser into a canvas which will
be stored as png on the server
2020-06-02 15:25:29 +02:00
Johannes Zellner d2a3bb7339 Accept all image types for cloudron avatar 2020-06-02 15:14:36 +02:00
Johannes Zellner 589ee2d0c5 Always use binary byte units 2020-06-02 14:34:38 +02:00
Girish Ramakrishnan 2178dcc963 Handle already exists
part of cloudron/box#688
2020-05-30 13:33:17 -07:00
Girish Ramakrishnan f18fdd4a46 Match default app auto-update pattern with box code 2020-05-30 10:47:00 -07:00
Girish Ramakrishnan 4352d9c698 Add note about triggering backup before stopping 2020-05-28 13:19:33 -07:00
Girish Ramakrishnan 494884595c do not allow backup, import, update in stopped state 2020-05-28 12:15:29 -07:00
Girish Ramakrishnan b17db02f9d Remove duplicate taskId check 2020-05-28 11:54:56 -07:00
Girish Ramakrishnan 0f33a6b34b Fix display of non-appstore apps 2020-05-27 22:31:10 -07:00
Girish Ramakrishnan 231dfe70d0 remove broken disk graphs 2020-05-27 22:24:10 -07:00
Girish Ramakrishnan 79eecd8b3e OVH requires region to be set
https://docs.ovh.com/gb/en/public-cloud/getting_started_with_the_swift_S3_API/#configure-aws-client
2020-05-27 18:11:28 -07:00
Girish Ramakrishnan ca09f64c12 force path style to true for minio
part of cloudron/box#680
2020-05-27 17:50:23 -07:00
Girish Ramakrishnan dea1f01998 Put some ordering 2020-05-27 09:34:04 -07:00
Girish Ramakrishnan 8cfae92c24 Keep the app backup list concise
if you have even more than 10 apps, the dialog overflows and makes for bad
screenshots...
2020-05-27 09:21:16 -07:00
Johannes Zellner 989a5ba685 Fix docs link to resurrect uninstalled apps 2020-05-27 13:38:43 +02:00
Girish Ramakrishnan a9e49d98fd Wait for sometime to refresh mail domains 2020-05-26 17:02:01 -07:00
Johannes Zellner f66d4e34d6 Bring back backupId clipboard logic 2020-05-25 21:47:58 +02:00
Johannes Zellner 989820183c Remove unused clipboard function 2020-05-25 21:47:10 +02:00
Girish Ramakrishnan 53f0e6c7d3 Fix regression in import UI 2020-05-24 18:44:42 -07:00
Girish Ramakrishnan 1608faecea Make min period as 12 hours
because we only collect disk data twice a day
2020-05-23 12:40:41 -07:00
Girish Ramakrishnan 4260082726 rename variable to avoid name conflict 2020-05-22 14:52:23 -07:00
Girish Ramakrishnan ca573dec91 hide the ruler 2020-05-22 12:05:23 -07:00
Johannes Zellner 3e252e1fd8 app disk usage is only collected twice a day 2020-05-22 19:48:18 +02:00
Johannes Zellner 7adc153e57 Also add swap to apps memory graph 2020-05-22 18:04:33 +02:00
Johannes Zellner ae105d9f83 Fixup app disk usage graphs 2020-05-22 17:16:37 +02:00
Johannes Zellner 87c895bd76 Show graph minutes, since we now have a smaller resolution 2020-05-22 16:33:27 +02:00
Johannes Zellner 034b2b2ddd Add backup details dialog
When a backup contains many apps, displaying them in the main backup
list is confusing and hides most apps
2020-05-22 13:48:29 +02:00
Girish Ramakrishnan fb5a789f55 1 monthly does not make much sense 2020-05-21 14:09:06 -07:00
Johannes Zellner 2b36a2f8cb Fix busy state for automatic updates and backups 2020-05-20 12:16:35 +02:00
Johannes Zellner d2a81ce907 Move retention and backup schedule interval into a separate settings dialog 2020-05-19 16:13:20 +02:00
Johannes Zellner 1f0b0d7bd1 Add all wasabi regions 2020-05-19 14:52:42 +02:00
Girish Ramakrishnan 735527a0f0 rework the updates ui to show the app id
browser are hiding the URL bar and it's becoming harder to get to that id
2020-05-18 14:57:24 -07:00
Girish Ramakrishnan 4dc034dd5e better redis label 2020-05-18 14:57:13 -07:00
Girish Ramakrishnan 4bfe4079cc Show enabled/disabled with appropriate class 2020-05-17 09:11:19 -07:00
Girish Ramakrishnan 66eff3a020 Add save/restore backup config to app view 2020-05-16 11:19:47 -07:00
Girish Ramakrishnan 401c561238 Fix spacing in restore view 2020-05-16 10:32:33 -07:00
Girish Ramakrishnan 606fe87ca0 backups: show the app info in contents 2020-05-16 09:47:00 -07:00
Girish Ramakrishnan f4775cc17c eventlog: handle update error 2020-05-15 21:37:27 -07:00
Girish Ramakrishnan a2e941970a Show endpoint 2020-05-15 16:05:30 -07:00
Girish Ramakrishnan c2ed909818 fixes to backups view 2020-05-15 12:48:54 -07:00
Johannes Zellner c38c440e63 Do not throw exception if no app graph data is yet available 2020-05-15 11:49:02 +02:00
Johannes Zellner 29b0785594 Fix cleanup backup button style
Sorry for messing with the btn style names, this grew
2020-05-15 11:41:55 +02:00
Johannes Zellner e15dcd41db Fix documentation links in restore view 2020-05-15 11:40:41 +02:00
Girish Ramakrishnan 6528461873 Add backup listing UI 2020-05-14 22:42:41 -07:00
Girish Ramakrishnan a8f5b5d4e4 Change label to MB 2020-05-14 21:56:22 -07:00
Girish Ramakrishnan be489744c9 Add some retention policies 2020-05-14 21:36:22 -07:00
Girish Ramakrishnan cd0b7ed3d2 rename to keepWithinSecs 2020-05-14 16:45:52 -07:00
Girish Ramakrishnan 3ebc5c6b9d retentionSecs is now retentionPolicy 2020-05-14 16:41:55 -07:00
Girish Ramakrishnan 66ada600b7 rename retentionSecs to retentionPolicy 2020-05-14 16:27:06 -07:00
Girish Ramakrishnan 4871d5df9d hide the binds ui for this release 2020-05-14 16:09:59 -07:00
Johannes Zellner 7088e6682b Add button to upload and pre-fill backup config 2020-05-15 00:32:49 +02:00
Johannes Zellner babe0adffb Remove secret values and add encryption flag in restore config json 2020-05-14 23:19:17 +02:00
Johannes Zellner 8f0a76ecef Make SECRET_PLACEHOLDER available globally 2020-05-14 23:04:19 +02:00
Girish Ramakrishnan 23607c303c typo 2020-05-13 22:37:11 -07:00
Girish Ramakrishnan 884b7062c9 rename version to packageVersion 2020-05-13 21:54:52 -07:00
Johannes Zellner 07650d424a Show a bit more explanation on the system memory graph 2020-05-14 00:01:42 +02:00
Johannes Zellner 218ec9c678 Plot app memory against the apps memory limit 2020-05-13 23:38:32 +02:00
Johannes Zellner 8b7c3308b3 Remove noisy dots in graphs 2020-05-13 23:35:14 +02:00
Johannes Zellner ca9528fa4e Show app memory in system view 2020-05-13 23:34:14 +02:00
Johannes Zellner aef625ba31 Make it explicit what the graphs show in which units 2020-05-13 23:11:30 +02:00
Johannes Zellner e5c8f2caec Fixup disk graph summary 2020-05-13 22:53:51 +02:00
Johannes Zellner 5c06305f85 Remove unnecessary graphs header and dim top actions 2020-05-13 21:44:26 +02:00
Johannes Zellner 428893d5c5 Actually use cpu values in system graphs 2020-05-13 21:41:16 +02:00
Johannes Zellner fc7277a542 Only show redis services line if we even have a redis 2020-05-13 20:45:03 +02:00
Johannes Zellner c8c6b15285 Rework the system view layout 2020-05-13 20:41:56 +02:00
Girish Ramakrishnan 0a987bdec9 show lock for encrypted backups 2020-05-13 00:03:54 -07:00
Girish Ramakrishnan ecc4fee84e restore UI fixes for encrypted backups 2020-05-12 22:30:43 -07:00
Girish Ramakrishnan 4802ecfc29 Move the download config down 2020-05-12 21:59:01 -07:00
Girish Ramakrishnan 436f415d9f Add space in save button 2020-05-12 21:43:35 -07:00
Girish Ramakrishnan 164480834a do not reset password and other settings on provider change 2020-05-12 21:41:35 -07:00
Girish Ramakrishnan 68642e056c Show error message in app view 2020-05-12 21:34:44 -07:00
Girish Ramakrishnan 9033c6e1d4 user param is not needed 2020-05-12 21:30:57 -07:00
Girish Ramakrishnan 89fc6feb5f password is not stored 2020-05-12 21:30:52 -07:00
Johannes Zellner 80dc9568ce Remove graphs page 2020-05-13 01:15:04 +02:00
Johannes Zellner 5774a7893f Improve app graph layout 2020-05-13 01:12:13 +02:00
Johannes Zellner abd9ea9ec5 Add memory and disk graphs to app view 2020-05-13 00:42:34 +02:00
Girish Ramakrishnan 8799882f09 show warning only if location or format changed 2020-05-12 14:59:06 -07:00
Girish Ramakrishnan f85a4878de rename backup key to password 2020-05-12 14:53:37 -07:00
Johannes Zellner ae87213105 Show hint about required subscription for app update 2020-05-11 23:14:19 +02:00
Johannes Zellner 33bd86a2c7 Show larger app configure icon on mobile 2020-05-11 12:01:01 +02:00
Girish Ramakrishnan 2092ae22dc redis: show app fqdn instead of location 2020-05-07 09:31:31 -07:00
Johannes Zellner aa9317069a Group redis services and have them collapsed 2020-05-05 16:36:52 +02:00
Girish Ramakrishnan a31ea92649 Add a UI for binds 2020-05-02 11:07:36 -07:00
Girish Ramakrishnan b8f18bdec2 Add OVH Object Storage regions 2020-04-29 13:13:01 -07:00
Johannes Zellner 704977d5f6 Avoid some flickering of apps ui while loading 2020-04-28 15:52:04 +02:00
Johannes Zellner 0757c20d59 Show inline text with backup config downlaod link to avoid prominent button 2020-04-21 11:26:52 +02:00
Girish Ramakrishnan fa08847d6d Query aliases for each mailbox 2020-04-20 19:18:11 -07:00
Girish Ramakrishnan f91f08628a Better variable name 2020-04-20 16:35:52 -07:00
Girish Ramakrishnan 9ebf6b06dd mail: implement aliases across domains
Part of #577
2020-04-20 16:07:23 -07:00
Johannes Zellner 357d5e46a3 Add backup config download button 2020-04-20 18:21:35 +02:00
Girish Ramakrishnan c0f5526801 Simple add a used label for disks that contains nothing we monitor 2020-04-18 23:02:16 -07:00
Girish Ramakrishnan 861204e442 sort returns compare value and not bool 2020-04-18 22:56:12 -07:00
Girish Ramakrishnan eb90b614ea disks: busy flag 2020-04-18 22:48:09 -07:00
Girish Ramakrishnan d087ed2349 graph query exceeeds param limit
node.js has some built-in http header limit. when this gets exceeded,
it terminates the connection and all the queued queries fail as well
2020-04-18 21:25:10 -07:00
Girish Ramakrishnan 6ee7e75465 do not popup error dialogs 2020-04-18 18:09:54 -07:00
Girish Ramakrishnan c2b80d7aba show icon for list 2020-04-18 17:39:13 -07:00
Girish Ramakrishnan a95e8633cd mail list: add members only checkbox 2020-04-17 17:55:07 -07:00
Johannes Zellner e3adbbe000 Only show subscription setup dialog when coming from free 2020-04-14 18:38:59 +02:00
Johannes Zellner eef360673b Also hide the app header bits to avoid empty ui fragments while loading 2020-04-12 13:20:01 +02:00
Girish Ramakrishnan 36e298c758 check for updates wants more space 2020-04-11 17:46:19 -07:00
Girish Ramakrishnan 275157f27b Show logs link when updater has error 2020-04-11 17:44:04 -07:00
Girish Ramakrishnan e776deaa3f Add note on Ext4/NFS mounts only 2020-04-09 15:49:47 -07:00
Johannes Zellner 4fc8e9b45e Ensure disable state for all form elements in backup import 2020-04-09 13:15:26 +02:00
Johannes Zellner fe41eec7c5 Fix spacing on import button in app view 2020-04-09 13:13:14 +02:00
Johannes Zellner d1d1d22734 Ensure we only show the tabs and content when app is loaded 2020-04-08 12:56:57 +02:00
Girish Ramakrishnan da8b76957a sort disk contents by usage 2020-04-03 10:41:04 -07:00
Girish Ramakrishnan 305f9fd1cf show apps with automatic backups disabled 2020-04-03 10:36:51 -07:00
Girish Ramakrishnan cd2a94ddb8 typo in variable name 2020-04-03 09:56:38 -07:00
Johannes Zellner a2df4db504 Parse task creationTime also as utc 2020-04-02 12:19:42 +02:00
Girish Ramakrishnan b7740a4758 do not count reserved as used 2020-04-01 22:15:03 -07:00
Girish Ramakrishnan 62c24de5c4 don't say ubuntu
https://forum.cloudron.io/topic/2228/what-type-area-of-data-makes-up-other-in-disk-usage/4
2020-04-01 18:39:05 -07:00
Girish Ramakrishnan 5ed3e67b76 graphs: ubuntu is only on the root mount point 2020-04-01 16:56:56 -07:00
Girish Ramakrishnan c7f2314a15 add note that memory is 1024 based 2020-04-01 16:42:20 -07:00
Girish Ramakrishnan 420c7ebd67 Fixup mail sizes to be 1000 and not 1024 2020-04-01 16:29:10 -07:00
Girish Ramakrishnan b93b1a6eec Fix prettyDiskSize to use 1000 instead of 1024 2020-04-01 16:26:47 -07:00
Girish Ramakrishnan 7d52be6e99 system: setError is not defined 2020-03-31 18:47:19 -07:00
Girish Ramakrishnan 9b1f0e394a set busy to false on error 2020-03-31 17:45:34 -07:00
Girish Ramakrishnan 1b0cb5d455 remove API calls to add/remove mail domain separately
part of cloudron/box#669
2020-03-31 10:59:01 -07:00
Girish Ramakrishnan 9b79d59d93 Add API token note 2020-03-30 22:37:25 -07:00
Girish Ramakrishnan 3e12316ea1 better wording from rob 2020-03-30 22:34:47 -07:00
Johannes Zellner 1b38c0111f Add turn to logviewer 2020-03-30 18:43:43 +02:00
Girish Ramakrishnan 5542393eb5 branding: fix login page title 2020-03-28 22:59:07 -07:00
Girish Ramakrishnan ad48bc0ee8 mail: refresh in the background 2020-03-28 17:48:11 -07:00
Girish Ramakrishnan ba0e5d0b59 query 1000 aliases and mailboxes
we don't handle pagination yet. it's not needed
2020-03-28 17:35:53 -07:00
Girish Ramakrishnan 1c5ff88e3c Use space instead of command for tag-input
this makes sure that email aliases wrap. if we used comma, it does not wrap
2020-03-28 16:46:19 -07:00
Girish Ramakrishnan bf7d4a550e ftp apps can be set a per-app password
this is useful for use in ftp clients
2020-03-26 21:50:44 -07:00
Girish Ramakrishnan 324bc763fc mail eventlog is owner only 2020-03-26 18:56:32 -07:00
Girish Ramakrishnan f9fb2ca3a1 Fixup users filter 2020-03-26 18:32:49 -07:00
Girish Ramakrishnan b5eac7c91b email: add type filter to eventlog 2020-03-25 22:07:01 -07:00
Johannes Zellner 3c858ca0fd Only show the progress bar when task is actually active 2020-03-26 00:22:46 +01:00
Johannes Zellner da9d634b83 Remove already hidden task stop button 2020-03-26 00:19:50 +01:00
Johannes Zellner 128704400f Hook up task cancel action 2020-03-26 00:19:06 +01:00
Johannes Zellner a3594322bd Show task cancel button after 5min 2020-03-26 00:16:23 +01:00
Girish Ramakrishnan fe4b3d5f1d branding: use separate css 2020-03-25 08:56:56 -07:00
Johannes Zellner da08da2b54 Use footer info from settings to show empty on default 2020-03-25 07:00:53 +01:00
Johannes Zellner 5deb5f79bd Ensure textareas don't overflow horizontally on resize 2020-03-25 06:58:38 +01:00
Johannes Zellner 9f0d694f0a Prevent angular crash when adding already existing tag 2020-03-25 06:51:42 +01:00
Johannes Zellner 4153fb7d1e Use theme for tag-input tags 2020-03-25 06:51:42 +01:00
Johannes Zellner 6994ec0f03 Allow to click anywhere in tag-input for focus 2020-03-25 06:51:42 +01:00
Johannes Zellner e1af60cfa9 Fix tag-input with flex layout to better overflow 2020-03-25 06:51:42 +01:00
Johannes Zellner 7bcec61e6d Make tag-input support dirty handling on tag deletion 2020-03-25 06:51:42 +01:00
Girish Ramakrishnan dde287f05d avatar size is 128px 2020-03-24 13:04:12 -07:00
Girish Ramakrishnan 27fc37e55c descriptive mail eventlog 2020-03-20 13:05:58 -07:00
Girish Ramakrishnan ad901760f6 move footer to separate section 2020-03-19 23:28:22 -07:00
Girish Ramakrishnan 973029865e Branding UI changes 2020-03-19 22:59:30 -07:00
Girish Ramakrishnan 52e4fedd16 fieldset must be inside form 2020-03-19 19:26:19 -07:00
Girish Ramakrishnan b81ba49370 CPU shares is a percent 2020-03-19 17:15:08 -07:00
Girish Ramakrishnan 39a0f93f69 add cpuShares 2020-03-19 17:11:51 -07:00
Girish Ramakrishnan 53cb83eacc eventlog: add start/stop/restart logs 2020-03-19 17:05:50 -07:00
Girish Ramakrishnan b307d278b0 mailboxName should have lower priority than location change 2020-03-19 16:48:46 -07:00
Girish Ramakrishnan 14348eba38 Move name and logo into branding page 2020-03-18 22:11:33 -07:00
Girish Ramakrishnan cead5b74ae if ldap is noop, show a message 2020-03-18 21:44:55 -07:00
Girish Ramakrishnan 2e2a945f7c add custom apps link 2020-03-18 21:25:19 -07:00
Girish Ramakrishnan 0e3ae2b450 add new branding view 2020-03-18 17:53:50 -07:00
Girish Ramakrishnan 19e2df65ca backups: hide configure button for non-owners 2020-03-18 17:24:20 -07:00
Girish Ramakrishnan 565d715a66 remove extra break 2020-03-18 13:43:15 -07:00
Girish Ramakrishnan abe6f55aa6 gcdns: fix add/save 2020-03-17 22:51:47 -07:00
Girish Ramakrishnan c278d0c5d4 bring back reboot button 2020-03-17 22:26:01 -07:00
Girish Ramakrishnan a7e2c74158 more linode warnings 2020-03-13 12:05:47 -07:00
Girish Ramakrishnan d84900d601 linode: dns frontend 2020-03-13 11:32:30 -07:00
Girish Ramakrishnan fdda28d67f lint 2020-03-12 17:07:17 -07:00
Johannes Zellner e00dccaa7c Set autofocus in setupdns view 2020-03-09 16:08:55 -07:00
Johannes Zellner 08c1a33362 Ensure tabindex works better in setupdns 2020-03-09 16:07:10 -07:00
Johannes Zellner 31e3c8da30 Update feature test comments 2020-03-09 14:19:12 -07:00
Girish Ramakrishnan 62a6095ed7 remove obsolete mail events 2020-03-09 13:49:22 -07:00
Johannes Zellner 4c2c0e2b95 Fix login footer 2020-03-09 13:32:49 -07:00
Johannes Zellner d36e4937d4 Mark backup folder in backup config as required 2020-03-09 13:28:06 -07:00
Johannes Zellner fea48e8220 Do not show noop provider for external ldap 2020-03-09 13:04:44 -07:00
Girish Ramakrishnan 637a59136b email size can be 0 unlike disk size 2020-03-07 16:09:44 -08:00
Johannes Zellner 385d275f59 Another attempt on fixing the user edit with roles business 2020-03-07 14:05:58 -08:00
Johannes Zellner e240ac1fa5 Disable subscription UI in demo mode 2020-03-07 10:00:32 -08:00
Johannes Zellner 4f020c1ec7 Do not allow the admin to edit the owner 2020-03-07 02:25:57 -08:00
Johannes Zellner 237decb81e Dont not show all those mail events 2020-03-07 02:21:21 -08:00
Johannes Zellner 1c98cba36d Show busy state on webtoken logout 2020-03-07 01:59:38 -08:00
Girish Ramakrishnan 21fb815adc inform user that it takes a while 2020-03-07 00:15:19 -08:00
Girish Ramakrishnan 6b729bd9b5 typo 2020-03-07 00:07:36 -08:00
Girish Ramakrishnan a7ee869c8e Remove the source from eventlog 2020-03-06 23:11:26 -08:00
Girish Ramakrishnan bbbe3cc92f spam-selectdb is only new users now 2020-03-06 22:56:00 -08:00
Girish Ramakrishnan c1770c8d90 spam filter seeding begin/end 2020-03-06 22:44:30 -08:00
Girish Ramakrishnan 71b7e68937 5 rows 2020-03-06 20:43:57 -08:00
Girish Ramakrishnan dbca88829a Just put a hyphen 2020-03-06 20:38:48 -08:00
Girish Ramakrishnan ebd365a156 Alt message for spam-selectdb when users is empty 2020-03-06 19:34:51 -08:00
Johannes Zellner 698a20396c Always open markdown links in new tab 2020-03-06 19:11:39 -08:00
Johannes Zellner ffc2507362 Ensure we trim the footer content 2020-03-06 18:21:34 -08:00
Johannes Zellner 038d6fe2c3 For immediate update of the footer and cloudron name we have to rely on config here 2020-03-06 17:57:38 -08:00
Johannes Zellner 34c8baa744 Pick public info from status object 2020-03-06 17:57:38 -08:00
Girish Ramakrishnan 52a8081d0f no padding for footer links 2020-03-06 17:28:14 -08:00
Johannes Zellner 23813aa346 Make admins got to app configure when app task is active 2020-03-06 16:41:17 -08:00
Johannes Zellner 7d034a4b0b Show apptask progress label directly 2020-03-06 16:25:21 -08:00
Johannes Zellner 7e41f2ef35 Further improve email eventlog 2020-03-06 14:42:08 -08:00
Johannes Zellner f49dd31804 Reduce columns in mail event log 2020-03-06 13:35:34 -08:00
Johannes Zellner cf9e116388 Pipe backend error message on user deletion 2020-03-06 13:15:57 -08:00
Johannes Zellner 2a8d6f37c4 Disable roles the current user cannot assign 2020-03-06 12:33:36 -08:00
Johannes Zellner d5930fd859 Show error on user deletion if not allowed 2020-03-06 12:23:50 -08:00
Johannes Zellner f1e0167e1b Only fetch subscription for owners 2020-03-06 11:42:27 -08:00
Johannes Zellner 2d74c62054 Hide subscription status display for non-owners 2020-03-06 11:40:30 -08:00
Johannes Zellner 9249f28e68 Replace default logos with our own icon in colors 2020-03-06 11:21:32 -08:00
Girish Ramakrishnan 1273dbde76 Better icon for owner 2020-03-06 11:14:25 -08:00
Girish Ramakrishnan 966960c64b cpu share: add step and better ticks 2020-03-06 10:40:21 -08:00
Johannes Zellner 19e2919d5b Add reconnect handler and make reboot state better reflected in the notfications 2020-03-06 02:38:21 -08:00
Girish Ramakrishnan 1555b143a9 strip .tar.gz/.tar.gz.enc ending for all backup ids 2020-03-06 02:31:26 -08:00
Girish Ramakrishnan f1c2679137 typo 2020-03-06 02:09:44 -08:00
Girish Ramakrishnan 49e9bd3ca6 Add linode to restore UI 2020-03-06 01:47:07 -08:00
Johannes Zellner 6d9fe0410d Use branded footer in login and account setup pages 2020-03-06 01:44:08 -08:00
Girish Ramakrishnan 11419365ca Move help text after footer heading 2020-03-06 01:18:51 -08:00
Johannes Zellner a9767ac29a Make use of new support feature flag 2020-03-06 01:08:55 -08:00
Johannes Zellner efbf78ed00 Improve notification dismiss action button 2020-03-05 21:14:19 -08:00
Johannes Zellner 1f0965fdf6 Implement specific reboot notification action 2020-03-05 21:14:19 -08:00
Johannes Zellner 0ea2f48d94 Avoid tooltip flickering on mouse events 2020-03-05 21:14:19 -08:00
Johannes Zellner 547b351f40 Move setup subscription button in app install dialog to the right 2020-03-05 21:14:19 -08:00
Girish Ramakrishnan c9f0166c3d Other -> Ubuntu 2020-03-05 21:05:31 -08:00
Johannes Zellner 0de106f23d Disable app access submit when no group or user is selected 2020-03-05 20:15:17 -08:00
Girish Ramakrishnan 854281417d various app password ui fixes 2020-03-05 20:11:07 -08:00
Johannes Zellner 4d35fde8ba remove extra br for normal users in profile page 2020-03-05 20:10:01 -08:00
Johannes Zellner 754c9eff9e Rename system to system info 2020-03-05 18:28:11 -08:00
Johannes Zellner aca5a876d8 Move disk usage to system 2020-03-05 18:28:11 -08:00
Girish Ramakrishnan 7a817319ba Better text for password 2020-03-05 17:52:28 -08:00
Johannes Zellner f01ed81472 Remove feature to show old notifications 2020-03-05 17:31:03 -08:00
Johannes Zellner 942c755a5b Some better avatar overlay 2020-03-05 17:28:25 -08:00
Johannes Zellner 392da50f2c Show cloudron name in account setup view 2020-03-05 17:08:10 -08:00
Johannes Zellner dffaaf067d Show cloudron name in login view 2020-03-05 17:03:32 -08:00
Girish Ramakrishnan d663930d66 Fix casing of password changed 2020-03-05 17:02:52 -08:00
Girish Ramakrishnan 9291b6a489 Fixup text 2020-03-05 16:54:39 -08:00
Johannes Zellner 53abc1171e Remove toplevel doc links 2020-03-05 16:31:41 -08:00
Johannes Zellner 7f95e11af1 Do not send active or role attributes for own user while edit 2020-03-05 16:23:27 -08:00
Johannes Zellner 256676cb9d Allow to refresh users without showing busy state 2020-03-05 16:14:03 -08:00
Johannes Zellner 6180c0dc69 Add help button for user roles 2020-03-05 16:05:11 -08:00
Johannes Zellner e44ae4a0a0 Swap role and group in user add dialog 2020-03-05 16:04:05 -08:00
Johannes Zellner 8221e6a148 User permissions property is gone 2020-03-05 15:57:42 -08:00
Girish Ramakrishnan 6603c48fd9 Fixup text 2020-03-05 15:49:43 -08:00
Girish Ramakrishnan 3665d7cab7 Add linode to import UI 2020-03-05 11:24:42 -08:00
Johannes Zellner 27da68dc4b Fix gcdns provider configuration 2020-03-04 18:53:53 -08:00
Johannes Zellner 5695d555e5 Prevent eventlog filter from crashing 2020-03-04 15:07:35 -08:00
Johannes Zellner 08a6ad8bd3 Fix long-term hover bug in cog icon 2020-03-04 14:33:33 -08:00
Johannes Zellner 66a95fb130 Eventlog is available to all again
This is not actually the same as a business type audit log
2020-03-04 14:17:31 -08:00
Johannes Zellner 6eca1dfb83 Revert "Rename eventlog to audit trail"
This reverts commit fef854580d.
2020-03-04 14:15:32 -08:00
Girish Ramakrishnan fb5e2ef671 Throw error object and not a string 2020-03-03 11:07:56 -08:00
Girish Ramakrishnan 3cb15f0097 linode: add frankfurt 2020-03-02 20:03:02 -08:00
Johannes Zellner 7367932f2c Reword tooltip when adding users is blocked 2020-02-28 20:51:56 +01:00
Johannes Zellner fef854580d Rename eventlog to audit trail 2020-02-28 19:43:09 +01:00
Johannes Zellner 102a0a40a6 Make all only in paid version displays the same 2020-02-28 19:27:19 +01:00
Girish Ramakrishnan 0515b650ca mail from validation: add busy indicator 2020-02-27 10:47:14 -08:00
Girish Ramakrishnan 3c7e28c768 mail relay: wait for mail container to restart 2020-02-27 10:42:33 -08:00
Girish Ramakrishnan e528cf5692 Fix crash in statusOk computation 2020-02-27 10:37:21 -08:00
Girish Ramakrishnan dfe2eee0b9 Fix crash when no mailbox usage present 2020-02-27 10:11:00 -08:00
Girish Ramakrishnan 60f42e342b better message 2020-02-27 10:08:41 -08:00
Johannes Zellner 958f738820 Fix app mailbox form state 2020-02-27 16:04:11 +01:00
Johannes Zellner 2d2989a425 Fix add user button state 2020-02-27 15:10:56 +01:00
Johannes Zellner 3c3370b929 Check mail state depending on relay used or not 2020-02-27 13:27:45 +01:00
Girish Ramakrishnan 90b22196b1 add linode objectstorage backend 2020-02-26 10:12:26 -08:00
Johannes Zellner e7b9c2d294 Disable role selection for Cloudrons with user restriction 2020-02-26 16:48:51 +01:00
Johannes Zellner a3830d23e8 Move Email menu entry back to old place 2020-02-26 15:03:17 +01:00
Johannes Zellner d83eb32b6e Remove code for now dead spaces feature 2020-02-26 13:51:00 +01:00
Girish Ramakrishnan 303c55dbba Show busy indicator in reboot button 2020-02-25 14:58:29 -08:00
Girish Ramakrishnan afde058a85 capitalize 2020-02-24 11:58:25 -08:00
Johannes Zellner 14397cab96 Hide external ldap view for non-admins 2020-02-24 18:01:42 +01:00
Johannes Zellner a78eec79a8 Fix users view for user manager role 2020-02-24 17:49:36 +01:00
Johannes Zellner 7ce4effc2d Remove all .admin usage 2020-02-24 17:29:20 +01:00
Johannes Zellner 2674160acc Fix error form state when adding a new domain 2020-02-24 17:29:10 +01:00
Johannes Zellner f1c951c997 User creation and edit apis don't take admin flag anymore 2020-02-24 17:15:50 +01:00
Johannes Zellner a17d810fea Only auto-login the owner for subscription setup 2020-02-24 15:10:21 +01:00
Johannes Zellner 4b1cb76eaf Remove unused angular filter for oauth clients 2020-02-24 14:36:52 +01:00
Johannes Zellner 6b89b2be5e Remove tokens view for good 2020-02-24 14:36:35 +01:00
Johannes Zellner 92bfda9028 Remove admin usage in main view 2020-02-24 14:34:12 +01:00
Johannes Zellner 728d50461f Fix app password usage for non-admins 2020-02-24 13:29:47 +01:00
Johannes Zellner 3f92204de5 Fix indentation 2020-02-24 13:23:47 +01:00
Johannes Zellner 0e6c9177f0 Migrate most of .admin usage 2020-02-24 12:56:13 +01:00
Johannes Zellner 3c0e674ee5 Fixup user list icons and set default add to 'user' 2020-02-24 12:22:07 +01:00
Johannes Zellner 15c9052912 Move role selector up 2020-02-22 17:51:30 +01:00
Girish Ramakrishnan 7061880104 derive admin flag from roles 2020-02-21 16:55:39 -08:00
Johannes Zellner 6f12cde2e8 Add user role dropdown
Also pass `role` instead of `permissions`
Once done ng-disable/ng-hide based on userInfo.role
2020-02-21 21:15:54 +01:00
Johannes Zellner 52d454276d Use new subscription setup flow for app install dialog 2020-02-21 14:07:46 +01:00
Johannes Zellner 81fb4ab435 Add appstore accessToken to subscription setup links 2020-02-21 13:08:20 +01:00
Girish Ramakrishnan af8bb1f0e8 Add email view summary 2020-02-20 12:36:05 -08:00
Girish Ramakrishnan 5fd575a217 display usage info 2020-02-20 12:36:05 -08:00
Johannes Zellner 1ef5fd1a0f Only show support ticket and remote support UI for paid plans 2020-02-19 14:19:46 +01:00
Girish Ramakrishnan 932de7dba7 mail: display source 2020-02-18 21:31:35 -08:00
Girish Ramakrishnan 84310336bd Add search param 2020-02-18 09:46:52 -08:00
Johannes Zellner aba233c74a Add permissions UI 2020-02-17 14:05:26 +01:00
Johannes Zellner 016e2b375d Add commented test block for features 2020-02-14 20:45:23 +01:00
Johannes Zellner 732b1ae0de Improve business plan placeholders 2020-02-14 20:45:23 +01:00
Girish Ramakrishnan ae0c0f957e Show 20 per page by default 2020-02-14 09:04:57 -08:00
Johannes Zellner 4283046e76 Add footer branding configuration 2020-02-14 15:34:44 +01:00
Johannes Zellner 0a126a15ba Add branding section with footer configuration 2020-02-14 15:22:16 +01:00
Johannes Zellner 21e7190b72 Remove subscription setup modal, instead open cloudron.io directly 2020-02-14 14:16:04 +01:00
Girish Ramakrishnan 9fcd049bdc domain.locked is gone 2020-02-13 21:15:09 -08:00
Girish Ramakrishnan bc31ea5eb7 mail: move the next/prev page buttons to header
aligns with other ui like activity and mailbox
2020-02-13 09:12:59 -08:00
Johannes Zellner 35dd92f54e If maxUserCount is not set allow all 2020-02-13 17:09:42 +01:00
Johannes Zellner 0a29f92384 Use features from config object 2020-02-13 16:34:37 +01:00
Johannes Zellner a13414ddb9 Add feature object and show/hide elements accordingly 2020-02-13 15:30:31 +01:00
Johannes Zellner 3dd0566f48 fix empty eventlog label display 2020-02-13 13:03:57 +01:00
Johannes Zellner 8b3bc28120 add eventlog refresh button 2020-02-13 12:01:47 +01:00
Johannes Zellner 8051d6ba48 Add pagination to eventlog 2020-02-13 12:01:47 +01:00
Girish Ramakrishnan 43b49ef4c9 cleanup mail eventlog ui 2020-02-12 23:30:15 -08:00
Johannes Zellner 8ca51f1877 Show last 5 new apps 2020-02-12 23:24:33 +01:00
Johannes Zellner 59c5f22dbd Show mail eventlog type also as icon 2020-02-12 15:52:39 +01:00
Johannes Zellner a92dc1ad73 Make eventlog display work 2020-02-12 15:37:05 +01:00
Johannes Zellner fd72a00cfb Fixup raw email logs button layout 2020-02-12 14:52:38 +01:00
Johannes Zellner e9d10d6f2f Add action button to send test mail in global mail view 2020-02-12 14:51:06 +01:00
Johannes Zellner fa630a6cb5 Show mail status per domain in overview 2020-02-12 14:10:21 +01:00
Girish Ramakrishnan 135548a03b mail: add js code to get eventlog 2020-02-11 22:07:58 -08:00
Girish Ramakrishnan 304c930f95 Fix comment 2020-02-11 21:27:16 -08:00
Johannes Zellner 48991e22b1 Move Email menu entry toplevel
Not sure about that, but lets see until we make a release
2020-02-11 21:10:36 +01:00
Johannes Zellner 132a375347 Separate emails and email view 2020-02-11 21:06:34 +01:00
Johannes Zellner 1392abe2c0 Fix password length error message 2020-02-11 16:45:20 +01:00
Johannes Zellner fde07fda55 Passwords must be between 8 and 256 characters 2020-02-11 15:33:40 +01:00
Johannes Zellner b9c4928949 Add missing token description 2020-02-11 09:54:57 +01:00
Girish Ramakrishnan d2025d5ddf Show logs in browser timezone 2020-02-10 14:13:26 -08:00
Girish Ramakrishnan 113ae1cfa5 add note on utc to tz conversion 2020-02-10 13:49:59 -08:00
Girish Ramakrishnan a0f2039fd4 eventlog: wrong tooltip 2020-02-10 13:49:59 -08:00
Johannes Zellner 8442f80641 Ensure app password and api token tables have same layout 2020-02-08 01:25:05 +01:00
Johannes Zellner f10fafd038 Fix token expiration display 2020-02-08 01:23:29 +01:00
Johannes Zellner c85f48a9e9 Remove console.log() 2020-02-07 22:38:51 +01:00
Girish Ramakrishnan a1c487b29d Add note that old backups have to be cleaned up manually 2020-02-07 13:20:19 -08:00
Johannes Zellner 62562f051c Add token add api and separate api tokens from rest 2020-02-07 21:40:55 +01:00
Girish Ramakrishnan 467edb6b32 Error handing fixes for import 2020-02-07 11:23:34 -08:00
Johannes Zellner 1970641001 Implement revoke tokens 2020-02-07 20:00:10 +01:00
Girish Ramakrishnan 72b9384902 Use tooltips instead of overlays as hint when app is busy 2020-02-07 10:43:00 -08:00
Girish Ramakrishnan 8600019079 Fixes to import UI 2020-02-07 10:22:52 -08:00
Girish Ramakrishnan 49975a521b Add UI to import backup 2020-02-07 09:42:27 -08:00
Johannes Zellner b289db6879 Actually fix deployment tarball apiOrigin 2020-02-07 18:27:39 +01:00
Johannes Zellner 8ae6bf832a List all tokens in profile 2020-02-07 17:03:14 +01:00
Johannes Zellner 3efe7eb85d Add token route wrapper 2020-02-07 16:42:35 +01:00
Johannes Zellner 46635e1992 Remove oauth client wrapper 2020-02-07 16:36:10 +01:00
Johannes Zellner e8abe35bc5 Fix gulpfile for release tarball creation 2020-02-07 16:31:35 +01:00
Johannes Zellner 7596881464 Remove oauth from gulp and ejs templates 2020-02-07 13:41:10 +01:00
Girish Ramakrishnan ba36f05182 Just hide the table altogether when no backup 2020-02-06 16:11:25 -08:00
Girish Ramakrishnan be1874839e get support configuration via REST API 2020-02-05 14:15:46 -08:00
Johannes Zellner 5996ea1ba3 Remove unused code 2020-02-05 17:26:48 +01:00
Johannes Zellner 9283537efc Implement account setup view logic 2020-02-05 16:34:15 +01:00
Johannes Zellner 9dbdad324a Use invite link generated on the server to stay in sync 2020-02-05 15:53:19 +01:00
Johannes Zellner 39faf2e55c Add new account setup page 2020-02-05 15:05:34 +01:00
Johannes Zellner 19b5253708 Remove now unused login callback 2020-02-05 12:54:14 +01:00
Johannes Zellner 3f2b59e67f Ensure we have proper login app entry points 2020-02-05 11:54:31 +01:00
Girish Ramakrishnan 4bc1d5cd4a uiSpec is dead 2020-02-04 13:17:26 -08:00
Girish Ramakrishnan 689349887d custom: remove support section 2020-02-04 13:07:20 -08:00
Girish Ramakrishnan e7a1b5d40b custom: remove subscription.configurable 2020-02-04 12:59:16 -08:00
Girish Ramakrishnan 8f997ee724 Remove usage of config.uiSpec.domains 2020-02-04 12:55:51 -08:00
Girish Ramakrishnan 99bce50b4d custom: remove backups.configurable 2020-02-04 12:49:36 -08:00
Johannes Zellner db166c4f29 Be at least consistent with casing 2020-02-04 18:41:53 +01:00
Johannes Zellner 4a8a52a0c7 Implement setting new password 2020-02-04 18:36:24 +01:00
Johannes Zellner 0762b337b8 Fixup password reset page 2020-02-04 15:53:56 +01:00
Johannes Zellner a50fa9bcf4 Add password reset feature in login view 2020-02-04 15:27:35 +01:00
Johannes Zellner 1b0c5f8771 Remove unnecessary login page navbar 2020-02-04 15:00:56 +01:00
Johannes Zellner 92be875a2f Use standalone login screen instead of OAuth 2020-02-04 14:46:19 +01:00
Girish Ramakrishnan d5e4453f15 app passwords: add ui 2020-02-01 18:49:29 -08:00
Johannes Zellner c9e43ed295 Add basic ticks to cpu share slider 2020-02-01 16:30:32 +01:00
Girish Ramakrishnan 63610f04ec Show backup disk usage 2020-01-31 14:47:04 -08:00
Girish Ramakrishnan e0db4fce6e Better purpose 2020-01-30 21:53:43 -08:00
Johannes Zellner 1f4b6f4a42 Update purpose list 2020-01-30 18:33:44 +01:00
Johannes Zellner 300ab191fe Add cloudron purpose to appstore login/signup flow 2020-01-30 15:36:05 +01:00
Girish Ramakrishnan 0315ae511b do not allows < 2 2020-01-28 22:44:08 -08:00
Girish Ramakrishnan e336c4405d Rename Custom data dir to Storage 2020-01-28 22:33:38 -08:00
Girish Ramakrishnan 2a4d9c0ba6 ui for cpu shares 2020-01-28 22:32:58 -08:00
Girish Ramakrishnan 4a29fa93c5 services: use memorySwap to be consistent with the app memory UI
the memory limit sliders take the total memory (memory + swap).
2020-01-28 13:38:05 -08:00
Girish Ramakrishnan c5d14195d6 Remove broken help link and add explanation 2020-01-28 10:09:25 -08:00
Girish Ramakrishnan 09d34f5843 service: fix broken memory sliders 2020-01-28 09:37:25 -08:00
Girish Ramakrishnan 7432610629 lint 2020-01-24 17:18:00 -08:00
Girish Ramakrishnan d50d555372 eventlog: mailbox and list update events 2020-01-24 17:18:00 -08:00
Johannes Zellner f0859291fc Actually shorten the memory limit description 2020-01-23 08:10:33 +01:00
Johannes Zellner 1eeba899f0 Mention how memory limit is allocated inline 2020-01-23 08:08:03 +01:00
Johannes Zellner 36653c10dc Fixup profile picture selection to only allow really changed pictures to be submitted 2020-01-20 19:01:41 +01:00
Johannes Zellner 008ac68ecb Also search within app label if any 2020-01-20 14:38:41 +01:00
Johannes Zellner 36b8b0e6a1 Fix user select in group add/edit dialogs
We have to depend on all users not just the paginated ones
The selection does not need all information from the user so we are good
2020-01-09 16:21:22 +01:00
Johannes Zellner 42066e20ed Make timezone settings much beautiful 2020-01-08 21:41:06 +01:00
Johannes Zellner 57aa93eb84 Do not show UTC offset in select 2020-01-08 20:35:00 +01:00
Johannes Zellner c6c51bd319 Generate timezones.js with gulp 2020-01-08 17:22:07 +01:00
Johannes Zellner 2fa9c89246 Show UTC time offset and use better dropdown with search 2020-01-08 13:01:31 +01:00
Girish Ramakrishnan 840b326187 Reword 2020-01-07 18:30:54 -08:00
Johannes Zellner 1fef7130fb Add time zone settings ui 2020-01-07 21:41:45 +01:00
Johannes Zellner 2328dd1d58 Ensure outdated selected app tags are cleared if not available anymore 2020-01-07 12:17:40 +01:00
Johannes Zellner dbba99eee5 Only show app search field if more than 10 apps are installed 2020-01-07 11:13:22 +01:00
Johannes Zellner f07e0bf967 Fix typo to actually restart an app 2020-01-06 16:38:48 +01:00
Johannes Zellner c548f572df fixup linter errors 2020-01-06 16:38:33 +01:00
Johannes Zellner 129f67c9f8 Make app view tags and domain filter persistent
This is only stored in the browser's localStorage to survive a reload,
but is not stored on the server to be preserved across different clients
2020-01-06 16:23:33 +01:00
Johannes Zellner bc75a8e7b8 Add search field in apps view 2020-01-06 15:27:31 +01:00
Girish Ramakrishnan e4f16ae520 2020: happy new year 2020-01-02 16:56:42 -08:00
Girish Ramakrishnan 4df34c724e cloudflare: add token type selector 2020-01-01 16:49:17 -08:00
Girish Ramakrishnan 1960fc8606 cloudflare: send tokenType 2019-12-31 17:03:29 -08:00
Girish Ramakrishnan aaae8a84f6 show warning when enabling email with cloudflare 2019-12-31 17:03:25 -08:00
Girish Ramakrishnan 1dca3c17a4 debug mode apps skip the health check 2019-12-24 11:08:17 -08:00
Johannes Zellner dfd31722fc Ensure webServerOrigin is actually set 2019-12-23 17:20:28 +01:00
Girish Ramakrishnan f5fd75f4fa Set busy indicator to false in refresh callbacks 2019-12-22 17:10:04 -08:00
Girish Ramakrishnan 24d1c2d63a Fix error state handling
Do not disable views in error state. Many actions like display work just fine.
Also, people want to restore etc but all this is disabled.
2019-12-20 19:04:51 -08:00
Girish Ramakrishnan da191d62cc Show console view in error state for the logs
disable the terminal button accordingly
2019-12-20 15:55:57 -08:00
Girish Ramakrishnan e8bc6e564d Rename the repair button 2019-12-20 15:38:40 -08:00
Girish Ramakrishnan 95f3158bb4 Rename paused to recovery mode 2019-12-20 11:53:06 -08:00
Girish Ramakrishnan f7cc5be173 Wrap the tooltip 2019-12-20 11:42:41 -08:00
Girish Ramakrishnan adc078a5cb Add a restart button in recovery section 2019-12-20 11:27:32 -08:00
Girish Ramakrishnan 3f3ec9ef9a Fix usage of config.memory 2019-12-20 10:02:01 -08:00
Girish Ramakrishnan 7d70060962 debug view is now called repair 2019-12-19 21:53:53 -08:00
Girish Ramakrishnan 4507496d3d Show endpoint for minio 2019-12-19 11:05:40 -08:00
Girish Ramakrishnan 445dcc24df Fix documentation links 2019-12-18 14:29:42 -08:00
Girish Ramakrishnan 78205c9a13 Add gravatar link 2019-12-17 15:05:01 -08:00
Girish Ramakrishnan 3a0f7e0602 Disable console view when app is in error state 2019-12-17 10:24:42 -08:00
Girish Ramakrishnan fab23ee595 backup: compact the view 2019-12-17 10:15:38 -08:00
Girish Ramakrishnan d285c5a679 Make the buttons primary instead of success 2019-12-17 10:03:04 -08:00
Girish Ramakrishnan 6d079b9349 hide the cancel task button
we considered putting it in the progress bar, but we don't want to
encourage it's use
2019-12-17 09:43:40 -08:00
Johannes Zellner c291f744e7 Ensure min-height for app view tabs matches the tabs 2019-12-17 14:56:15 +01:00
Girish Ramakrishnan f0730f595f rework the repair view 2019-12-16 19:24:32 -08:00
Girish Ramakrishnan d175d06b35 debug is now repair 2019-12-16 17:45:40 -08:00
Girish Ramakrishnan 119969634e Fix display of start/stop button 2019-12-16 16:27:24 -08:00
Girish Ramakrishnan b67c09a4c1 Use refreshApp in onReady 2019-12-16 16:22:29 -08:00
Girish Ramakrishnan 8a850ecc5b Remove usage of trackBackupTask 2019-12-16 16:17:54 -08:00
Girish Ramakrishnan f752ed3927 remove superfluous trackBackuptask 2019-12-16 16:17:13 -08:00
Girish Ramakrishnan 866a7480bc make refreshApp take appId 2019-12-16 16:08:49 -08:00
Girish Ramakrishnan 55ae8404cd remove duplicate show call
this is already done in $scope.setView
2019-12-16 15:54:03 -08:00
Girish Ramakrishnan 71e9d7c4af evenlog: ssh and ticket 2019-12-16 14:12:59 -08:00
Girish Ramakrishnan 580556cab6 app: add console section 2019-12-16 13:34:21 -08:00
Girish Ramakrishnan bcb6182be3 lint: indent 2019-12-16 12:54:24 -08:00
Girish Ramakrishnan c865aaed6f remove unused cert code 2019-12-16 12:53:51 -08:00
Girish Ramakrishnan 37c23fa187 avatar: fix broken image for emails with no gravatar
this was because we blindly add ? to a url which already has query params
2019-12-13 13:50:50 -08:00
Johannes Zellner 2eeb99e869 Improve avatar settings dialog 2019-12-12 15:34:26 +01:00
Johannes Zellner fd528edfed Use cloudron/memory api instead of removed config.memory 2019-12-12 12:13:06 +01:00
Girish Ramakrishnan df6a645600 typo 2019-12-11 15:13:46 -08:00
Girish Ramakrishnan d1515f8f64 Handle 422 for invalid provider token 2019-12-11 15:01:51 -08:00
Girish Ramakrishnan 9fb85311b9 Various spacing issues 2019-12-11 14:43:54 -08:00
Girish Ramakrishnan aed949e221 Fix layout of instance id 2019-12-11 14:18:12 -08:00
Girish Ramakrishnan 5b29f48bfd Fix bug where providerToken is sent in config 2019-12-11 13:58:29 -08:00
Girish Ramakrishnan 5bfb48b863 ami: set default to route53 2019-12-11 12:57:46 -08:00
Girish Ramakrishnan 9536fafd53 eventlog: mail list removal typo 2019-12-11 10:00:00 -08:00
Johannes Zellner 4434d59b09 Remove dns setup Cloudron logo 2019-12-10 17:44:22 +01:00
Girish Ramakrishnan 060fe39f2e Fix repair route path 2019-12-06 11:44:33 -08:00
Girish Ramakrishnan a5b14e8d68 Fix repair
Call appropriate routes based on the error state
2019-12-06 10:13:30 -08:00
Johannes Zellner 165ad229e2 Add support to upload custom profile avatar 2019-12-02 18:03:41 +01:00
Girish Ramakrishnan beb3117bfc Remove dead certificate code 2019-11-23 17:50:54 -08:00
Girish Ramakrishnan e1d462aa42 Fix taskName 2019-11-23 17:49:13 -08:00
Girish Ramakrishnan bd15ef7768 @ sign missing for email address 2019-11-22 14:41:17 -08:00
Girish Ramakrishnan 646f669c14 Display swap 2019-11-21 14:00:37 -08:00
Johannes Zellner 682eb8d6e5 Improve external ldap auto creation text and move to bottom 2019-11-20 22:42:32 +01:00
Johannes Zellner 00b0a21c78 Add ldap user autocreate settings 2019-11-20 10:46:26 +01:00
Johannes Zellner c7a5d295ec Add new apps category in appstore view 2019-11-18 22:43:33 +01:00
Girish Ramakrishnan bcb055ed05 Show slash only with prefix 2019-11-18 11:04:06 -08:00
Girish Ramakrishnan 983b1e3656 index.docker.io is legacy
https://github.com/docker/distribution/blob/release/2.7/reference/normalize.go#L13
2019-11-17 11:39:42 -08:00
Girish Ramakrishnan 3c4dbe2558 Disable update view for custom apps 2019-11-16 10:53:15 -08:00
Girish Ramakrishnan 80b931ca9e email domain can be selected 2019-11-15 09:41:09 -08:00
Girish Ramakrishnan 200a234469 ldap: use separate objects for current config and user config 2019-11-14 17:30:23 -08:00
Girish Ramakrishnan 24ef877bfe website/description is optional for dev apps 2019-11-12 17:12:57 -08:00
Girish Ramakrishnan 602244b53f Must contain since it is a path 2019-11-11 16:26:01 -08:00
Girish Ramakrishnan 97b2a6eea0 typo 2019-11-11 16:06:46 -08:00
Girish Ramakrishnan e20d09cfee Pass syinfoConfig properly 2019-11-11 15:15:50 -08:00
Girish Ramakrishnan 7e2ae8e87c add sysinfo to setup & restore 2019-11-11 12:27:44 -08:00
Girish Ramakrishnan a868766a65 lint 2019-11-11 09:49:41 -08:00
Girish Ramakrishnan 7f1c505303 Add check for backupId to start with "box" 2019-11-11 09:46:47 -08:00
Girish Ramakrishnan f679746e63 pass clientId instead of client object to revoke 2019-11-11 09:20:42 -08:00
Girish Ramakrishnan 40b75c6ac8 Always enable unstable app listing 2019-11-11 08:41:12 -08:00
Johannes Zellner c5fc4db980 Align appstatus page style with other dashboard pages 2019-11-10 16:33:15 +01:00
Johannes Zellner f6b88518a2 Add option to logout to destroy all sessions by this user 2019-11-08 21:33:29 +01:00
Girish Ramakrishnan 3fecb777e8 make token ui work again 2019-11-08 12:24:26 -08:00
Girish Ramakrishnan 3d2914da94 remove extra break 2019-11-08 11:10:26 -08:00
Johannes Zellner 52e1ce5237 Actually destroy the OAuth session on token revokation 2019-11-08 17:31:19 +01:00
Girish Ramakrishnan b6b5875786 track current config separately 2019-11-07 23:08:42 -08:00
Girish Ramakrishnan 97782d29cc move tokens entirely into token page 2019-11-07 14:41:28 -08:00
Girish Ramakrishnan 0c5930d5cf simplify the sessions UI 2019-11-07 14:28:52 -08:00
Girish Ramakrishnan 836a3659b6 Add external ldap progress bar 2019-11-07 11:39:02 -08:00
Girish Ramakrishnan 2e6e320bd9 Make sysinfo page show detected ip 2019-11-07 10:47:40 -08:00
Girish Ramakrishnan c26597cf02 Various network page improvements 2019-11-07 10:20:34 -08:00
Girish Ramakrishnan 9a0cc4a717 Various minor UI fixes 2019-11-07 09:40:49 -08:00
Girish Ramakrishnan 81aa94c8df chrome: groups buttons were wrapping 2019-11-07 09:40:49 -08:00
Johannes Zellner ff30d6d23a Move sysinfo and dyndns settings to new network view 2019-11-07 15:26:18 +01:00
Johannes Zellner 30769b5992 We now always show the external ldap settings 2019-11-07 12:11:48 +01:00
Johannes Zellner c6d2e6cda3 Hide api token ui behind 'tokens' query and ensure button sizes are consistent 2019-11-07 12:08:51 +01:00
Johannes Zellner 3a0c29988e Update package-lock file 2019-11-07 11:10:00 +01:00
Johannes Zellner 85f1c3816b Rename account to profile 2019-11-07 11:07:57 +01:00
Johannes Zellner 7040bb01f4 Ensure groups configure dialogs have all users available 2019-11-05 22:08:48 +01:00
Johannes Zellner 71f1304606 Make all multiselect search and scrollable if more than 10 items are available 2019-11-05 19:45:59 +01:00
Johannes Zellner 90d242b784 Add helper scripts to add/remove many users for testing purpose 2019-11-05 19:24:08 +01:00
Johannes Zellner b520b6dc13 Add sysinfo configuration 2019-11-05 15:19:48 +01:00
Johannes Zellner 82b2b0b334 Simply mention available disk space in graphs 2019-11-05 12:04:19 +01:00
Girish Ramakrishnan 6463b84952 Add get/setSysinfoConfig 2019-10-31 19:33:05 -07:00
Girish Ramakrishnan 34cedbdadc Fill the usernameField 2019-10-31 11:39:42 -07:00
Girish Ramakrishnan 44cf25b447 bind dn can also be username 2019-10-30 09:36:02 -07:00
Johannes Zellner 94c7638c96 Mark external users with an icon 2019-10-29 13:04:44 +01:00
Johannes Zellner 6cf0727bd5 Ensure admin tooltip is fully visible 2019-10-29 12:58:54 +01:00
Johannes Zellner 561301bd28 Always show user actions, only disable them 2019-10-29 12:49:21 +01:00
Johannes Zellner 9039be8e39 Fix error reporting on password change 2019-10-29 12:39:39 +01:00
Johannes Zellner c42292d546 Also ensure the progressbar is full width 2019-10-27 22:52:12 +01:00
Johannes Zellner e21d17f6b8 Only adjust card margin on mobile 2019-10-27 22:52:12 +01:00
Girish Ramakrishnan ca2eacdd82 the v2 is implied it seems 2019-10-27 13:13:41 -07:00
Girish Ramakrishnan af9f2794be Remove error suggestion for now 2019-10-27 12:01:53 -07:00
Girish Ramakrishnan ff84149623 ldap: add username field 2019-10-25 16:38:59 -07:00
Girish Ramakrishnan 99aea3ed60 ldap: move error to top 2019-10-25 16:13:52 -07:00
Girish Ramakrishnan 9528db700a ldap: add provider field 2019-10-25 15:42:51 -07:00
Girish Ramakrishnan 106187e2f4 Make ldap users have disabled input instead 2019-10-25 15:25:46 -07:00
Girish Ramakrishnan e412aa9a3d Various fixes to ldap view
also, keep it enabled for all for now
2019-10-25 15:19:57 -07:00
Johannes Zellner 0a8fa40b6b Fixup various mobile view issues in the app configure view 2019-10-25 12:10:08 +02:00
Girish Ramakrishnan 8a84fa5cdd fix comment 2019-10-24 18:09:48 -07:00
Girish Ramakrishnan 1e8fb61abf Add warning on data loss 2019-10-24 10:07:34 -07:00
Girish Ramakrishnan ee4e90deb5 Add modal restore dialog 2019-10-24 10:01:23 -07:00
Girish Ramakrishnan e2124bac5a Add tooltip to show the raw time 2019-10-24 09:40:11 -07:00
Girish Ramakrishnan c1b95547d7 This can also be a token
https://www.docker.com/blog/docker-hub-new-personal-access-tokens/
2019-10-23 06:51:12 -07:00
Girish Ramakrishnan 28025cfb44 Add email field to registry config 2019-10-23 06:48:34 -07:00
Girish Ramakrishnan 7c978f6c1c Add ui to configure registry 2019-10-22 22:42:55 -07:00
Girish Ramakrishnan 470936476e Move buttons to right 2019-10-22 10:49:57 -07:00
Girish Ramakrishnan 9c418e110f Make unstable apps a normal button 2019-10-22 10:06:32 -07:00
Johannes Zellner 499cb76492 Add app listing filter for recently updated apps 2019-10-22 17:51:09 +02:00
Johannes Zellner bb00327e81 Ensure we don't cut off tooltips in apps view 2019-10-22 15:56:53 +02:00
Johannes Zellner e79dec3c2b sort mailinglists by name 2019-10-22 12:52:03 +02:00
Johannes Zellner ab23882c27 Add basic search filter for mailboxes and mailinglists 2019-10-22 12:47:32 +02:00
Johannes Zellner a22602f6d1 Always mention how mailinglist addresses should be separated
The placeholder is not shown once anything is typed
2019-10-21 13:02:45 +02:00
Girish Ramakrishnan c1ba1014c3 support: allow input of additional email 2019-10-18 18:23:58 -07:00
Johannes Zellner f393f58bce Source the dns setup image from the api server 2019-10-18 21:54:59 +02:00
Johannes Zellner b06d1fd293 Add server provider query argument to dns setup 2019-10-17 13:25:25 +02:00
Johannes Zellner ac32e76eec Add dns setup logo 2019-10-16 14:16:54 +02:00
Girish Ramakrishnan 420fe0df0d Only required for email_error 2019-10-15 12:00:37 -07:00
Girish Ramakrishnan b035030867 Add altEmail to support ticket (when mail is down) 2019-10-15 11:39:57 -07:00
Girish Ramakrishnan a641fec3ae Set CSP instead of frameAncestors 2019-10-14 17:20:35 -07:00
Girish Ramakrishnan 13c3624025 Add ui for frame-ancestors 2019-10-14 16:04:41 -07:00
Girish Ramakrishnan 16728ab51c Fix wrong icons for non-admins 2019-10-11 18:35:09 -07:00
Girish Ramakrishnan 247eea1a0c Remove unused function 2019-10-11 15:24:25 -07:00
Girish Ramakrishnan bf454816ea On error, reset the busy flag
this happens when icon is too large, for example
2019-10-11 15:18:52 -07:00
Girish Ramakrishnan 36028632ac simplify 2019-10-11 14:59:12 -07:00
Girish Ramakrishnan 0e386d33b0 Remove dead code 2019-10-11 14:53:44 -07:00
Girish Ramakrishnan 4f9d8915fb Hide progress bar for normal users
They cannot get the progress information anyway
2019-10-11 14:50:50 -07:00
Girish Ramakrishnan 0d94e4290b Remove the "v" from the version 2019-10-11 10:58:06 -07:00
Johannes Zellner a1426bc81b Fix copy and paste error for namecheap input label 2019-10-06 16:20:40 +02:00
Johannes Zellner d98d36d97b Disable documentation url is not set in app manifest 2019-10-06 16:20:40 +02:00
Girish Ramakrishnan bf930d2ae0 Fix email reconfigure 2019-10-04 11:20:27 -07:00
Girish Ramakrishnan 631730bf3a repair can always be called
this is because sometimes cloudron thinks there is no error, but there is
2019-10-03 12:23:36 -07:00
Johannes Zellner 8d34a4c5a1 Ensure the notification badge has its place in the layout calculation
The float property makes it overflow on high notification numbers
2019-10-03 13:32:43 +02:00
Johannes Zellner c8f50fc117 If app is not found while app view is visible, go back 2019-10-01 20:04:28 +02:00
Johannes Zellner cfdb7b32fc Fix basic layout issues on small screens for app view 2019-09-30 15:19:48 +02:00
Girish Ramakrishnan cc833f0b73 Stop any active app task on uninstall 2019-09-29 16:55:03 -07:00
Girish Ramakrishnan 47282afa22 Overwrite existing DNS records in repair 2019-09-29 16:37:38 -07:00
Girish Ramakrishnan 417640cfbe Fix hyphenation of alt domains in repair dialog 2019-09-29 16:37:35 -07:00
Johannes Zellner 8df1690d5d Fix yet another layout issue with long fqdn's 2019-09-28 15:49:35 +02:00
Girish Ramakrishnan 461d1bcd5b Add note about pause in the repair section 2019-09-27 15:25:46 -07:00
Girish Ramakrishnan 8b5e164291 Fix login eventlog 2019-09-27 15:07:37 -07:00
Girish Ramakrishnan 2644f56755 Show portBinding conflicts properly 2019-09-27 14:47:49 -07:00
Girish Ramakrishnan 437e6baeba eventlog: Add icon set/reset 2019-09-27 13:44:57 -07:00
Girish Ramakrishnan 6788d37b6f Configure label and tags only if changed 2019-09-27 13:38:30 -07:00
Girish Ramakrishnan b90550d6ba Fix display of alt domains 2019-09-27 12:58:39 -07:00
Johannes Zellner c068deb47e Avoid some text decoration on app title in various states 2019-09-27 19:55:45 +02:00
Johannes Zellner 2ce5b28048 Fixup postinstall message if app link is clicked 2019-09-27 19:43:03 +02:00
Johannes Zellner 57f1751309 Fix terminal restart and other state issues 2019-09-27 19:13:08 +02:00
Girish Ramakrishnan 2d8dc36f28 Elaborate what kind of backup 2019-09-27 09:34:01 -07:00
Johannes Zellner 077a717525 Move all STATEs to client.js so we can use them in other angular apps like terminal 2019-09-27 18:11:48 +02:00
Johannes Zellner 8795493462 Fixup linter issues in terminal view 2019-09-27 17:43:33 +02:00
Johannes Zellner af532bae8f Make app main header the open app action instead of the button 2019-09-27 16:35:43 +02:00
Girish Ramakrishnan c07b3e2d3c lint 2019-09-26 22:23:08 -07:00
Girish Ramakrishnan 6b1a9fa837 just return 'paused' 2019-09-26 22:16:37 -07:00
Girish Ramakrishnan 24888dfad5 terminal: repair -> pause 2019-09-26 22:16:37 -07:00
Girish Ramakrishnan 4d4c8638ca eventlog: Fix display of app.repair 2019-09-26 21:36:11 -07:00
Girish Ramakrishnan 9fd983abfb Make eventlog filter as functions
Some of the events requires access to domains and apps, making it hard
unsuitable for filters
2019-09-26 21:27:18 -07:00
Girish Ramakrishnan 637839ee14 remove unused filter 2019-09-26 21:10:26 -07:00
Girish Ramakrishnan 9b2578665f Add finish events to the filter 2019-09-26 20:13:24 -07:00
Girish Ramakrishnan ee05e109c8 Add checkbox to skip backup for app update 2019-09-26 20:10:25 -07:00
Girish Ramakrishnan a905e32cde eventlog: fix text of update events 2019-09-26 19:04:28 -07:00
Girish Ramakrishnan fb5cec0d38 eventlog: Make next button disabled in last page 2019-09-26 18:27:00 -07:00
Girish Ramakrishnan 1a4f490fb5 Display the backupId 2019-09-26 18:23:13 -07:00
Johannes Zellner 4518c2c4c0 Use img tag instead of background-image for custom icon to avoid flickering 2019-09-26 21:12:14 +02:00
Johannes Zellner 17771ccecd Make app documentation a dropdown to show postinstall and upstream project link 2019-09-26 21:12:14 +02:00
Girish Ramakrishnan f3c2a3c025 Remove the 'Daily' 2019-09-26 10:07:15 -07:00
Johannes Zellner 2aa919b444 Fix update error overflow in settings view 2019-09-25 11:49:09 +02:00
Johannes Zellner 408987ee30 avoid task progress flickering 2019-09-24 21:27:49 +02:00
Johannes Zellner fe04ad9940 Show task progress as progress bar instead of indicator 2019-09-24 21:08:42 +02:00
Johannes Zellner 1b03e750a2 Remove unnecessary retry to fetch domains in apps view 2019-09-24 19:56:31 +02:00
Johannes Zellner 3ff781139e Add pre-flight and fix clone dialog 2019-09-24 18:50:52 +02:00
Johannes Zellner 2ea3ba492e Prevent angular from throwing exceptions if error is null 2019-09-24 18:46:07 +02:00
Girish Ramakrishnan 89d3228077 Do not show overwrite when creds are invalid 2019-09-24 01:03:57 -07:00
Girish Ramakrishnan 7946f5ee81 Rename func and put error below the control label 2019-09-24 00:04:31 -07:00
Girish Ramakrishnan 44f62eac9a Add error suggestion 2019-09-23 23:51:15 -07:00
Girish Ramakrishnan 47725e57b0 Fixup repair text 2019-09-23 23:28:14 -07:00
Girish Ramakrishnan aac2aaa999 Make repair always visible 2019-09-23 22:03:54 -07:00
Girish Ramakrishnan 6ac1160bf2 Make stop/start work again 2019-09-23 15:50:41 -07:00
Johannes Zellner 70fae41042 Handle dns overwrite in appstore view 2019-09-24 00:21:12 +02:00
Johannes Zellner 07f5bfe3dc Provide appstore install overwrite checkbox 2019-09-24 00:21:12 +02:00
Girish Ramakrishnan 93a88a22b9 Move the collision list to the top 2019-09-23 15:13:50 -07:00
Girish Ramakrishnan 792faa1176 remove extra arg 2019-09-23 14:57:37 -07:00
Johannes Zellner 66900d594f Add app install dns preflight check 2019-09-23 23:47:33 +02:00
Johannes Zellner 9555f3c853 Adjust to new dns_check api 2019-09-23 23:47:12 +02:00
Johannes Zellner 9ed2fa734a Add location and domain selector to repair dialog 2019-09-23 22:45:45 +02:00
Johannes Zellner db83508920 Remove ... from installation state label
Makes the filter not useful in sentences
2019-09-23 22:45:16 +02:00
Johannes Zellner d72a6585d4 Handle pre-flight domain check api access issue 2019-09-23 21:38:35 +02:00
Girish Ramakrishnan 74fc8c9cf7 Add repair state 2019-09-23 12:34:47 -07:00
Johannes Zellner f3440f3c01 Show debug view if app errors while having some other view open 2019-09-23 19:37:40 +02:00
Girish Ramakrishnan b01799c606 Move help text down 2019-09-23 10:25:12 -07:00
Johannes Zellner 3cbb4e3f43 Handle location change api key invalid error 2019-09-23 19:23:06 +02:00
Girish Ramakrishnan 36299acbfb lint 2019-09-23 10:16:19 -07:00
Girish Ramakrishnan acc20af2d9 Fix text 2019-09-23 09:56:31 -07:00
Girish Ramakrishnan 077ce5b521 Fixup text 2019-09-23 09:54:40 -07:00
Johannes Zellner 1efe82dda2 Remove debug code and fixup ISTATE usage 2019-09-23 16:53:48 +02:00
Johannes Zellner f283618209 Only show error message if also set 2019-09-23 16:27:05 +02:00
Johannes Zellner fe6baf8dba Attempt to cover most repair cases 2019-09-23 15:32:38 +02:00
Johannes Zellner b742dc51fb Ensure we can start a stopped app 2019-09-22 12:21:39 +02:00
Johannes Zellner c8ea649afc Display error message in debug view 2019-09-22 12:16:20 +02:00
Johannes Zellner a27e94f694 Only allow debug and uninstall views on app error 2019-09-22 12:10:44 +02:00
Girish Ramakrishnan 25f9e7829f Fix run state handling 2019-09-22 01:02:39 -07:00
Johannes Zellner 85be7acab2 add initial repair dialog with domain/backup selection 2019-09-21 22:45:26 +02:00
Johannes Zellner 36c23227e5 Fix location form submission bug on enter 2019-09-21 11:07:20 +02:00
Johannes Zellner 0b6f68e190 Fix layout issue if app domain is too long 2019-09-21 11:02:00 +02:00
Girish Ramakrishnan 6c90fc2764 add app creation time 2019-09-20 09:20:41 -07:00
Johannes Zellner 4fd1e55ae8 Add pre-flight check for domain collision 2019-09-20 11:32:15 +02:00
Girish Ramakrishnan 9672f7e3da Remove "App" 2019-09-19 18:01:12 -07:00
Girish Ramakrishnan 50d29f8ef0 Use simple input field for custom data dir instead of checkbox (email) 2019-09-19 18:00:18 -07:00
Girish Ramakrishnan 6ffa00026e pending_configure is dead 2019-09-19 17:36:31 -07:00
Girish Ramakrishnan c4677505ac Fix debug_mode route 2019-09-19 17:30:24 -07:00
Girish Ramakrishnan bac6d7cf3c Revert "Add repair state"
This reverts commit 85ea91e0e3.
2019-09-19 17:15:43 -07:00
Girish Ramakrishnan 85ea91e0e3 Add repair state 2019-09-19 17:03:52 -07:00
Johannes Zellner 09b09086ce Use simple input field for custom data dir instead of checkbox 2019-09-20 01:22:10 +02:00
Johannes Zellner 8fbfa86a7f Do not randomly throw unhandled error notifications 2019-09-20 00:51:16 +02:00
Johannes Zellner 6224e942dc Track backup progress 2019-09-20 00:05:17 +02:00
Johannes Zellner ab5edbdd41 Add postinstall message to app view 2019-09-20 00:03:58 +02:00
Girish Ramakrishnan 7825d10f18 Move the error down 2019-09-19 14:51:32 -07:00
Johannes Zellner 8c1988e480 handle reserved domain errors 2019-09-19 22:02:37 +02:00
Girish Ramakrishnan 8403b811d8 Fix font size 2019-09-19 12:50:55 -07:00
Girish Ramakrishnan 1c797505ae Fixup debug tab 2019-09-19 12:50:06 -07:00
Girish Ramakrishnan 466086b509 Fixup backup tab 2019-09-19 12:24:22 -07:00
Girish Ramakrishnan 221f7247e6 rename title 2019-09-19 12:00:35 -07:00
Girish Ramakrishnan 624bc88f74 Make separate section in updates view 2019-09-19 11:58:11 -07:00
Johannes Zellner d6ca4458e4 Make active task overlay less verbose 2019-09-19 20:43:58 +02:00
Girish Ramakrishnan 1fe3e60468 Merge the email explanation 2019-09-19 11:30:30 -07:00
Girish Ramakrishnan aa65b2b97c dataDir explanation 2019-09-19 11:22:57 -07:00
Johannes Zellner 6dea2475c7 Prevent some more angular warnings if app object isn't set yet 2019-09-19 19:46:20 +02:00
Girish Ramakrishnan a666cb00eb Fixup uninstall UI 2019-09-19 10:28:19 -07:00
Johannes Zellner f0fac9165c Fix open app button in app view 2019-09-19 19:19:51 +02:00
Johannes Zellner e51eb8a9c1 Ensure back button from apps grid into app view works no first usage 2019-09-19 19:19:36 +02:00
Johannes Zellner 4822984e34 Some code cleanup 2019-09-19 18:41:08 +02:00
Johannes Zellner 4a558a7f65 Enabling backups and auto updates is not a danger action 2019-09-19 18:41:08 +02:00
Johannes Zellner 48d4935c7d Ensure error states are cleared 2019-09-19 18:41:08 +02:00
Girish Ramakrishnan 506accfe9b Show hr only when we have sftp section 2019-09-19 09:35:25 -07:00
Girish Ramakrishnan c15aba47f5 Fix installation state label text to have ... 2019-09-19 09:28:33 -07:00
Johannes Zellner fdafa8adf6 Only allow to open app when runState is also running 2019-09-19 18:27:02 +02:00
Johannes Zellner 23e15581f3 Make sure we cleanup polling timers on view switch 2019-09-18 18:18:43 +02:00
Johannes Zellner 1621f866a8 Cleanup apps view while removing update modal 2019-09-18 18:10:51 +02:00
Johannes Zellner f03fe33b1f Prevent angular erros if app is null in some filter 2019-09-18 18:06:03 +02:00
Johannes Zellner 6ec2a5ea35 If app is in error state directly go to debug view 2019-09-18 17:48:07 +02:00
Johannes Zellner 0ae4d323f7 Allow deep linking into the app configure views 2019-09-18 17:45:13 +02:00
Johannes Zellner 930404e482 Ensure we use the same danger color also in form validations 2019-09-18 17:17:36 +02:00
Johannes Zellner 92257afdab Enable custom app data dir setting 2019-09-18 17:12:10 +02:00
Johannes Zellner 300ff09a47 Move app error handling to simply show the app configure view 2019-09-18 15:54:19 +02:00
Johannes Zellner 14dd1103eb Fix angular interval usage 2019-09-18 15:53:57 +02:00
Johannes Zellner ff07eb1de0 Always poll for app status updates when an app configure view is open 2019-09-17 22:38:11 +02:00
Johannes Zellner b81f45bf47 Selectively show the email configure view 2019-09-17 22:05:32 +02:00
Johannes Zellner eb3232e049 Add update check and apply buttons in app view 2019-09-17 17:14:40 +02:00
Johannes Zellner 752f653f82 Improve the tab view 2019-09-17 16:19:43 +02:00
Johannes Zellner ed90dbe7b7 Improve app backup view 2019-09-17 16:16:54 +02:00
Johannes Zellner e1e0f2944b Make uninstall a separate view 2019-09-17 15:40:04 +02:00
Johannes Zellner 2269f15b66 Merge overview bits into other more relevant views 2019-09-17 15:32:43 +02:00
Johannes Zellner 5c0a53e02a Bring back email view in app configure 2019-09-17 15:09:39 +02:00
Johannes Zellner 8810439ffc Reset views on change 2019-09-17 14:52:22 +02:00
Johannes Zellner 9d61270937 Add artificial 1sec delay to simple app form submissions 2019-09-17 14:49:26 +02:00
Johannes Zellner b602a9d15d Handle location form submit errors for (sub)domains 2019-09-16 19:58:15 +02:00
Johannes Zellner bb0ab03ad9 Improve the configure overlay button 2019-09-16 14:24:17 +02:00
Johannes Zellner d674dcaeef Add location display in overview 2019-09-16 14:18:51 +02:00
Johannes Zellner a738ddb917 Add initial back to my apps link 2019-09-16 14:15:38 +02:00
Johannes Zellner 935c92b507 Make app configure sections a separate view 2019-09-16 14:03:13 +02:00
Johannes Zellner 10d1a2d8e4 Even further cleanup of dead code 2019-09-13 19:06:50 +02:00
Johannes Zellner cf6d64646a remove more dead code 2019-09-13 17:19:53 +02:00
Johannes Zellner c570e8b6fe Move app clone into app view 2019-09-13 17:18:37 +02:00
Johannes Zellner 849b9e0c80 Remove dead code 2019-09-13 17:10:12 +02:00
Johannes Zellner 8f8aa31304 Add restore and backup logic to app view 2019-09-13 17:08:50 +02:00
Johannes Zellner a1fe79c876 Also remove the app info dialog code from apps grid 2019-09-13 16:07:55 +02:00
Johannes Zellner 7c9654a541 Remove app task cancel code in apps grid 2019-09-13 15:54:27 +02:00
Johannes Zellner a86df7cdbf aRemove unused requires 2019-09-13 15:51:36 +02:00
Johannes Zellner 3d5cdd659b Remove all configure bits from the app grid page 2019-09-13 11:29:19 +02:00
Johannes Zellner 7a2a5d3846 Redirect back to app grid if app does not exist 2019-09-13 11:20:16 +02:00
Johannes Zellner 62fb0acb3c Move uninstall confirm dialog to app page 2019-09-13 11:18:43 +02:00
Johannes Zellner c4dfe8a723 Fixup form submission state for memory limit and robots 2019-09-13 11:12:11 +02:00
Johannes Zellner 4af4df9288 Only enable submit button if memory limit is changed 2019-09-13 11:06:13 +02:00
Johannes Zellner 25b0e18ceb Do not make the app task overlay that busy 2019-09-13 11:02:13 +02:00
Johannes Zellner c4aec8dfa6 Do not show app postinstall info in app view 2019-09-13 10:57:34 +02:00
Johannes Zellner 4056a3da43 Add debug section to app page 2019-09-13 10:34:12 +02:00
Johannes Zellner 2027f8052b Improve app overview and add restart action 2019-09-12 17:42:33 +02:00
Johannes Zellner 96bb293c1f Improve app location settings 2019-09-12 17:08:45 +02:00
Johannes Zellner fd73b28d66 Improve app display configuration 2019-09-12 16:28:21 +02:00
Johannes Zellner aafa698776 Add initial app configure jump links 2019-09-12 15:59:40 +02:00
Johannes Zellner a99d31535c Always show configure icon in app grid for now 2019-09-12 14:40:16 +02:00
Johannes Zellner fda8791d5a app postprocess is already run in getApp 2019-09-12 12:18:10 +02:00
Girish Ramakrishnan 9e2ac31a08 Make mail list members a textarea
Also, fix the error handling
2019-09-11 14:40:57 -07:00
Johannes Zellner 758b32a61c Add initial task popup for apptasks 2019-09-11 21:24:45 +02:00
Johannes Zellner 62b392e555 Do not throw error if app is null in state label filter 2019-09-11 21:24:45 +02:00
Johannes Zellner a4c99fd361 Move all app configure tasks to separate view 2019-09-11 21:24:45 +02:00
Girish Ramakrishnan 8823656d70 add new installationStates 2019-09-10 14:30:44 -07:00
Girish Ramakrishnan b82f5da112 Fixup event log for app configure 2019-09-10 14:18:44 -07:00
Girish Ramakrishnan 729f51b779 Make email a separate tab
This allows us to add some additional info that the app is pre-configured
to send email via the relay
2019-09-08 12:52:34 -07:00
Girish Ramakrishnan 1c1171e8a7 Add help link for relay 2019-09-08 12:23:27 -07:00
Johannes Zellner 44df319ff6 Do not show error page in notification on proxy upstream errors
This handles box being down and nginx delivers error page.
We do not want to show that in the notification, but other box crash
errors should be shown, they need to be fixed
2019-09-07 09:40:03 +02:00
Johannes Zellner 84dec337f0 Prevent angular errors when there is no appError.app set yet 2019-09-07 09:24:45 +02:00
Girish Ramakrishnan 2e60a9d43c init creatingBackup variable 2019-09-06 15:29:59 -07:00
Girish Ramakrishnan 4474766526 Hide when backup is active 2019-09-06 15:27:03 -07:00
Girish Ramakrishnan ddc1d8117d from -> using 2019-09-06 14:39:39 -07:00
Girish Ramakrishnan 609bae4f1a Use reason code 2019-09-05 19:23:58 -07:00
Girish Ramakrishnan ff16a4334f Move showError into appError scope 2019-09-05 17:50:10 -07:00
Johannes Zellner 739e308c0e Make offline banner a link to the troubleshooting page 2019-09-06 00:14:05 +02:00
Johannes Zellner 6b29f57e1d Give useful information when box crashes or a request is otherwise terminated 2019-09-06 00:01:41 +02:00
Johannes Zellner 21981829fd Make Client.error() persistent and allow to pass an action 2019-09-06 00:01:41 +02:00
Johannes Zellner b6e00a3107 Do not redirect to error.html if the angular main application fails to init
We now only show the offline banner and retry the application init until
box comes back up
2019-09-05 22:23:28 +02:00
Johannes Zellner 8b8b137cad Fix rest api wrapper usage 2019-09-05 22:23:28 +02:00
Girish Ramakrishnan 1ba1286df0 cloudron -> server 2019-09-05 12:28:04 -07:00
Girish Ramakrishnan 0417a82f83 Show error if graph loading fails 2019-09-05 12:23:53 -07:00
Girish Ramakrishnan 4cc01a2152 Move optional field to the end 2019-09-05 11:38:55 -07:00
Girish Ramakrishnan c7d434a091 Show backup progress inline 2019-09-05 11:30:27 -07:00
Girish Ramakrishnan 3e1e704a7f Bring back app progress message 2019-09-05 10:05:01 -07:00
Girish Ramakrishnan 12a9dcaa76 Better blocking update text 2019-09-04 21:10:34 -07:00
Girish Ramakrishnan fc2dd148c5 The tooltip is useful to track progress 2019-09-04 21:10:34 -07:00
Johannes Zellner ede6f36913 ng-cloak the offline bannder 2019-09-04 22:09:10 +02:00
Girish Ramakrishnan f85143fb7b Add links to docs in user dialog for disable and admin 2019-09-04 11:06:49 -07:00
Girish Ramakrishnan bbf3043fc3 graphs: add label to app tool tips 2019-09-04 09:20:05 -07:00
Girish Ramakrishnan bbd73d361a Fixup error handling in apps view 2019-09-03 15:18:05 -07:00
Girish Ramakrishnan 7d44c87aff Use error codes and fields 2019-09-02 17:28:40 -07:00
Girish Ramakrishnan 7e81041b87 Use reason code for better error handling 2019-09-02 13:18:19 -07:00
Girish Ramakrishnan e30698459b Use data.success before grabbing the error 2019-08-30 14:24:59 -07:00
Johannes Zellner 42399469a7 Prevent non-admins from showing the repair modal 2019-08-30 21:24:00 +02:00
Johannes Zellner 8ccc7bb734 Remove wrench and add action description on error 2019-08-30 21:21:44 +02:00
Girish Ramakrishnan 38a7c222a8 app.error is now an object 2019-08-30 11:38:31 -07:00
Johannes Zellner 9ea21606e5 Only show external ldap settings when ?ldap query is passed for now 2019-08-30 19:01:56 +02:00
Johannes Zellner c809119d57 Ensure hand cursor is correctly shown also in error states 2019-08-30 18:15:34 +02:00
Johannes Zellner b8ca009e69 Revert "Always show the hand cursor in app grid items"
This reverts commit 9df90e4edc.
2019-08-30 17:20:21 +02:00
Johannes Zellner 1e37d7da7d Refresh the user lising after ldap sync 2019-08-30 16:56:01 +02:00
Johannes Zellner 9df90e4edc Always show the hand cursor in app grid items 2019-08-30 16:51:50 +02:00
Johannes Zellner 4576e93deb Hide user account actions for external ldap users 2019-08-30 13:36:52 +02:00
Johannes Zellner ea5e0b28da Hide certain user profile actions for external ldap users 2019-08-30 13:32:20 +02:00
Johannes Zellner 19c8a01969 Add more description how ldap sync works 2019-08-30 13:09:44 +02:00
Johannes Zellner ebab88e7aa Rework the external ldap ui to follow usual modal dialog pattern 2019-08-30 12:40:23 +02:00
Johannes Zellner b4248acd9a There is no ng-enabled, only ng-disabled 2019-08-30 12:34:31 +02:00
Johannes Zellner c303174f0b Usernames can be even 1 character long 2019-08-30 11:02:07 +02:00
Johannes Zellner 91cf6465df Give external ldap sync task feedback 2019-08-30 10:20:08 +02:00
Johannes Zellner 426d2aab09 Add ability to trigger external ldap syncer task 2019-08-30 10:20:08 +02:00
Johannes Zellner 8c44e558a8 Add external LDAP configuration 2019-08-30 10:20:08 +02:00
Girish Ramakrishnan 6a08e08d7c Show errorMessage 2019-08-29 18:59:13 -07:00
Girish Ramakrishnan 2796ad12fe Show app cancel busy indicator 2019-08-29 14:51:21 -07:00
Girish Ramakrishnan 45d40297bf refresh app cache on cancel 2019-08-29 14:35:39 -07:00
Girish Ramakrishnan 57ac37c210 Fix configure/repair button text 2019-08-29 14:34:04 -07:00
Girish Ramakrishnan 8eee0b809c Add cancel action for active app tasks 2019-08-29 14:30:25 -07:00
Girish Ramakrishnan 5387054000 Refactor update functions 2019-08-29 11:33:22 -07:00
Girish Ramakrishnan e08f072d95 Refactor uninstall functions 2019-08-29 11:30:37 -07:00
Girish Ramakrishnan 44db2ca02a lint 2019-08-29 11:18:02 -07:00
Girish Ramakrishnan dc8564d18e Remove force update state 2019-08-29 10:59:15 -07:00
Girish Ramakrishnan 3b8bc9fdab Rename pending to queued 2019-08-28 22:13:28 -07:00
Girish Ramakrishnan c5d65fa030 typo 2019-08-28 22:12:24 -07:00
Girish Ramakrishnan 0252b08c8f Remove app task crash action 2019-08-28 16:03:17 -07:00
Girish Ramakrishnan 8f29b7a91f Use task api to get app progress 2019-08-28 16:03:17 -07:00
Johannes Zellner 19e1bbdc1c Add missing graphite log viewer entry 2019-08-27 14:54:39 +02:00
Johannes Zellner cd2baf105f Fix next color helper 2019-08-22 18:38:32 +02:00
Johannes Zellner 3366acde58 prettyDiskSize should return something descriptive instead of NaN
undefined
2019-08-22 18:37:32 +02:00
Johannes Zellner 775f6eff0b We are in the browser, avoid const 2019-08-22 18:33:37 +02:00
Girish Ramakrishnan 52d501dae8 use app label if available 2019-08-21 14:59:55 -07:00
Girish Ramakrishnan eb24baf2c1 Better prettyDiskDize 2019-08-21 14:57:59 -07:00
Johannes Zellner 7fd0ef51b5 Use more consistent theme colors 2019-08-21 20:46:26 +02:00
Johannes Zellner 173acc5226 Show disk content separately inside the usage graph 2019-08-21 20:27:43 +02:00
Johannes Zellner 6643b825ee Fixup the disk usage gathering 2019-08-21 12:08:19 +02:00
Girish Ramakrishnan a56f20584f add note 2019-08-20 19:38:53 -07:00
Girish Ramakrishnan 22664bea62 Add options to graphs 2019-08-20 19:38:32 -07:00
Johannes Zellner f80bf65076 Fetch du- data for disk contents 2019-08-20 13:00:45 +02:00
Johannes Zellner 28634c59c8 Get the correct df data from graphite 2019-08-20 12:36:06 +02:00
Johannes Zellner 993377a40b Show email and docker data location in graphs 2019-08-20 12:23:07 +02:00
Girish Ramakrishnan 9633733bc4 Clarify that this is ubuntu related 2019-08-19 13:56:25 -07:00
Johannes Zellner 6b4893b854 Rework disk usage graphs and give more information what is installed where 2019-08-19 16:50:03 +02:00
Johannes Zellner 09f7c35dac Show red badge and subscription expired page depending on the subscriptipn status 2019-08-19 12:11:11 +02:00
Johannes Zellner 0fc4169b0b correctly display premium app requirement page 2019-08-19 09:13:37 +02:00
Johannes Zellner 78746be0f5 Distinguish between too many apps and premium apps 2019-08-14 16:38:02 +02:00
Johannes Zellner 2287a550d7 Move subscription setup outlink button inside iframe for better label control 2019-08-14 15:48:10 +02:00
Johannes Zellner d6eb6d3318 Add small indicator if no users have been found 2019-08-13 15:30:40 +02:00
Girish Ramakrishnan db2d36eaa1 Show ban icon for inactive users 2019-08-08 08:30:29 -07:00
Girish Ramakrishnan 151d20341e Add checkbox for user active 2019-08-08 08:25:59 -07:00
Johannes Zellner 2c51bc17f1 Reduce iframe size 2019-08-06 14:16:35 +02:00
Johannes Zellner 0448ad49ed Allow our appstore origins explicitly 2019-08-06 10:24:35 +02:00
Johannes Zellner 2d4129f8f7 Fix typo 2019-08-06 10:22:00 +02:00
Johannes Zellner c42aa7c806 Remove caas case in setup screen 2019-08-06 10:03:12 +02:00
Johannes Zellner debeb8dfd8 Ignore setup page info button in tab focus 2019-08-06 09:59:06 +02:00
Johannes Zellner 2227e1dd4b Allow to specify the appstore subscription helper origins 2019-08-05 20:32:56 +02:00
Johannes Zellner 1d7e73c162 Fix indentation 2019-08-05 20:04:27 +02:00
Johannes Zellner 3f451856a0 adjust to appstore filename change 2019-08-04 11:38:09 +02:00
Johannes Zellner fdd0483c9f Allow localhost development iframe sources 2019-08-04 11:32:42 +02:00
Girish Ramakrishnan c1a49a52e8 Remove the newline 2019-08-03 10:33:56 -07:00
Girish Ramakrishnan d8394392c9 Fix tooltip 2019-08-03 09:43:30 -07:00
Girish Ramakrishnan eb7a037f94 comment out display raw json event 2019-08-03 09:37:29 -07:00
Girish Ramakrishnan eb905aab86 Add SPF doc links
Fixes cloudron/box#636
2019-08-02 13:30:45 -07:00
Girish Ramakrishnan 55892097d7 Fix error message when clicking on unhealthy app
Fixes cloudron/box#643
2019-07-31 11:48:38 -07:00
Girish Ramakrishnan 6bfcda9fdc Send app object to message filters
this lets us access the state of an app
2019-07-31 11:40:18 -07:00
Girish Ramakrishnan 02dcbb9a52 Add some comments on the various labels 2019-07-31 11:38:28 -07:00
Johannes Zellner 0c6a6e4173 Show premium app required site from appstore 2019-07-31 08:09:43 +02:00
Johannes Zellner e044251df4 Show subscription setup page from appstore 2019-07-31 08:09:43 +02:00
Johannes Zellner 26d27a3f6a Allow iframes from *cloudron.io 2019-07-31 08:09:43 +02:00
Girish Ramakrishnan c5b9fccedb Add wasabi to restore UI 2019-07-30 10:42:18 -07:00
Girish Ramakrishnan 0153e5212c Allow restore from IP 2019-07-26 22:43:59 -07:00
Girish Ramakrishnan 92835a5270 Show warning when sendmail is disabled for a domain 2019-07-24 22:11:05 -07:00
Girish Ramakrishnan 5f41c78305 Add wasabi 2019-07-22 16:57:01 -07:00
Johannes Zellner 1726b89dea Ensure large notification markdown payloads do not overflow the UI 2019-07-17 16:40:10 +02:00
Girish Ramakrishnan 2506e69cdc Add SparkPost as mail relay 2019-07-15 10:49:13 -07:00
Johannes Zellner 88bc30bbea Rework the restore/clone dialogs 2019-07-12 17:18:21 +02:00
Girish Ramakrishnan 2835d1bd87 We now have free trial 2019-07-11 11:18:48 -07:00
Girish Ramakrishnan e590896f01 appstore: handle 402 2019-07-08 09:58:50 -07:00
Girish Ramakrishnan dfb0836446 Revert "Enable dataDir setting"
This reverts commit 9515a060ab.
2019-07-03 07:53:30 -07:00
Girish Ramakrishnan 88fdd1f562 Remove ownerId use 2019-07-02 20:22:06 -07:00
Girish Ramakrishnan ae07c7934e Fix login issue when admin is revoked
If this ex-admin user had installed an app, then we try to get app details
(since he is the owner) and we go into a loop
2019-07-02 19:02:39 -07:00
Girish Ramakrishnan 9515a060ab Enable dataDir setting 2019-06-25 10:49:39 -07:00
Girish Ramakrishnan c550416c9d reset the app icon on show 2019-06-21 13:30:33 -07:00
Girish Ramakrishnan 712883373a scaleway-os: restore UI 2019-06-21 11:10:19 -07:00
Girish Ramakrishnan 50930ee609 exoscale: do not overwrite endpoint 2019-06-21 10:46:07 -07:00
Girish Ramakrishnan 78bffad99f exoscale: add CH-GVA-2 2019-06-21 10:44:24 -07:00
Girish Ramakrishnan b3760a961d Prefix the env vars with CLOUDRON_ for manifest v2 2019-06-19 09:16:41 -07:00
Girish Ramakrishnan 813d92ce32 Show domain removal error
this got removed by mistake with the password edit
2019-06-18 11:38:30 -07:00
Girish Ramakrishnan b02570e679 Hide data dir UI again for this release 2019-06-13 15:14:25 -07:00
Girish Ramakrishnan b7d1979d0d Always show the DNS status section 2019-06-12 17:48:06 -07:00
Johannes Zellner 6e6846835a Do not create notification links with target blank
Most links are pointing the user within the dashboard
2019-06-12 16:15:55 +02:00
Johannes Zellner d899935b56 Add Digitalocean Spaces Frankfurt region 2019-06-12 10:11:46 +02:00
Girish Ramakrishnan 2a07c063ab deleting app does not remove backups 2019-06-08 11:08:16 -07:00
Johannes Zellner 3ab9d77930 Give alternate domain rows some space 2019-06-05 20:22:44 +02:00
Johannes Zellner 5537507646 Distinguish alternate and main domain errors 2019-06-05 20:22:34 +02:00
Girish Ramakrishnan 215dd03751 Show dataDir UI 2019-06-01 09:05:15 -07:00
Girish Ramakrishnan 3fe73ba198 Move dataDir and memory to resources section 2019-06-01 09:02:05 -07:00
Girish Ramakrishnan 6bc7edea67 Revert "Attempt to finally fix checkboxes and radio button layout"
This reverts commit f95a98d3ee.

This breaks access restriction page spacing
2019-05-31 15:24:13 -07:00
Girish Ramakrishnan c44e69c396 Add help link for redirection 2019-05-31 14:41:47 -07:00
Girish Ramakrishnan f6ad697755 Replace big plus button with text link 2019-05-31 14:39:35 -07:00
Girish Ramakrishnan 2abca93333 Make the preview icon smaller 2019-05-31 14:25:03 -07:00
Girish Ramakrishnan 788e7c40e9 Add Access tab to configure UI 2019-05-31 14:14:34 -07:00
Johannes Zellner dca43f3e57 Allow to configure more than one alternate domain 2019-05-31 15:19:07 +02:00
Johannes Zellner f95a98d3ee Attempt to finally fix checkboxes and radio button layout 2019-05-31 12:31:02 +02:00
Girish Ramakrishnan 11fe3dc492 support: show create ticket result 2019-05-28 10:04:18 -07:00
Girish Ramakrishnan 4277244150 fix text: Event Log 2019-05-24 19:03:13 -07:00
Girish Ramakrishnan 8458bcf10e make the info text small 2019-05-24 10:28:42 -07:00
Girish Ramakrishnan 6c8c7751fd Add note that access control allows SFTP access 2019-05-24 10:25:34 -07:00
Girish Ramakrishnan d6096d04d9 remove twitter from footer 2019-05-22 11:56:55 -07:00
Girish Ramakrishnan bffe6327a0 setup: have a single error object 2019-05-22 11:14:33 -07:00
Girish Ramakrishnan 28845d6f33 state and not status 2019-05-22 10:50:58 -07:00
Girish Ramakrishnan 6ec7da9071 fix text 2019-05-22 09:38:13 -07:00
Johannes Zellner 5dbe564afb Use the same size aspect ratio for custom app icon selector as in the app grid 2019-05-22 09:32:10 +02:00
Johannes Zellner 4794791167 Style the custom app icon configuration the same way the avatar is 2019-05-22 09:29:17 +02:00
Girish Ramakrishnan 7b2ae2c457 Make reset show the original icon 2019-05-21 00:18:29 -07:00
Girish Ramakrishnan f0093c5e4f Add random string to icon to invalidate it 2019-05-21 00:06:33 -07:00
Girish Ramakrishnan 96117216ee Allow icon to be set 2019-05-20 22:24:58 -07:00
Girish Ramakrishnan 9982557909 setAdmin is unused 2019-05-20 19:05:31 -07:00
Girish Ramakrishnan 530331f9ee Fix texts in dialogs 2019-05-20 19:05:12 -07:00
Girish Ramakrishnan 23018abdf6 Put some text in delete user dialog 2019-05-20 19:05:12 -07:00
Girish Ramakrishnan 23b72620a1 domain remove does not require password 2019-05-20 19:05:08 -07:00
Girish Ramakrishnan a80c21d77f domainMigrate is unused 2019-05-20 18:58:33 -07:00
Johannes Zellner 765307ddef Fix domain filter select 2019-05-20 23:40:02 +02:00
Johannes Zellner 9a859629bc Remove unused usedDomains 2019-05-20 23:23:07 +02:00
Johannes Zellner cc7b203f93 Only allow selecting one domain in the apps filter 2019-05-20 21:06:13 +02:00
Girish Ramakrishnan 8744eadca0 Fixup text 2019-05-20 10:55:46 -07:00
Girish Ramakrishnan 76eaee5b1a Remove X-Frame-Options 2019-05-20 10:10:36 -07:00
Girish Ramakrishnan 7adde2a880 Make tag matching an AND operation 2019-05-17 13:01:23 -07:00
Girish Ramakrishnan c02eced029 no comma 2019-05-16 10:14:29 -07:00
Girish Ramakrishnan ad5ca50273 filter on alt domains also 2019-05-16 09:55:24 -07:00
Girish Ramakrishnan 767756ba9b sort the tags 2019-05-16 09:42:34 -07:00
Girish Ramakrishnan c3cf5ff84c Use changeDashboardDomain custom config 2019-05-14 19:21:15 -07:00
Girish Ramakrishnan a82c790855 Always show the change dashboard domain
otherwise, people don't know this feature exists!
2019-05-14 19:12:45 -07:00
Johannes Zellner 4b22e3e0a8 Hide the token, session and oauch client ui for non admins 2019-05-14 16:55:29 +02:00
Johannes Zellner 2039a143ac Do not crash if some apis are only for admins 2019-05-14 16:41:08 +02:00
Girish Ramakrishnan 84473dc10d poll subscription status only when button got clicked
otherwise, both stripe, our appstore db is bombarded
2019-05-13 16:40:51 -07:00
Girish Ramakrishnan 5695da1d86 refresh notifications every minute
no reason to bombard the server, it's not like this is realtime
2019-05-13 16:13:09 -07:00
Johannes Zellner 30583cce21 Do not require password for user and group deletion 2019-05-13 23:55:54 +02:00
Johannes Zellner 27c7c0438f account password change now returns 400 2019-05-13 23:42:06 +02:00
Johannes Zellner b67d5eec3d Remove password requirement for app uninstall and restore 2019-05-13 23:31:45 +02:00
Johannes Zellner 7c2ea6288c Fix the default app grid with to avoid occasional overflow 2019-05-13 23:04:40 +02:00
Johannes Zellner 9a1d71face Prevent notification collapse toggle when attempting selecting message details 2019-05-13 21:06:20 +02:00
Girish Ramakrishnan 8e346bf676 Add checkbox to skip backup 2019-05-12 13:44:10 -07:00
Johannes Zellner 53a00a8d76 markdown injects block elements so break out the version 2019-05-11 13:48:22 +02:00
Johannes Zellner ea1e556197 Allow the footer content to be configured 2019-05-11 13:33:02 +02:00
Johannes Zellner 402d75bfe0 Make the ssh remote support text more generic 2019-05-11 13:26:21 +02:00
Johannes Zellner a444b61edf Remove twitter link from footer and pull version to the right 2019-05-11 10:24:11 +02:00
Johannes Zellner ce41af14db Make sure the tooltip text does not get cropped 2019-05-11 10:04:21 +02:00
Girish Ramakrishnan d52d606088 Use ticketBodyMarkdown 2019-05-10 17:35:51 -07:00
Girish Ramakrishnan 475311f63a Fixup uiSpec use 2019-05-10 16:09:13 -07:00
Johannes Zellner 5509089c49 Fixup the checkbox dom 2019-05-10 23:47:36 +02:00
Girish Ramakrishnan 3698220b8f features -> uiSpec 2019-05-10 11:23:53 -07:00
Girish Ramakrishnan b22dba00a2 Make login work after user becomes admin 2019-05-10 09:45:37 -07:00
Girish Ramakrishnan 3d8ec5531c Fix avatarUrl use 2019-05-10 09:27:43 -07:00
Girish Ramakrishnan 7df0ae0ba3 Allow email to be enabled without dns setup
This helps in importing existing mail and also configuring mailboxes
before going live
2019-05-09 15:41:37 -07:00
Johannes Zellner 05d37cc6c6 Show domain filter only if we have more than one domain 2019-05-09 19:48:00 +02:00
Johannes Zellner df03f783f8 Change the demo link 2019-05-08 18:46:41 +02:00
Girish Ramakrishnan cd9263711f feedback -> ticket 2019-05-07 11:36:12 -07:00
Girish Ramakrishnan 48c3372c33 Use config.features to customize UI 2019-05-07 10:11:54 -07:00
Girish Ramakrishnan 5d1ff97bf3 remove edition flag 2019-05-06 20:05:18 -07:00
Girish Ramakrishnan 1decfe8063 Show proper error if available 2019-05-06 20:05:12 -07:00
Johannes Zellner a3d0ffb7de Avoid throwing error on quick view switch away from the appstore 2019-05-06 11:47:57 +02:00
Johannes Zellner 59a54f8683 Do not show error and empty appstore details if not yet setup 2019-05-06 11:39:45 +02:00
Johannes Zellner 83e2bd6ade Distinguish between not yet registered and invalid appstore token
This is to avoid throwing errors
2019-05-06 11:07:20 +02:00
Girish Ramakrishnan a59aca10ec Fixup subscription routes 2019-05-05 13:02:23 -07:00
Girish Ramakrishnan 9ac6e65087 Wait for app list before setting ready flag 2019-05-05 11:52:42 -07:00
Girish Ramakrishnan deb8e117ad After login/register, get the latest subscription 2019-05-05 11:28:42 -07:00
Girish Ramakrishnan 9c3cae5eca lint: quotes 2019-05-05 09:05:06 -07:00
Girish Ramakrishnan 1fbbeba5bc Get subscription first and then get apps 2019-05-05 08:16:33 -07:00
Girish Ramakrishnan 8317972078 Fix typo when fetching groups 2019-05-05 07:40:11 -07:00
Girish Ramakrishnan 0a9947dbb9 No need to get unstable config
this is now handled in the backend
2019-05-05 07:38:34 -07:00
Girish Ramakrishnan 51521926e7 Use new registration API 2019-05-04 22:02:02 -07:00
Girish Ramakrishnan 8e08ac2ce1 Use new subscription API in settings controller 2019-05-04 21:57:53 -07:00
Girish Ramakrishnan fec82d127e Use the new getSubscription API in main controller 2019-05-04 21:57:49 -07:00
Girish Ramakrishnan ceb0770ea0 Add the subscription API 2019-05-04 19:22:24 -07:00
Girish Ramakrishnan 34eadebe00 Remove spaces code 2019-05-04 18:43:59 -07:00
Girish Ramakrishnan e7f614cdf3 Remove unused caas functions 2019-05-04 18:23:32 -07:00
Girish Ramakrishnan 18507f79b1 Use the new appstore API 2019-05-04 18:22:41 -07:00
Johannes Zellner ee1c7dbf03 Mark unstable apps in the appstore view 2019-05-03 15:56:59 +02:00
Girish Ramakrishnan 868af95ff2 appstore: remove unused getCloudronDetails 2019-05-02 15:28:07 -07:00
Johannes Zellner 01f59d39e0 Support unstable app listing setting in appstore view 2019-04-29 14:58:42 +02:00
Johannes Zellner 0226a5603d Add settings UI to enable unstable apps listing 2019-04-27 22:44:41 +02:00
Girish Ramakrishnan 1629be3788 Add tag placeholder 2019-04-25 10:49:07 -07:00
Johannes Zellner 480bc630da show app label if present 2019-04-24 14:31:52 +02:00
Johannes Zellner 165cc279de Allow to set app label 2019-04-24 14:25:37 +02:00
Girish Ramakrishnan 2ec5a2acff List unstable apps by default 2019-04-23 21:16:11 -07:00
Girish Ramakrishnan 6914e83dde Typo 2019-04-23 15:47:20 -07:00
Girish Ramakrishnan 263762c0bc relay: Add UI to accept self-signed certs 2019-04-23 15:44:18 -07:00
Girish Ramakrishnan f8b8a574a6 Add new provider with no auth 2019-04-22 17:00:34 -07:00
Girish Ramakrishnan 79c80b351d relay: remove hardcoding of providers 2019-04-22 16:56:43 -07:00
Girish Ramakrishnan 2c86fb17fc Revert "Allow empty mail relay username/password"
This reverts commit 2680b415c6.
2019-04-22 15:46:07 -07:00
Girish Ramakrishnan e205ffafdf Fix wording 2019-04-22 11:15:57 -07:00
Johannes Zellner 2680b415c6 Allow empty mail relay username/password 2019-04-22 14:48:32 +02:00
Johannes Zellner 62d8b35545 Bring back old update badge 2019-04-16 09:21:20 +02:00
Johannes Zellner 2b578efdd6 Do not add empty app tags 2019-04-15 15:44:02 +02:00
Johannes Zellner a7f37df34d only show tag or domains filter if any are available 2019-04-15 14:38:35 +02:00
Johannes Zellner 3edb119422 Remove unused function 2019-04-15 14:36:15 +02:00
Johannes Zellner 07d4d5051a Simplify the app grid filter to basic dropdowns for now 2019-04-15 14:31:12 +02:00
Girish Ramakrishnan 0b8e5a75f1 Fix backup route 2019-04-13 18:09:56 -07:00
Girish Ramakrishnan f263c73df7 Add scaleway object storage 2019-04-12 10:56:12 -07:00
Johannes Zellner f89f201764 Show initial tag sidebar 2019-04-12 11:06:56 +02:00
Johannes Zellner 9f8dcdf8ea Revert "Initial attempt to show tags on the apps if any"
This reverts commit f3baf31dcd.
2019-04-12 09:52:47 +02:00
Johannes Zellner f3baf31dcd Initial attempt to show tags on the apps if any 2019-04-11 18:43:03 +02:00
Johannes Zellner a9400785ca Add ability to attach freeform text tags to apps 2019-04-11 18:43:01 +02:00
Johannes Zellner 7c76ad2088 Fix reboot button explanation to not confuse the user when reboot is in fact required 2019-04-09 11:17:11 +02:00
Girish Ramakrishnan 6a5839d8cd Add sftp logs 2019-04-05 11:01:47 -07:00
Girish Ramakrishnan 744f39623f Make restart button always animate 2019-04-05 10:59:46 -07:00
Girish Ramakrishnan 97e57c74e4 Update progress every 3 secs 2019-04-03 11:46:02 -07:00
Johannes Zellner ff0d6b658b Simplify app icon handling
Previously we even attempted to use an appstore origin icon
2019-04-03 14:43:22 +02:00
Johannes Zellner 1c946a438d Simplify app grid item dom 2019-04-02 13:17:30 +02:00
Johannes Zellner 9b047a1927 Simplify the update indicator 2019-04-02 13:11:00 +02:00
Johannes Zellner 3fc6141d57 Use exact domain matching to filter apps for a domain 2019-04-02 12:41:23 +02:00
Johannes Zellner daf7e2313b Reduce domain header font size 2019-03-25 16:33:49 +01:00
Johannes Zellner 75642d785e Only show the headers if we have more than one domain with apps 2019-03-25 16:32:15 +01:00
Johannes Zellner 2621b5c047 Ensure we set the correct display type on the app actions 2019-03-25 16:31:49 +01:00
Johannes Zellner 57cb9a1d0b Only show domains where apps are installed at 2019-03-25 16:17:53 +01:00
Johannes Zellner 6318ae046c Make app actions always visible on mobile
Not great at all, but until we have a better idea at least it is
functional
2019-03-25 16:01:14 +01:00
Johannes Zellner 57a41cde9d Group apps by domain 2019-03-25 10:42:31 +01:00
Johannes Zellner ac86b7a954 Add sftp description in dashboard 2019-03-20 21:29:24 -07:00
Johannes Zellner 0bc500e34f Add robots.txt template 2019-03-20 09:53:10 -07:00
Johannes Zellner a60e065e43 Make the documentation link a more visible button 2019-03-20 09:32:33 -07:00
Johannes Zellner 5563b6a786 Show upstream version if available in the info dialog 2019-03-20 09:22:54 -07:00
Girish Ramakrishnan 0345c52aba Add noop relay backend
Part of cloudron/box#622
2019-03-15 14:25:19 -07:00
Girish Ramakrishnan 05c858df9e Default to DO for mp image 2019-03-11 18:44:48 -07:00
Girish Ramakrishnan 0b4ef21762 DO typo 2019-03-11 18:44:38 -07:00
Girish Ramakrishnan 64a58921a8 caas: show notifications
update notification will be moved to backend
2019-03-07 13:25:20 -08:00
Girish Ramakrishnan b96098b909 Fix wording a bit more 2019-03-06 09:56:15 -08:00
Johannes Zellner b1dbb2c408 Show when a subscription is already canceled 2019-03-06 15:54:51 +01:00
Johannes Zellner 3b1a08c67e Add pretty date only showing date 2019-03-06 15:54:21 +01:00
Johannes Zellner 07d37e133f more users is not part of the paid plans 2019-03-06 14:32:29 +01:00
Girish Ramakrishnan 161eb8bef9 reduce the timeout 2019-03-04 21:47:14 -08:00
Girish Ramakrishnan eb518c673c Revert "Revert "Hide dataDir setting for this release""
This reverts commit 347c8a8716.
2019-03-04 18:16:40 -08:00
Girish Ramakrishnan 6f32a0d6de Use encodeURIComponent for encoding query params 2019-03-04 12:59:41 -08:00
Girish Ramakrishnan b0684ce29c encode the filename 2019-03-04 11:54:41 -08:00
Girish Ramakrishnan b2c8a4d8ef Pass crashId to view crash logs 2019-03-01 16:35:52 -08:00
Johannes Zellner d09ac5bcc6 stop notification click event propagation 2019-02-28 15:56:19 +01:00
Girish Ramakrishnan c25c3e9daa never show hyphenatedSubdomains UI
can't think of a case where this is required in the UI. for the hosting
provider, they will have to do API automation for the initial domain
setup anyway.
2019-02-26 17:16:01 -08:00
Johannes Zellner c1cb5c36a1 Remove unnecessary elements 2019-02-24 19:18:43 +01:00
Johannes Zellner 20118f941e Show clipboard copy indication 2019-02-24 19:17:38 +01:00
Johannes Zellner f40eee4577 Update package lock 2019-02-24 19:16:57 +01:00
Girish Ramakrishnan bee05afc87 Add button to copy the backup id 2019-02-23 19:33:48 -08:00
Girish Ramakrishnan efdc533849 Update to gulp 4 2019-02-21 14:54:16 -08:00
Girish Ramakrishnan 1f7c6d59c1 Update modules for latest node 2019-02-21 14:14:28 -08:00
Girish Ramakrishnan 981622f414 Add games section 2019-02-21 10:17:41 -08:00
Girish Ramakrishnan 347c8a8716 Revert "Hide dataDir setting for this release"
This reverts commit 7424a226c9.
2019-02-19 14:52:24 -08:00
Girish Ramakrishnan 4542564709 Move reboot required check to server side notification 2019-02-19 09:15:15 -08:00
Girish Ramakrishnan cb889ce06d token now has an id 2019-02-15 14:21:10 -08:00
Girish Ramakrishnan db54a305b0 Token is now shown again anymore 2019-02-15 13:29:16 -08:00
Girish Ramakrishnan 8ccf17543a abbreviate version 2019-02-11 14:53:23 -08:00
Girish Ramakrishnan 72e99885aa Fix wording 2019-02-11 14:50:03 -08:00
Girish Ramakrishnan 18d2a9cab6 do not use audit source to generate the details 2019-02-11 14:38:05 -08:00
Girish Ramakrishnan 9c57702afc keep it sorted 2019-02-11 13:03:12 -08:00
Girish Ramakrishnan b708eb94d2 Add app up event 2019-02-11 12:34:47 -08:00
Girish Ramakrishnan 82c5531d04 render notification message as markdown 2019-02-10 23:11:14 -08:00
Girish Ramakrishnan e6f49b2d3b Add Email troubleshooting links 2019-02-10 21:04:42 -08:00
Girish Ramakrishnan 8ac97e2c8f Add help links in the backup ui 2019-02-10 17:05:11 -08:00
Johannes Zellner db7174b0f3 Fixup long tooltip in setup email field 2019-02-10 08:52:54 +01:00
Girish Ramakrishnan a47911048c use data.fqdn to show full domain name 2019-02-09 16:49:06 -08:00
Girish Ramakrishnan 5a2bdbf966 Fix link 2019-02-09 16:41:18 -08:00
Girish Ramakrishnan aa562228ef plural 2019-02-09 16:34:56 -08:00
Girish Ramakrishnan 98a70aedf2 Add doc links for zone name and cert provider 2019-02-09 10:17:01 -08:00
Girish Ramakrishnan 9b9da5664b namecheap: use token instead of ApiKey 2019-02-08 20:33:21 -08:00
Girish Ramakrishnan 2f2314d2f8 Clarify 2019-02-08 14:54:24 -08:00
Girish Ramakrishnan 715ebf0747 Remove password max-length restriction
The backend has a limit of 256
2019-02-08 09:50:41 -08:00
Johannes Zellner bb0443b967 Attempt to parse the notification message as json and show accordingly 2019-02-08 14:05:31 +01:00
Johannes Zellner 2cf0b528f0 Ensure the notification badge has plenty of space 2019-02-08 14:05:31 +01:00
Girish Ramakrishnan 6a95d481f0 Fix domain setup help links 2019-02-06 16:11:24 -08:00
Girish Ramakrishnan d281b21832 bump license year 2019-02-06 15:36:06 -08:00
Johannes Zellner 1d5cf43e68 Remove unused style selector 2019-02-06 17:29:23 +01:00
Johannes Zellner 6d6b2300a8 Make danger color more popping 2019-02-06 17:28:01 +01:00
Johannes Zellner 640ee55772 Handle notifications without an eventId 2019-02-06 16:33:57 +01:00
Johannes Zellner 7ec12f487b Remove client side backup configuration checks 2019-02-06 15:48:35 +01:00
Johannes Zellner 63b42d64b1 Cleanup some code 2019-02-05 16:41:17 +01:00
Johannes Zellner 667506172a Do not rely on the whole app object in the event but use appId 2019-02-05 16:40:46 +01:00
Girish Ramakrishnan 518bb74fbf Add dashboard domain update event 2019-02-04 20:24:23 -08:00
Girish Ramakrishnan 9038538718 inform user about email records as well 2019-02-04 20:02:26 -08:00
Girish Ramakrishnan 5234f50453 Show email UI even if domain is disabled
This way when a user tries to delete a domain, he can still clear
the mailboxes.

Fixes cloudron/box##610
2019-01-31 12:24:27 -08:00
Girish Ramakrishnan 6eabf73ece typo 2019-01-25 10:15:17 -08:00
Johannes Zellner 651d01564d Add link to docs when using namecheap for email 2019-01-25 13:39:42 +01:00
Girish Ramakrishnan 52cdec8d3c Pass the task id to stopTask 2019-01-24 15:56:17 -08:00
Girish Ramakrishnan 998c9bdeb7 clone: Do not send disabled ports
fixes cloudron/box#611
2019-01-24 10:06:00 -08:00
Girish Ramakrishnan 318ee89e89 restore: Add missing exoscale region dropdown 2019-01-23 18:04:43 -08:00
Johannes Zellner 031d7a1f18 Load eventlog details per notification 2019-01-23 17:04:28 +01:00
Girish Ramakrishnan 7424a226c9 Hide dataDir setting for this release
Let's keep this hidden till we fix the app repair issue
2019-01-22 11:38:53 -08:00
Johannes Zellner 30a1997fd9 Add missing html bits 2019-01-22 20:03:26 +01:00
Johannes Zellner 778ea0b720 add namecheap dns provider to dns setup 2019-01-22 16:45:48 +01:00
Johannes Zellner 353517f9c6 Add hint about IP whitelisting for namecheap 2019-01-22 14:35:17 +01:00
Johannes Zellner e651b2ee13 Add namecheap to domain config 2019-01-22 11:26:24 +01:00
Johannes Zellner 018b3a876f We use eslint by now, so make it as happy as it can be 2019-01-22 10:54:03 +01:00
Girish Ramakrishnan 1b9586011e Fix twitter icon in restore UI 2019-01-21 11:56:37 -08:00
Girish Ramakrishnan cb856ce2bb Fix error handling and tab focus 2019-01-19 22:08:29 -08:00
Johannes Zellner 8d3c1c9f9e Add more event types 2019-01-19 15:53:49 +01:00
Girish Ramakrishnan 1ec0f67b29 dataDir can be empty to revert back 2019-01-18 15:18:59 -08:00
Girish Ramakrishnan 093491c5b4 Make dataDir configurable 2019-01-17 09:21:38 -08:00
Johannes Zellner 56191d0cd9 Better text for app down eventlog item 2019-01-17 17:27:26 +01:00
Johannes Zellner 7342268eb8 Support app oom in eventlog 2019-01-17 17:23:34 +01:00
Johannes Zellner 3a09cbf42b Add app oom event type 2019-01-17 15:49:53 +01:00
Johannes Zellner b268368e3d Make linter happy 2019-01-17 13:26:47 +01:00
Johannes Zellner 59c8211c41 Do not show notification bubbles for notification items 2019-01-17 13:26:17 +01:00
Johannes Zellner 14560fff0a Hide notification action button 2019-01-17 13:21:54 +01:00
Johannes Zellner adf3172ebb Speed up user listing by performing parallel requests 2019-01-16 14:27:32 +01:00
Johannes Zellner 4ead9cbf6a Remove leftover copynpasted string 2019-01-16 13:16:10 +01:00
Girish Ramakrishnan 0863dc785f Just pass through all the data 2019-01-15 11:13:04 -08:00
Johannes Zellner 342538358d add pagination and filter panel to users view 2019-01-15 13:30:42 +01:00
Johannes Zellner a8b79055ef Better fix for tooltip overflow 2019-01-15 13:30:42 +01:00
Girish Ramakrishnan ec3be4c36a s3: Add Paris/Stockholm/Osaka 2019-01-14 09:57:50 -08:00
Girish Ramakrishnan 0a2ef0e041 update events in activitiy view 2019-01-14 09:29:00 -08:00
Johannes Zellner e7b623ea16 Use bootstrap tooltips in users view 2019-01-14 17:02:36 +01:00
Johannes Zellner 87777017a0 Ensure tooltips don't wrap text 2019-01-14 17:02:23 +01:00
Johannes Zellner bf2c7a18d1 Until the ui supports full pagination list up to 1k users 2019-01-14 16:57:41 +01:00
Girish Ramakrishnan b5505bcd87 Fixup restore eventlog 2019-01-13 14:54:19 -08:00
Girish Ramakrishnan bdf9fbae71 Fixup text 2019-01-12 10:08:32 -08:00
Girish Ramakrishnan 04c1afc9ce Add dyndns event 2019-01-12 09:58:30 -08:00
Girish Ramakrishnan 458c51bdaa Improve eventlog messages 2019-01-11 12:48:51 -08:00
Girish Ramakrishnan 90a736ba43 mailboxes: owner may not exist 2019-01-10 14:25:08 -08:00
Johannes Zellner 661ce4fc1d Ensure we callback if the request was killed by the browser 2019-01-10 14:37:43 +01:00
Johannes Zellner b764f1c861 For now make the notification bubble action go to notification view 2019-01-10 13:29:59 +01:00
Johannes Zellner 182949d8d2 Skip already acknowledged notifications on clear 2019-01-09 17:36:33 +01:00
Johannes Zellner a879bdeb47 Ensure busy states are reflected in the ui 2019-01-09 17:26:44 +01:00
Johannes Zellner 9c66a4ef4e Rework the notification style now that it is in its own view 2019-01-09 17:16:41 +01:00
Johannes Zellner d2d75b8e41 Move notifications into a separate view 2019-01-09 15:18:10 +01:00
Girish Ramakrishnan e36c15f770 lint 2019-01-08 20:46:39 -08:00
Girish Ramakrishnan 8dc6da2b7a Escape html tags
In streaming view, logs like <foo@bar.com> was not appearing
2019-01-08 19:49:52 -08:00
Girish Ramakrishnan d3ae252740 Use the smart host term 2019-01-08 14:53:23 -08:00
Girish Ramakrishnan 29f48bcba6 Use -1 to download full logs
Part of cloudron/box#604
2019-01-08 13:13:39 -08:00
Girish Ramakrishnan e6fe5adca7 Use lines argument 2019-01-08 13:12:37 -08:00
Girish Ramakrishnan 82a96ec91d Keep it alphabetical 2019-01-08 10:24:16 -08:00
Johannes Zellner db02cbb575 Always refresh notifications 2019-01-08 14:33:47 +01:00
Johannes Zellner 749dd20704 Poll for new notifications every 10sec 2019-01-08 14:08:29 +01:00
Johannes Zellner b9db6040f4 Show label if no new notifications exist 2019-01-08 13:49:21 +01:00
Johannes Zellner c9628c0f75 Do not show ack button on old notifications 2019-01-08 13:45:49 +01:00
Johannes Zellner 979af88a40 Make notification badge a friendlier green 2019-01-08 13:45:49 +01:00
Johannes Zellner 98b4cd330f Add button to show older notifications 2019-01-08 13:45:40 +01:00
Johannes Zellner 5ab390c3db Show notification time 2019-01-08 13:24:05 +01:00
Johannes Zellner 71eaf9966f Improve notification view layout and add relevant actions 2019-01-08 13:18:35 +01:00
Johannes Zellner 9653d07ae2 Rename activity log to eventlog 2019-01-08 12:42:03 +01:00
Johannes Zellner f1663d0fbf Do not make notifications persistent 2019-01-08 12:41:52 +01:00
Johannes Zellner 38cb2201a9 Update toplevel notification status 2019-01-08 12:36:08 +01:00
Johannes Zellner fa04bea64b List unread notifications in accounts view 2019-01-07 18:05:02 +01:00
Johannes Zellner 2bc66af55d Add notification ack api wrapper 2019-01-07 18:04:52 +01:00
Johannes Zellner db5892d0ae Make linter happy 2019-01-07 17:34:10 +01:00
Johannes Zellner 59c7c1e302 Use the new notification onClick api in places 2019-01-07 17:30:01 +01:00
Johannes Zellner 48f63ec761 Update angular-ui-notification and show unread notifications 2019-01-07 17:23:26 +01:00
Girish Ramakrishnan 4051e34e20 Fix text 2019-01-06 16:25:25 -08:00
Girish Ramakrishnan 428bd43d60 Fix change dashboard domain UI issues 2019-01-06 16:02:05 -08:00
Girish Ramakrishnan 67415ff715 Check if scope is already destroyed 2019-01-06 15:29:38 -08:00
Girish Ramakrishnan fbc494abc9 Hello 2019! 2019-01-04 19:37:51 -08:00
Girish Ramakrishnan 0816af3cf1 Use new support API
Part of cloudron/box#600
2018-12-19 13:27:59 -08:00
Girish Ramakrishnan bb575fff5b Fix feedback API route 2018-12-19 10:58:50 -08:00
Girish Ramakrishnan cbe632839c Add UI to switch domain 2018-12-18 15:27:26 -08:00
Girish Ramakrishnan 7c972758af Show progress message in setup and restore 2018-12-16 11:04:25 -08:00
Girish Ramakrishnan 236f66f56f Fix create invite post request
(cherry picked from commit 0688c272c2)
2018-12-15 09:28:35 -08:00
Girish Ramakrishnan a485df2f79 Fix usage of webadminStatus 2018-12-14 16:34:57 -08:00
Girish Ramakrishnan 54b9154457 post requires extra data argument
broken by e6ad14f8
2018-12-14 16:33:10 -08:00
Girish Ramakrishnan 37aabcee4f Show the renew certificates header 2018-12-13 15:54:06 -08:00
Girish Ramakrishnan b2d18560be this is handled by the managed case 2018-12-13 10:52:08 -08:00
Girish Ramakrishnan 1429aa1edc more caas removal 2018-12-13 10:50:37 -08:00
Girish Ramakrishnan 5d4f942d46 remove caas plan change UI 2018-12-13 09:36:21 -08:00
Johannes Zellner 30ea7e854d Fix wording 2018-12-13 13:58:08 +01:00
Johannes Zellner 907f82338e Fix twitter logo on setup screens 2018-12-12 08:49:28 +01:00
Girish Ramakrishnan dcb0160b64 Remove blank line 2018-12-11 11:04:36 -08:00
Girish Ramakrishnan fccd7fa438 Add a progress bar for the renewal task 2018-12-11 10:55:32 -08:00
Girish Ramakrishnan c39711a87e Remove unused fields 2018-12-11 10:43:02 -08:00
Johannes Zellner a8de003cf0 Remove obsolete js-update gulp task 2018-12-11 19:25:26 +01:00
Johannes Zellner 6db54fc3b5 remove uglifier
The resulting code was actually a tiny bit larger
2018-12-11 19:25:26 +01:00
Girish Ramakrishnan d058536011 Fix indent 2018-12-11 10:19:13 -08:00
Girish Ramakrishnan 02ad4ba98d return taskId in Client.renewCerts 2018-12-11 10:19:13 -08:00
Johannes Zellner a68a76112c Fix eventlog usage 2018-12-11 19:03:42 +01:00
Girish Ramakrishnan 975c545081 Make it a separate section 2018-12-11 10:00:56 -08:00
Johannes Zellner fcfee9082b assert if the rest wrappers are misused 2018-12-11 18:55:25 +01:00
Johannes Zellner e6ad14f8d4 Rework the rest wrapper usage and add offline banner 2018-12-11 18:17:53 +01:00
Johannes Zellner 1670f15732 Use toplevel cert renewal api for all domains 2018-12-11 12:41:42 +01:00
Johannes Zellner 5cd696792b Improve inline update progress layout 2018-12-10 16:50:40 +01:00
Johannes Zellner fbc399f5fa sort services by name 2018-12-10 11:36:47 +01:00
Johannes Zellner 3d6413ae05 Finalize rename addon -> service 2018-12-10 11:36:47 +01:00
Girish Ramakrishnan 97120a6b04 Fixup update UI to use task id 2018-12-09 12:06:28 -08:00
Johannes Zellner 226162ee57 Give backup progress detail more horizontal space 2018-12-09 21:01:46 +01:00
Johannes Zellner a888ec265f Fix backup progress display layout 2018-12-09 20:59:32 +01:00
Girish Ramakrishnan 6fb7555f01 fix task logs 2018-12-08 21:58:23 -08:00
Girish Ramakrishnan a8d0e25866 Update task status by id 2018-12-08 21:17:36 -08:00
Girish Ramakrishnan 970f7fe69b Add flag for per-app automatic update 2018-12-07 09:38:55 -08:00
Girish Ramakrishnan c507df902e create recvmail mailbox automatically 2018-12-06 22:31:38 -08:00
Girish Ramakrishnan 7fa5ef8165 Do not filter out app mailboxes 2018-12-06 21:55:04 -08:00
Girish Ramakrishnan 92cb768c4b Fix reboot message 2018-12-06 10:12:21 -08:00
Johannes Zellner 8ec406c2e0 Hide empty memory usage bar for unsupported services 2018-12-06 14:32:39 +01:00
Johannes Zellner 9473c108f0 Support unbound logs in logviewer 2018-12-05 16:22:43 +01:00
Girish Ramakrishnan 14c43d9f7e Show error message directly 2018-12-04 14:12:35 -08:00
Girish Ramakrishnan ce9a03a5a8 Check updateStatus on ready 2018-12-04 14:05:55 -08:00
Johannes Zellner 04e8b14fc4 Give more space in the error page 2018-12-04 16:35:58 +01:00
Girish Ramakrishnan 43b747676c addon -> service
some day we will also add nginx, unbound etc here
2018-12-02 18:55:05 -08:00
Girish Ramakrishnan bd40cf9947 Move server below the addons
server restart will ideally be rarely used.
2018-12-02 18:51:34 -08:00
Girish Ramakrishnan 203b31d81f Handle split of addon and services 2018-12-02 18:45:33 -08:00
Girish Ramakrishnan 0430fb2772 rename addon route to services 2018-12-02 17:46:58 -08:00
Girish Ramakrishnan d3746d6859 Move system below support 2018-11-30 21:11:05 -08:00
Girish Ramakrishnan d8dfa89f87 rework update ui
- this is not modal anymore
- can be canceled
2018-11-30 20:55:37 -08:00
Girish Ramakrishnan cbdb90d06b do not use result 2018-11-30 20:22:53 -08:00
Girish Ramakrishnan 63e040ea79 Use active field instead of percent 2018-11-29 23:14:00 -08:00
Girish Ramakrishnan fd1a0f3b0a result is not used anymore in backup view 2018-11-29 23:00:30 -08:00
Johannes Zellner abaf8a676c Fix edit icons in settings and account view 2018-11-29 16:43:28 +01:00
Johannes Zellner 0b96fc4701 Use Cloudron style fallback icon 2018-11-29 12:04:56 +01:00
Johannes Zellner 400e210d37 Show memory usage for addons 2018-11-28 12:53:35 +01:00
Johannes Zellner ea0c697ad3 Make admins go to the docs in error.html 2018-11-27 10:48:31 +01:00
Johannes Zellner edf8c32a0f caas errorCodes in error.html are gone now 2018-11-26 20:05:55 +01:00
Johannes Zellner ccef5da7d9 Minor fixes to the error.html 2018-11-26 19:32:19 +01:00
Johannes Zellner ddf213aec4 Remove logs from support view, they are now in system view 2018-11-26 14:59:39 +01:00
Johannes Zellner 8bd9237951 Use addon log routes in logviewer 2018-11-26 14:49:50 +01:00
Johannes Zellner ae488312a1 Add ui bits to be able to reboot the server 2018-11-26 09:24:58 +01:00
Johannes Zellner 1ed45656e4 Rename addons view to system
We can rename the menu entry further but I wasn't sure if diagnostics
will be nicer. Diagnostics kinda overlaps with the graphs there and all
2018-11-26 08:59:31 +01:00
Johannes Zellner 07edcc5f94 Show notification if reboot is required 2018-11-26 08:48:58 +01:00
Johannes Zellner 1783059fd4 Better addon restart feedback 2018-11-22 22:12:00 +01:00
Johannes Zellner aab766e8ff Add button to reset addon memory to platform defaults 2018-11-21 17:06:01 +01:00
Johannes Zellner 158514f334 Replace addon start/stop with restart 2018-11-21 16:14:02 +01:00
Johannes Zellner 77d29c3728 Patch up the addon memory configuration 2018-11-21 15:57:26 +01:00
Johannes Zellner 3c3383ac03 Show memory config in list 2018-11-20 17:04:53 +01:00
Johannes Zellner 6e46240fd7 Add addon configure dialog 2018-11-20 17:01:46 +01:00
Johannes Zellner d01c46bfee Refresh addon status automatically 2018-11-20 14:47:39 +01:00
Johannes Zellner 1e5007ec8b Add logs button and set default action in repair dialog 2018-11-20 11:39:32 +01:00
Johannes Zellner deed95e9a9 Update progress needs to be checked some other way now 2018-11-20 11:36:17 +01:00
Johannes Zellner 082323511a Handle addon state correctly 2018-11-20 11:09:20 +01:00
Johannes Zellner c07224cab5 Fix tooltips 2018-11-20 11:09:20 +01:00
Johannes Zellner 1604a96f41 Support addon logs in logviewer 2018-11-20 11:09:20 +01:00
Johannes Zellner 50963f00c0 Add basic UI controls for start, stop, logs and show status 2018-11-20 11:09:20 +01:00
Johannes Zellner 699db93b18 Add initial addons view 2018-11-20 11:09:20 +01:00
Girish Ramakrishnan 85e467581c Use the new task API 2018-11-19 17:34:14 -08:00
Girish Ramakrishnan 42e4588e9c Fix backup route 2018-11-19 14:40:47 -08:00
Girish Ramakrishnan 93c194cff7 Add button to stop backup 2018-11-17 20:47:51 -08:00
Girish Ramakrishnan 00450dc048 Fix backup API routes 2018-11-17 20:47:51 -08:00
Johannes Zellner c319fd5862 Fix all animated spinners for new fontawesome 2018-11-16 17:03:21 +01:00
Johannes Zellner 5048b5b585 Fixup the twitter icon 2018-11-15 23:28:06 +01:00
Johannes Zellner e7f24084af Fixup all missed icons 2018-11-15 18:07:18 +01:00
Johannes Zellner c57b9b4fa3 Update fontawesome from v3 to v5 2018-11-15 17:42:29 +01:00
Girish Ramakrishnan ac5b7a4469 Add certificate.new event 2018-11-14 20:37:58 -08:00
Girish Ramakrishnan 884faa0e27 Add note on where to check cert status 2018-11-14 20:22:14 -08:00
Girish Ramakrishnan 50b4b7bb92 this event is no more 2018-11-14 11:20:11 -08:00
Girish Ramakrishnan cf259ace47 more events 2018-11-10 01:34:50 -08:00
Girish Ramakrishnan 270389a18c Add new domain events 2018-11-10 01:09:06 -08:00
Girish Ramakrishnan a340eea769 Add new mail events 2018-11-10 00:32:37 -08:00
Girish Ramakrishnan 22589e7103 Fix the checkbox 2018-11-09 11:24:19 -08:00
Girish Ramakrishnan 2b6423d3b7 Move the dyndns setting to the domains view 2018-11-09 10:37:50 -08:00
Girish Ramakrishnan 50bf193fd1 Hide "remote support" option for managed cloudrons 2018-11-06 21:50:10 -08:00
Girish Ramakrishnan c2ba059ced Remove the "not recommended" 2018-11-06 14:04:30 -08:00
Johannes Zellner 856ed0c765 Use config.managed for dyndns ui 2018-11-01 09:35:22 +01:00
Johannes Zellner a73681ce8b settings view is only available to admins no need to check here 2018-11-01 09:34:28 +01:00
Johannes Zellner 1426ed952b Hide dynamic dns settings for caas and non operators 2018-11-01 09:33:46 +01:00
Johannes Zellner d6bf6eb0a0 Add dynamic dns settings 2018-11-01 09:33:46 +01:00
Girish Ramakrishnan 97b24079f7 Show lock icon for locked domains 2018-10-31 11:01:10 -07:00
Girish Ramakrishnan 707f84839e typoe 2018-10-30 23:52:09 -07:00
Girish Ramakrishnan 643d2f3fad typo 2018-10-30 22:51:59 -07:00
Girish Ramakrishnan 92660e037d replace operatorActions with managed 2018-10-30 21:07:37 -07:00
Girish Ramakrishnan 2e6a0411fb Never show hyphenated feature for now 2018-10-30 20:52:03 -07:00
Girish Ramakrishnan 5d57a5fabb Use new setup route 2018-10-30 14:15:43 -07:00
Girish Ramakrishnan cb90ad803b provider is never empty anymore 2018-10-29 19:20:16 -07:00
Girish Ramakrishnan 937e8ce1ed Add the new exoscale-sos regions 2018-10-27 14:44:13 -07:00
Girish Ramakrishnan c1976d5b13 Cloudflare HTTP proxying works now 2018-10-26 15:03:27 -07:00
Girish Ramakrishnan 8070e88564 Add Certs to menu bar 2018-10-25 13:23:42 -07:00
Girish Ramakrishnan 15c0c691ff Add button to renew certs of a domain 2018-10-24 15:51:02 -07:00
Girish Ramakrishnan f68912b466 copy/paste error
(cherry picked from commit 53fed09a5d)
2018-09-26 22:30:38 -07:00
Girish Ramakrishnan dfa4e20a8f Set default cert provider to wildcard
Change it to non-wildcard for manual/noop/wildcard dns
2018-09-26 19:53:09 -07:00
Girish Ramakrishnan ee1a194305 Change the cert provider selection box text 2018-09-26 18:15:09 -07:00
Girish Ramakrishnan 0fa88855e5 Move information text out of advanced view 2018-09-26 18:10:21 -07:00
Girish Ramakrishnan eda3d5c143 Remove invalid dns config notification
The issue is that this value is never really updated unless the box
code is restarted.

Instead, we will fix it to check all domains periodically and send
some email notification.

Fixes cloudron/box#586
2018-09-26 15:13:44 -07:00
Girish Ramakrishnan b450efe5c2 Add SFO2 region in restore UI 2018-09-26 12:02:03 -07:00
Girish Ramakrishnan ca76626d55 Add checkbox UI for mailbox location
part of cloudron/box#587
2018-09-25 11:27:43 -07:00
Girish Ramakrishnan ed887953b6 typo 2018-09-12 20:19:40 -07:00
Girish Ramakrishnan 04debe3ea3 port80 requirement is more complex 2018-09-12 15:57:01 -07:00
Girish Ramakrishnan 4312096dd2 Add a wildcard provider option 2018-09-12 13:12:40 -07:00
Girish Ramakrishnan 94b079fa7b Show the title in port bindings instead of the long description 2018-09-12 11:22:02 -07:00
Girish Ramakrishnan 0373d86349 Fix error code 2018-09-10 11:22:29 -07:00
Girish Ramakrishnan 0f5c290785 we now return 424 2018-09-10 10:37:15 -07:00
Girish Ramakrishnan c79f43bb27 do spaces: sfo2 is now available 2018-09-10 09:27:08 -07:00
Girish Ramakrishnan 184ad3bc4e wildcard dns is now a provider 2018-09-06 20:12:25 -07:00
Girish Ramakrishnan aa0a4ae3e9 Handle locked domains 2018-09-05 23:23:27 -07:00
Girish Ramakrishnan ff9c4b407f Add help text 2018-09-05 21:46:26 -07:00
Girish Ramakrishnan c3b01d477e Typo 2018-09-05 21:31:44 -07:00
Girish Ramakrishnan 3c0641745b backups: Hide prefix for noop 2018-09-05 17:32:53 -07:00
Girish Ramakrishnan 7186a0c41b information text for hyphenated subdomain 2018-09-05 17:20:17 -07:00
Girish Ramakrishnan 4c3bc7450e domain: hide del button for admin domain 2018-09-05 17:15:30 -07:00
Girish Ramakrishnan 02f04e2d33 Disable various views for non-operators 2018-09-05 15:35:30 -07:00
Johannes Zellner 97b6e4c672 Just display subscription error message in the ui 2018-09-05 17:14:01 +02:00
Girish Ramakrishnan 2fd1caa2aa caas: Fix display of alternateDomain 2018-09-04 12:10:21 -07:00
Girish Ramakrishnan cb25217c48 Fix the edition name 2018-08-31 08:06:04 -07:00
Johannes Zellner ab70bc663d No need to show button to setup billing
Either it has a subscription or not, no trials anymore
This will not show any cc setup button now for other plans like
education
2018-08-29 23:24:24 +02:00
Johannes Zellner 0cfe931cd1 We do not have trials anymore 2018-08-29 23:22:47 +02:00
Girish Ramakrishnan 29bddb5fcb Fix derivation of adminFqdn 2018-08-28 22:35:02 -07:00
Girish Ramakrishnan cb7d160346 Add more backup interval secs 2018-08-28 22:10:17 -07:00
Girish Ramakrishnan 507c8b8786 Add hyphenatedSubdomains checkbox to setup page 2018-08-28 21:59:03 -07:00
Girish Ramakrishnan 60107147c2 derive features from edition 2018-08-28 21:58:59 -07:00
Girish Ramakrishnan be2afec86b spaces: Fix text 2018-08-28 20:32:07 -07:00
Girish Ramakrishnan d316d216db spaces: use edition instead of setting 2018-08-28 19:36:26 -07:00
Girish Ramakrishnan dd53d0d575 caas+spaces: location suffix fix 2018-08-28 14:22:40 -07:00
Girish Ramakrishnan 0f6c0a2ccd Use spaces suffix that replaces dots in username
This assumes usernames only have . or - but not both
2018-08-28 12:23:14 -07:00
Girish Ramakrishnan 937a165711 spaces: Strip the trailing username when configuring 2018-08-28 10:38:53 -07:00
Girish Ramakrishnan 22c402ca3d clone: subdomain hyphenation 2018-08-27 21:40:49 -07:00
Girish Ramakrishnan eddbd4fddc Do the filter later 2018-08-27 21:06:07 -07:00
Girish Ramakrishnan 0e43ca31a3 spaces: add username suffix when installing apps 2018-08-27 20:45:09 -07:00
Girish Ramakrishnan 9c90a20b4d Get token name as input 2018-08-27 16:04:16 -07:00
Girish Ramakrishnan 764e7e7d1f Fix indent 2018-08-27 15:40:23 -07:00
Girish Ramakrishnan 0e8cb00233 Display token name 2018-08-27 15:34:46 -07:00
Girish Ramakrishnan 0a1a011338 Move the API token to account page
The OAuth page is less and less useful. Moreover, the tokens are
actually tied to the user and not for the system.
2018-08-27 15:26:52 -07:00
Girish Ramakrishnan 3dfcd9324d invite -> setup link 2018-08-27 15:08:09 -07:00
Girish Ramakrishnan 3e4ac4a0ca Keep it short (and abstract) 2018-08-27 13:50:13 -07:00
Girish Ramakrishnan be1795d50d domains: make the certs setup more descriptive 2018-08-27 13:19:57 -07:00
Girish Ramakrishnan 0b0b06baa9 certs: Rename Self-Signed to custom 2018-08-27 12:04:55 -07:00
Girish Ramakrishnan b789cd2af0 Fix incorrect title of invitation dialog 2018-08-27 11:43:24 -07:00
Johannes Zellner 0871403c0a Support hyphenated subdomains in install and configure dialogs 2018-08-22 17:25:27 +02:00
Johannes Zellner 53a34d9352 Support hyphenatedSubdomains property in domains view 2018-08-22 11:54:37 +02:00
Girish Ramakrishnan fe23551b04 Show the doc link in the post install confirm body 2018-08-21 19:21:03 -07:00
Girish Ramakrishnan 484b6477d3 Fix duplicate id in app configure form 2018-08-20 09:44:30 -07:00
Girish Ramakrishnan 8ebe04c2ff Do not send invite email when invite button is pressed 2018-08-17 16:26:16 -07:00
Girish Ramakrishnan 672d6b0856 Add backup interval
Part of cloudron/box#568
2018-08-13 22:40:05 -07:00
Girish Ramakrishnan 0c066fafa2 remove backup default comment 2018-08-13 22:22:46 -07:00
Girish Ramakrishnan 6c574ead94 Make UDP ports configurable
Part of cloudron/box#504
2018-08-13 09:15:21 -07:00
Girish Ramakrishnan 31a62313bb Reconfigure email apps when email is enabled/disabled 2018-08-12 13:21:17 -07:00
Johannes Zellner 4dacf7064f Apps already use singular document tag 2018-08-06 22:22:49 +02:00
Johannes Zellner e900e4de77 Add Documents category 2018-08-06 21:46:24 +02:00
Girish Ramakrishnan 4ce6939b79 spaces: show based on plan id 2018-08-06 10:53:16 -07:00
Girish Ramakrishnan 8430fd1473 Fix more errors in clone UI 2018-08-06 00:46:10 -07:00
Girish Ramakrishnan ac7c54e273 Fix errors in the clone form 2018-08-06 00:34:40 -07:00
Girish Ramakrishnan 6c9a3b530d Display restore error on page load 2018-08-05 23:30:22 -07:00
Girish Ramakrishnan 2f2c70d1df Set the users when creating group 2018-08-05 22:19:54 -07:00
Girish Ramakrishnan a78c991330 Give some fixed width to the columns 2018-08-05 22:10:45 -07:00
Girish Ramakrishnan 8f9349ec53 Remove double "this" 2018-08-05 21:43:34 -07:00
Girish Ramakrishnan bc6be6a9ad Fix indent 2018-08-05 21:40:18 -07:00
Girish Ramakrishnan a9b7c2795a Fix styling 2018-08-05 21:34:47 -07:00
Girish Ramakrishnan cd81cc8cb8 Refine the text 2018-08-05 21:09:16 -07:00
Girish Ramakrishnan 473b35d807 Query backup config only for admins 2018-08-03 23:35:37 -07:00
Girish Ramakrishnan 0c04d5bfc8 spaces: fetch users/groups/domains 2018-08-03 23:27:21 -07:00
Girish Ramakrishnan eed460f435 Fetch complete app object for owner 2018-08-03 23:00:25 -07:00
Girish Ramakrishnan d742982973 spaces: default the access restriction to just the user 2018-08-03 22:51:53 -07:00
Girish Ramakrishnan c8263077a2 appstore app object has no location or accessRestriction 2018-08-03 22:29:52 -07:00
Girish Ramakrishnan eae01bdbd9 appId is not needed in configure route 2018-08-03 18:44:30 -07:00
Girish Ramakrishnan 1ebafbbc20 spaces: fixup user interface 2018-08-03 18:38:00 -07:00
Girish Ramakrishnan a525bb0257 Missed this 2018-08-03 17:47:02 -07:00
Girish Ramakrishnan cf5cf9e42f Remove usage of tokenScopes and caps 2018-08-03 10:13:57 -07:00
Girish Ramakrishnan 7969dff043 Add UI for enabling spaces 2018-08-03 09:44:56 -07:00
Girish Ramakrishnan d73f7304b3 Copy admin flag 2018-08-03 09:34:58 -07:00
Johannes Zellner 4400b0117a Fix linter issues 2018-08-02 22:17:27 +02:00
Johannes Zellner 739c91b1c6 Do not throw errors if a group has a uid which is not yet known
This can happen if the users have not yet loaded fully
2018-08-02 22:16:57 +02:00
Girish Ramakrishnan 510115ade9 Show danger color if update fails 2018-08-01 17:02:09 -07:00
Girish Ramakrishnan 8c2d79b75e Show app id in info dialog 2018-08-01 12:37:17 -07:00
Johannes Zellner 1a31fb78e5 Add homescreen icons for mobile 2018-07-30 22:05:20 +02:00
Girish Ramakrishnan 97f4d5e3ac Show busy indicator when toggling email 2018-07-30 11:30:49 -07:00
Girish Ramakrishnan d0b17f7e7b Delete any endpoint configuration when using s3 2018-07-30 07:29:22 -07:00
Girish Ramakrishnan eb74aaff3b Display restore errors
Part of cloudron/box#505
2018-07-29 20:48:37 -07:00
Girish Ramakrishnan 9108b665a8 restore: show encrytion field for rsync format 2018-07-29 19:51:44 -07:00
Girish Ramakrishnan e449147ed4 setup: Make it wider 2018-07-29 19:46:52 -07:00
Girish Ramakrishnan 53e82876dd setup: add link to hide advanced settings 2018-07-29 19:43:36 -07:00
Girish Ramakrishnan dd4a4518b3 Allow backup key to be set for rsync format
Part of #440
2018-07-28 09:13:42 -07:00
Girish Ramakrishnan a9e46c64b1 Show group members 2018-07-26 23:58:25 -07:00
Girish Ramakrishnan fb85770fd3 admin group is now gone 2018-07-26 23:42:38 -07:00
Girish Ramakrishnan 9e9e651714 admin is now simply a flag 2018-07-26 15:54:21 -07:00
Girish Ramakrishnan 314da7ace8 Fix API of Client.createUser 2018-07-26 15:52:10 -07:00
Girish Ramakrishnan 54103ca120 Revert role support 2018-07-26 11:38:20 -07:00
Girish Ramakrishnan be86a3022f Call the new setDnsRecords route 2018-07-25 10:52:06 -07:00
Girish Ramakrishnan 91ecab08da Fix typo 2018-07-24 22:40:27 -07:00
Girish Ramakrishnan cae445556e Allow groups to be set during user add 2018-07-24 22:38:53 -07:00
Girish Ramakrishnan 8c2af87857 Fix coding style 2018-07-24 22:31:22 -07:00
Girish Ramakrishnan 2d44e356d3 Add user multi-select to group edit dialog 2018-07-24 22:25:44 -07:00
Girish Ramakrishnan dec1931f07 Make groups a multiselect
With many groups, it overflows and very cluttered
2018-07-24 21:36:52 -07:00
Girish Ramakrishnan 46473c3756 Show displayName in user listing 2018-07-24 15:20:25 -07:00
Girish Ramakrishnan cd893edfcf Add display name to user edit 2018-07-24 15:17:51 -07:00
Girish Ramakrishnan 84302c1739 Fix the text 2018-07-24 14:38:47 -07:00
Girish Ramakrishnan d6f6b4bfe5 Display hostname in mail status
Many are copy/pasting the domain directly into the DNS UI and it fails.
2018-07-24 14:34:26 -07:00
Girish Ramakrishnan 8c6531b6fb Add Mailjet 2018-07-23 16:47:24 -07:00
Girish Ramakrishnan f4993a7e58 Change redirection text 2018-07-16 18:39:22 -07:00
Girish Ramakrishnan cc812c2177 Add user transfer event 2018-07-05 13:54:05 -07:00
Girish Ramakrishnan e11dc028d1 Transfer deleted user's resources 2018-07-05 13:44:00 -07:00
Johannes Zellner e314910a76 Ensure we uri encode the email query param for setup links 2018-07-04 11:10:13 +02:00
Johannes Zellner ee9140c365 Use the correct object to reset alternateDomains 2018-07-03 18:04:25 +02:00
Johannes Zellner ce4ccc21dd Set better defaults and placeholder text for alternate domains 2018-07-03 18:04:03 +02:00
Johannes Zellner 6108fcf17b Put the alternate domain settings behind a checkbox 2018-07-03 18:00:22 +02:00
Johannes Zellner cd3fb77033 Add support for one alternate domain which redirects 2018-06-29 23:42:13 +02:00
Johannes Zellner 0697274311 Remove very odd unused line 2018-06-29 23:42:13 +02:00
Girish Ramakrishnan 11f5aaaf3b Pass on the tokenScopes 2018-06-29 09:09:25 -07:00
Girish Ramakrishnan 8f0b66bd98 Rework config routes
The config route now returns non-sensitive information under the
profile scope.

Caas config is a separate route

Update config is a separate route
2018-06-28 17:50:33 -07:00
Girish Ramakrishnan 3be660dcd9 If user has no appstore scope, we cannot get subscription info 2018-06-27 18:15:48 -07:00
Girish Ramakrishnan 3bb82d5e68 Use app ts to determine whether to refetch app 2018-06-26 19:54:18 -07:00
Girish Ramakrishnan 3f9f1480d3 The uninstall id gets cleared 2018-06-26 19:47:48 -07:00
Girish Ramakrishnan 948c446362 typo 2018-06-26 19:47:48 -07:00
Girish Ramakrishnan 25f888e0d8 Get detailed app information if user can manage apps 2018-06-26 17:56:23 -07:00
Girish Ramakrishnan 98661de24e Fix error message display in configure dialog 2018-06-26 17:35:48 -07:00
Girish Ramakrishnan a833ceb737 Insert the app sorted into the cache 2018-06-26 17:12:55 -07:00
Girish Ramakrishnan b41d0379f0 Only refresh the individual app that is being managed 2018-06-26 10:22:38 -07:00
Girish Ramakrishnan df6da7dd1c logs: installedApps is not used 2018-06-26 10:21:43 -07:00
Girish Ramakrishnan 24ca5bc990 Refactor logic into _updateAppCache 2018-06-26 10:21:36 -07:00
Girish Ramakrishnan e3e62b8407 refresh immediately 2018-06-26 10:19:50 -07:00
Girish Ramakrishnan 0c98e6f4ca Mark it as internal function 2018-06-26 08:34:05 -07:00
Girish Ramakrishnan 6034121695 Make clone return data 2018-06-26 08:33:04 -07:00
Girish Ramakrishnan afe837e30a Remove used of Client.onApps 2018-06-25 20:15:24 -07:00
Girish Ramakrishnan f3cf640e21 terminal: use Client.getApp instead of refreshInstalledApps 2018-06-25 19:19:56 -07:00
Girish Ramakrishnan 8d98cefcca terminal: Remove unused dropdown logic 2018-06-25 19:10:26 -07:00
Girish Ramakrishnan bdf57a5c0a remove dead code 2018-06-25 19:10:00 -07:00
Girish Ramakrishnan 37f108d9f7 logs: remove dep on refreshInstalledApps 2018-06-25 18:58:11 -07:00
Girish Ramakrishnan 091663afe0 Add Client.getApp that uses REST API 2018-06-25 18:55:07 -07:00
Girish Ramakrishnan a77918bef9 Client.onReady has already loaded the app list 2018-06-25 18:27:40 -07:00
Girish Ramakrishnan f167714ea1 add note 2018-06-25 18:27:05 -07:00
Girish Ramakrishnan 1cab172169 Adapt UI logic to get user/group configuration for each user/group 2018-06-25 16:23:28 -07:00
Girish Ramakrishnan 35c3df5a18 Adapt UI logic to get domain configuration for each domain 2018-06-25 15:33:21 -07:00
Girish Ramakrishnan b9a6f46543 Check for 403 for incorrect password 2018-06-18 18:57:00 -07:00
Girish Ramakrishnan 12b1909c7a Add roles UI creating and editing a group 2018-06-18 18:48:54 -07:00
Girish Ramakrishnan 5bd57b6dbd lint 2018-06-18 18:34:19 -07:00
Girish Ramakrishnan 961220be3f tokenScope -> tokenScopes 2018-06-18 15:09:16 -07:00
Girish Ramakrishnan 4db703aeb1 Make the UI capability based 2018-06-17 18:24:45 -07:00
Girish Ramakrishnan cec1cc7086 scope -> tokenScope 2018-06-17 15:29:10 -07:00
Girish Ramakrishnan 2bacbe6701 caas: disable enable email button instead of hiding it 2018-06-16 11:28:13 -07:00
Girish Ramakrishnan 3c65d88c65 caas: disable editing managed domain 2018-06-16 11:22:41 -07:00
Girish Ramakrishnan 726a1c37cc caas: show the backups view, just not the configure button 2018-06-16 11:14:45 -07:00
Girish Ramakrishnan 63f2bbb253 wrong password is 401 2018-06-15 20:54:15 -07:00
Girish Ramakrishnan 7f11cc0daf add note 2018-06-15 17:16:50 -07:00
Girish Ramakrishnan f32884b3b2 Add button for backup logs 2018-06-15 09:55:19 -07:00
Johannes Zellner 97465c1bd8 Last one to open the terminal in a new tab from within the logs view 2018-06-15 17:03:00 +02:00
Johannes Zellner ce0a1ce38a Also open platform and email logs in a new tab instead of a window 2018-06-15 16:45:34 +02:00
Johannes Zellner f5060a0d4f Open logs and terminal in a new tab instead of a window 2018-06-15 16:42:04 +02:00
Johannes Zellner bb34c8a242 Ignore button clicks when post install is not yet confirmed
Angular does not remove the click handler on ng-disabled :-/
2018-06-15 13:39:33 +02:00
Johannes Zellner 34fd733bb7 Fix mouse cursor state in app grid 2018-06-15 13:39:07 +02:00
Johannes Zellner 19b65460ff Do not show postinstall if the app is not ready yet 2018-06-15 13:35:46 +02:00
Girish Ramakrishnan edf277fcaf Feedback API has moved to cloudron scope 2018-06-14 20:04:38 -07:00
Girish Ramakrishnan 9db334c2a4 Show backup notification in main.js instead 2018-06-14 12:59:25 -07:00
Johannes Zellner 1039d9c95e Remove postinstall message from the appstore view
This is now shown on first click
2018-06-14 16:07:29 +02:00
Johannes Zellner 37c8b2b57f Make the user confirm the post install message on first time clicking the app icon 2018-06-14 15:46:55 +02:00
Girish Ramakrishnan 461fb0144e Fix wording 2018-06-13 12:25:29 -07:00
Girish Ramakrishnan 60a9c60f40 Fix typo preventing email from getting enabled 2018-06-12 19:18:47 -07:00
Girish Ramakrishnan 869a6b5a51 Add email to setupLink 2018-06-12 17:59:04 -07:00
Girish Ramakrishnan 133e101f83 Fix download logs button 2018-06-12 14:50:18 -07:00
Girish Ramakrishnan 6ecadb2308 Remove unused readFileLocally 2018-06-12 14:33:19 -07:00
Girish Ramakrishnan 0d3ff81d6c Fix UI jumpiness 2018-06-12 14:24:17 -07:00
Girish Ramakrishnan e938886629 Add box logs to support view 2018-06-12 14:05:58 -07:00
Girish Ramakrishnan aa32055aa8 lint 2018-06-12 13:37:31 -07:00
Girish Ramakrishnan 59481c37bc Remove redundant user.admin check 2018-06-12 13:31:23 -07:00
Girish Ramakrishnan 0b868dad2d remove the thanks (it is a bug report) 2018-06-12 13:20:08 -07:00
Girish Ramakrishnan 3c063a2263 Remove one section since I want to add the logs section 2018-06-12 12:55:44 -07:00
Johannes Zellner f9750e237a We always allow app updates now 2018-06-12 17:46:07 +02:00
Johannes Zellner 908bb75fdc Only update the appstore profile if the root controller is still present 2018-06-12 17:31:52 +02:00
Girish Ramakrishnan a273827166 Make the name of the user non-optional 2018-06-11 14:22:02 -07:00
Girish Ramakrishnan 0cb96f4b03 Change password requirements text 2018-06-11 13:54:17 -07:00
Girish Ramakrishnan af7764253d Fix text 2018-06-11 11:29:31 -07:00
Girish Ramakrishnan af9652f7c8 Remove the email subscription requirement 2018-06-11 11:24:25 -07:00
Johannes Zellner e741ca9216 Support new platform log routes 2018-06-11 20:10:57 +02:00
Girish Ramakrishnan e3950c2fb0 Give user notification about how to resize 2018-06-08 12:22:45 -07:00
Girish Ramakrishnan 3eae49139c Create the terminal ws after fit()
part of cloudron/box#549
2018-06-08 12:04:12 -07:00
Girish Ramakrishnan 97f17916f9 mail: hide the status tab entirely for caas 2018-06-08 09:54:58 -07:00
Johannes Zellner ee0a25962b Show only featured apps first on appstore listing 2018-06-08 09:48:34 +02:00
Girish Ramakrishnan 55fb3b3b55 Fix various text 2018-06-07 19:42:13 -07:00
Johannes Zellner a58d9d1497 Have a better fallback for eventlog source 2018-06-07 23:04:26 +02:00
Johannes Zellner 801dbc9705 Only show terminal button in logs view for apps 2018-06-07 22:44:31 +02:00
Girish Ramakrishnan e3897c4c34 Make user confirm that they use an external disk 2018-06-07 11:36:55 -07:00
Girish Ramakrishnan 04dd8914cd Move logs button to separate section 2018-06-07 10:48:18 -07:00
Johannes Zellner c2651fd8f8 Remove backup related bits from the settings view 2018-06-07 16:30:40 +02:00
Johannes Zellner 27f760fdbf Add separate backups page 2018-06-07 14:22:48 +02:00
Johannes Zellner a74cf0b064 add logs viewer for email server 2018-06-07 11:40:50 +02:00
Girish Ramakrishnan e09d2db7e6 Fix layout on larger screen 2018-06-05 22:46:06 -07:00
Girish Ramakrishnan 28f183f450 Explicitly mark zone name as optional 2018-06-05 21:14:10 -07:00
Girish Ramakrishnan 5126b605f2 Remove redundant "This domain must be hosted" text
If anything we can add them as <sup> info links
2018-06-04 21:47:23 -07:00
Girish Ramakrishnan aaebdda9d6 Remove bizzare color 2018-06-04 21:46:29 -07:00
Girish Ramakrishnan af29a3f498 Remove redundant "This domain must be hosted" text 2018-06-04 21:44:15 -07:00
Girish Ramakrishnan 55b6773d88 Add labels to setup page as well 2018-06-04 21:39:09 -07:00
Girish Ramakrishnan 239ec86c4a Fix setupdns layout 2018-06-04 20:59:23 -07:00
Girish Ramakrishnan 13adca00d6 do not center restore page labels 2018-06-04 20:46:40 -07:00
Girish Ramakrishnan a76631ee3d Add labels
Poeple seem to forget wat those fields are for mid-way through filling
the form. The place holder stuff is not overly obvious apparently.

This makes it consistent with all our other UI nevertheless
2018-06-04 20:30:22 -07:00
Girish Ramakrishnan 7ac99f16cd Fallback -> Self-signed 2018-06-04 16:52:17 -07:00
Girish Ramakrishnan 3b6ca1c59d Fix spacing 2018-06-04 15:51:29 -07:00
Girish Ramakrishnan 3f55064c47 Fix name.com links 2018-06-04 10:13:47 -07:00
Girish Ramakrishnan 917bc2a88c Reduce the padding (like in configure dialog) 2018-05-30 10:08:36 -07:00
Johannes Zellner 85dfa1ccad Always show the restore and clone tabs 2018-05-30 15:13:05 +02:00
Johannes Zellner 606828da1d Show backup create button next to the tabs 2018-05-30 15:07:16 +02:00
Johannes Zellner a182d78566 Give busy feedback when the app clone is initiated 2018-05-29 22:53:51 +02:00
Johannes Zellner 0f294531d3 Do not show backup creation button if we still fetch backups 2018-05-29 22:48:42 +02:00
Johannes Zellner 9189532b83 Fix error reporting of restore form
angular does not attach form elements to the $scope when the DOM
elements are created dynamically!
2018-05-29 22:46:06 +02:00
Johannes Zellner c031253bd4 Use tabs instead of accordion for restore/clone ui 2018-05-29 22:05:18 +02:00
Johannes Zellner 11ae5d4832 Allow the user to setup a subscription when enabling email 2018-05-29 17:17:53 +02:00
Johannes Zellner 3251dc3d73 Show hint to setup subscription if more than allowed apps are installed 2018-05-28 20:26:24 +02:00
Girish Ramakrishnan a671e6acf7 Move the buttons to dialog footer 2018-05-28 10:05:57 -07:00
Girish Ramakrishnan 5ce658125c Make the text less verbose 2018-05-28 10:05:52 -07:00
Girish Ramakrishnan 1d88a935a5 Add clone UI
part of #248
2018-05-28 10:05:47 -07:00
Girish Ramakrishnan 8da07a16b9 dnsConfig is used incorrectly 2018-05-28 10:05:42 -07:00
Girish Ramakrishnan 7ce045ae51 Make it an accordion 2018-05-28 10:05:36 -07:00
Girish Ramakrishnan a3e253436e Allow setting app visibility for non-SSO apps
Fixes #532
2018-05-25 13:59:53 -07:00
Johannes Zellner 08955ce5a4 Do not show cryptic UTC timestamp format for backups 2018-05-25 13:56:15 +02:00
Johannes Zellner 57a4fa2d38 fix the restore dropdown and change some labels 2018-05-25 13:49:38 +02:00
Johannes Zellner 548e652ba2 Update the setup subscription dialog text 2018-05-25 13:39:04 +02:00
Girish Ramakrishnan e92cfae4d9 Fix error handling 2018-05-24 20:15:08 -07:00
Girish Ramakrishnan ed1320c937 Only send mailboxName if it changed 2018-05-24 16:29:36 -07:00
Girish Ramakrishnan abccffd05f Put domain in the mailbox name
part of cloudron/box#558
2018-05-24 16:05:27 -07:00
Girish Ramakrishnan c1106aa32e Save -> Configure 2018-05-24 15:54:50 -07:00
Girish Ramakrishnan a94f5daac9 Allow mailbox name to be configured
part of cloudron/box#558
2018-05-24 15:42:40 -07:00
Girish Ramakrishnan 9d9f16e948 Re-work the configure dialog 2018-05-24 14:13:00 -07:00
Girish Ramakrishnan 0b5bd0b4cd Another take on this layout 2018-05-24 13:43:25 -07:00
Girish Ramakrishnan caa59dd9a9 Better layout 2018-05-24 09:55:33 -07:00
Girish Ramakrishnan 423958dd0e Add links to appstore 2018-05-24 09:45:08 -07:00
Girish Ramakrishnan 6a90cf5102 Fix incoming email section a bit 2018-05-24 09:26:41 -07:00
Johannes Zellner 2d820a3005 Remove label about free trial 2018-05-24 15:23:33 +02:00
Johannes Zellner 7fff55a1ed Style the tab widget to fit our style 2018-05-24 15:17:44 +02:00
Girish Ramakrishnan 52d1d47030 Add setting for mail from validation
Fixes #454
2018-05-23 23:34:11 -07:00
Girish Ramakrishnan 7df1d388f0 ManageSieve is now STARTTLS 2018-05-23 23:15:17 -07:00
Girish Ramakrishnan a34f5f13da Remove panel headers since they appear very heavy 2018-05-23 22:12:09 -07:00
Girish Ramakrishnan bcc1e5f79c Make the email UI tabbed 2018-05-23 22:00:48 -07:00
Girish Ramakrishnan 44d32ea281 add app backup button
Fixes cloudron/box#497
2018-05-23 21:17:12 -07:00
Johannes Zellner 63e16c9bb8 Minor rewording to better fit the free tier 2018-05-22 19:17:14 +02:00
Girish Ramakrishnan 528be0e4c0 Remove redundant auto-update check button 2018-05-21 09:28:30 -07:00
Girish Ramakrishnan 0660a924b7 Add some spacing 2018-05-19 18:11:20 -07:00
Girish Ramakrishnan 6f29d5f3f6 explicitZone is gone 2018-05-19 17:28:43 -07:00
Girish Ramakrishnan 9903004af5 Remove trial expiry display 2018-05-18 22:30:39 -07:00
Girish Ramakrishnan 0c2b250901 Fix article 2018-05-18 12:08:19 -07:00
Girish Ramakrishnan 00f8e96dd2 Remove spurious > 2018-05-17 09:06:27 -07:00
Girish Ramakrishnan 267fa79164 Add advanced settings to setupdns 2018-05-15 16:24:09 -07:00
Girish Ramakrishnan 1528aa9d0c domain: add advanced view for zone name and cert provider 2018-05-15 15:39:43 -07:00
Girish Ramakrishnan 0cd6f7f2e7 Set text based on debugMode
Fixes cloudron/box#553
2018-05-15 12:13:31 -07:00
Johannes Zellner f05967d871 Fix terminal resize on window resize
This still does not update the terminal COLUMNS and ROWS
2018-05-15 18:31:54 +02:00
Girish Ramakrishnan 26087e1580 remove user/ from profile route 2018-05-13 21:51:13 -07:00
Girish Ramakrishnan 9275c4fbfd Fix display of error message in mailbox add 2018-05-11 11:16:38 -07:00
Johannes Zellner a2e03ccf7a Fix the dns check notification link 2018-05-11 11:05:28 +02:00
Johannes Zellner 6605a38eab Add scheduler addon dropdown to webterminal 2018-05-11 10:40:11 +02:00
Johannes Zellner 0a09d89684 Add name.com to setup dns 2018-05-09 18:44:03 +02:00
Johannes Zellner c0d4100dd1 Add name.com DNS provider 2018-05-09 12:24:46 +02:00
Girish Ramakrishnan 791f5af3e0 Fix scope use in logs.js and terminal.js 2018-05-07 14:48:52 -07:00
Girish Ramakrishnan ed57e701bc Revert "route53: set listHostedZonesByName property"
This reverts commit 07b428f051.

We can just do this in the backend entirely
2018-05-07 13:41:36 -07:00
Girish Ramakrishnan c678a9b6d7 lint 2018-05-07 13:18:51 -07:00
Girish Ramakrishnan 07b428f051 route53: set listHostedZonesByName property 2018-05-07 11:27:24 -07:00
Girish Ramakrishnan a1ab8b6aa8 reset the expect dns records on refresh 2018-05-06 23:47:38 -07:00
Girish Ramakrishnan a07848164c Show dialog when disabling email 2018-05-06 23:41:39 -07:00
Girish Ramakrishnan 1b1d4ee431 Add GoDaddy 2018-05-06 22:36:33 -07:00
Girish Ramakrishnan f8e5668c5c typo 2018-05-06 21:51:58 -07:00
Girish Ramakrishnan d8719626d9 Add UI for Gandi LiveDNS
Part of cloudron/box#235
2018-05-06 19:38:30 -07:00
Girish Ramakrishnan 3a06797de0 AppStore now returns 401 2018-05-06 19:38:30 -07:00
Girish Ramakrishnan b9d7149dbb Remove email domain logic from users view 2018-05-01 15:25:43 -07:00
Girish Ramakrishnan 72bbb4ec68 Use the scope to determine what the user has access to 2018-05-01 14:40:59 -07:00
Girish Ramakrishnan d9ec1be9b6 Get the user profile first to determine the scope 2018-05-01 14:19:05 -07:00
Girish Ramakrishnan ecddb6977a Use the version in the status API instead
This is because we want to get the user's profile as the first
thing to know the scopes
2018-05-01 14:15:12 -07:00
Girish Ramakrishnan 77220038a1 clients API has moved up a level 2018-05-01 11:08:34 -07:00
Girish Ramakrishnan 016f194271 typo 2018-04-29 18:02:48 -07:00
Girish Ramakrishnan e34fecee5e Pass scope and expiresAt as body params 2018-04-28 22:02:46 -07:00
Girish Ramakrishnan 7448dc5ec5 Capitalize 2018-04-28 10:19:21 -07:00
Girish Ramakrishnan bfd25a08c2 Use new route to query user apps 2018-04-26 20:07:53 -07:00
Girish Ramakrishnan 8861e61bdf profile routes have moved under /api/v1/user 2018-04-26 19:58:38 -07:00
Girish Ramakrishnan 049c2fca8a Make it a button 2018-04-26 09:58:45 -07:00
Girish Ramakrishnan 63df9df913 Add links to TOTP apps 2018-04-26 09:32:56 -07:00
Johannes Zellner 05b6740e07 Refresh the user profile on 2fa status change 2018-04-26 16:54:03 +02:00
Johannes Zellner 46aac0288c Add 2fa disable flow 2018-04-26 16:38:26 +02:00
Johannes Zellner 4ec0fbd33c Show 2fa status in accounts view 2018-04-26 16:32:43 +02:00
Johannes Zellner 7a24d5fdfa Add 2fa enabling flow to accounts view 2018-04-26 16:30:07 +02:00
Johannes Zellner 3f082ccace Fix typo 2018-04-26 14:49:14 +02:00
Girish Ramakrishnan a37fc3093a Add note to setup subscription 2018-04-26 01:19:48 -07:00
Johannes Zellner 4541940a76 Make the setup billing button more descriptive 2018-04-24 11:49:03 +02:00
Johannes Zellner 3017fe0c95 Remove (in trial) label 2018-04-24 11:47:47 +02:00
Johannes Zellner d3bf9a2478 Avoid further flickering of the subscription buttons 2018-04-24 11:47:00 +02:00
Johannes Zellner 7107672358 Fix trial badge flickering 2018-04-23 20:55:03 +02:00
Johannes Zellner 8519d6665e Add support for appstore 2fa setup 2018-04-22 18:52:37 +02:00
Girish Ramakrishnan 774c9e435e Make it 1.5 since we have some swap to work with 2018-04-19 19:20:45 -07:00
Girish Ramakrishnan e1f35a8d9f Fix wording 2018-04-18 12:40:30 -07:00
Johannes Zellner 67136e418c Encode the email query argument
This is required to correctly transfer characters like +
2018-04-18 21:29:40 +02:00
Johannes Zellner 924cc997aa Hide cloudron.io account section in settings if it is not yet registered 2018-04-18 21:18:31 +02:00
Johannes Zellner 12eda5f507 Improve subscription indicator
We now don't show anything when the cloudron is still in trial period
but the user already has setup billing
2018-04-18 17:56:04 +02:00
Girish Ramakrishnan 96bb979abf Add CRM category 2018-04-17 16:28:31 -07:00
Girish Ramakrishnan f74ad0323c Fix README title 2018-04-17 09:39:32 -07:00
Girish Ramakrishnan 62fd73f1b1 Fix link 2018-04-17 09:39:02 -07:00
Johannes Zellner 44f027eb04 remove unused require 2018-04-15 11:00:25 +02:00
Johannes Zellner c9cf6d610b Revision is not part of OAuth credentials 2018-04-15 11:00:01 +02:00
Johannes Zellner 16d4d28046 Be consistent and make domain list entries edit on click 2018-04-13 21:50:21 +02:00
Johannes Zellner 2280008029 Give a lot more backlog for the app logs 2018-04-13 13:13:51 +02:00
Johannes Zellner a36439314d Fix logviewer autoscroll for chrome
Chrome does not support the scrollTopMax property
2018-04-13 13:12:32 +02:00
Johannes Zellner 290b44fbb7 Fixup catchall to use mailboxes instead of users 2018-04-12 13:02:32 +02:00
Johannes Zellner 404c280595 Catchall property is now addresses 2018-04-12 12:37:32 +02:00
Johannes Zellner b0f8370a31 Make copies of mailbox properties to work with in edit dialog
This avoids local data model updates in the UI on dialog cancel
2018-04-12 12:26:54 +02:00
Johannes Zellner 6abcf4ec3c Remove left over artifacts from inline edit mode 2018-04-12 12:15:23 +02:00
Johannes Zellner db6d7bcefb Refresh the mailinglists on edit 2018-04-12 12:12:22 +02:00
Johannes Zellner 0e1913b0b4 Handle corner case, where mailbox referenced in mailinglist got removed 2018-04-12 12:12:11 +02:00
Johannes Zellner cc6b097dc5 Use a copy of the mailinglist properties on edit 2018-04-12 12:02:20 +02:00
Johannes Zellner c4f7a0c857 Ensure new mailboxes appear in maillinglist options 2018-04-12 11:57:15 +02:00
Johannes Zellner 34187d76b6 Update Chart.js to new version and show full fqdn for apps 2018-04-12 11:45:18 +02:00
Girish Ramakrishnan 87e7e9fa07 Add header to mailing list delete dialog 2018-04-11 19:04:26 -07:00
Girish Ramakrishnan 8643fbb65c Fix typo in mailbox delete dialog 2018-04-11 18:49:41 -07:00
Johannes Zellner 6a2846afeb Show full fqdn for apps in graphs 2018-04-11 19:19:05 +02:00
Johannes Zellner 7bfa23e2b1 Prevent email hash change listener to kick-in on view change 2018-04-11 12:16:44 +02:00
Girish Ramakrishnan bcd55972cd Remove many breaks
When email is disabled, there is just lots of empty space
2018-04-10 14:23:10 -07:00
Johannes Zellner d75e1d04b3 Do not use the same DOM element id twice 2018-04-10 18:05:35 +02:00
Johannes Zellner 02ef77398a Remove now unused apiOriginHostname variable from gulpfile 2018-04-10 18:00:18 +02:00
Johannes Zellner b0b19053a7 We now set the csp headers from nginx
This makes it easier to also support local development on non https
2018-04-10 17:59:46 +02:00
Johannes Zellner 5cc298555a Ensure assets have proper tag attributes and always source from / 2018-04-10 14:49:49 +02:00
Johannes Zellner f2a0dcca31 Cleanup some linter errors and usused classes 2018-04-10 14:49:20 +02:00
Johannes Zellner c274e60868 Remove unused noapp.html 2018-04-10 14:31:37 +02:00
Johannes Zellner bde6ef8797 Make new mailbox/list buttons large but give some space on the bottom 2018-04-10 14:11:16 +02:00
Johannes Zellner df15f63424 Remove unneccessary dashboard/ subfolder 2018-04-10 13:28:55 +02:00
Johannes Zellner 1bd4a0aa8e git ignore node_modules/ 2018-04-10 13:12:46 +02:00
Johannes Zellner f068ce4e85 Add package.json for gulp dependencies to build assets 2018-04-10 13:12:46 +02:00
Girish Ramakrishnan 20093c581c Make the button small instead 2018-04-09 15:37:05 -07:00
Girish Ramakrishnan 814d7bafa8 Remove the content-large to keep all views same size 2018-04-09 14:55:35 -07:00
Girish Ramakrishnan e07fac0335 Fix wording 2018-04-09 12:59:38 -07:00
Girish Ramakrishnan 39730c71ce Move buttons to top right 2018-04-09 12:29:00 -07:00
Johannes Zellner 8565130166 Allow deeplinking of domains into email view 2018-04-09 18:00:08 +02:00
Johannes Zellner 9acde7fe86 Add error feedback when mailbox name is already taken 2018-04-09 16:21:32 +02:00
Johannes Zellner 63e43e8d20 Move new mailinglist form to a dialog 2018-04-09 16:12:18 +02:00
Johannes Zellner 10a3af8e5e Ensure autofocus on dialog open 2018-04-09 15:58:25 +02:00
Johannes Zellner 14536febaf Move mailbox add form to dialog 2018-04-09 15:56:20 +02:00
Johannes Zellner 75b597418c Do not list app mailboxes 2018-04-09 15:45:54 +02:00
Johannes Zellner 435730470b Fix indentation 2018-04-09 15:08:05 +02:00
Johannes Zellner 689ddf6875 edit mailinglists with a dialog instead of inline 2018-04-09 15:01:12 +02:00
Johannes Zellner fa550f57b3 Style the alias input and fix some typos 2018-04-09 12:54:25 +02:00
Johannes Zellner b9b84b661a Remove unused css classes and make all mailbox lines edit on click 2018-04-09 12:49:25 +02:00
Johannes Zellner b7573f449f Remove mailbox inline editing 2018-04-09 12:45:00 +02:00
Johannes Zellner 69f6895bd6 Move mailbox edit to dialog 2018-04-09 12:42:14 +02:00
Johannes Zellner 72a1e0d5ca No need to console.error() if we show the error in the ui already 2018-04-06 16:58:46 +02:00
Johannes Zellner 4eb80eedc0 Avoid reflow of the ui when buttons are shown/hidden 2018-04-06 16:58:27 +02:00
Johannes Zellner 32e6931b46 Remove console.log()s 2018-04-06 16:56:19 +02:00
Johannes Zellner f60258ed71 Add mailbox add error handling 2018-04-06 16:51:57 +02:00
Johannes Zellner 32454ba64a Give the mailbox listing more space 2018-04-06 16:48:04 +02:00
Johannes Zellner de212f49c2 Fixup the mailinglist crud ui 2018-04-06 16:43:43 +02:00
Johannes Zellner c308bd90cb Ensure at least the index application assets are versioned for proper refresh 2018-04-06 00:11:08 +02:00
Johannes Zellner 593bde9d92 Ensure the main controller is aware of the newly setup subscription 2018-04-05 23:27:39 +02:00
Johannes Zellner a16bd7030a Fix the configure/select plan button in the settings 2018-04-05 23:27:14 +02:00
Johannes Zellner 4d248bce39 Give appstore login form more space on the bottom 2018-04-05 22:03:40 +02:00
Johannes Zellner e236264848 Fetch subscription directly after the cloudron was registered to update the ui 2018-04-05 21:49:15 +02:00
Johannes Zellner 20e9877fe9 Give mail view more horizontal space 2018-04-05 21:24:29 +02:00
Johannes Zellner b0c4021d17 Add mailbox delete ui 2018-04-05 21:22:07 +02:00
Johannes Zellner 01bfd84853 Fixup the mailbox edit logic 2018-04-05 21:15:02 +02:00
Johannes Zellner a0dbcc9bb3 Add ui bits to add mailboxes 2018-04-05 21:00:33 +02:00
Johannes Zellner bbe351161f Adjust mailbox wrapper functions 2018-04-05 14:02:56 +02:00
Girish Ramakrishnan 968f515679 Enter works (no need for comma) 2018-04-02 09:27:17 -07:00
Girish Ramakrishnan cbb5cb3702 your -> this 2018-04-02 09:24:24 -07:00
Girish Ramakrishnan 82ed1881ea Remove the mailboxes text 2018-04-02 09:23:29 -07:00
Johannes Zellner 4d13d309d3 Handle reserved alias errors 2018-04-02 15:01:01 +02:00
Johannes Zellner 75eae0d8ec Make asyncForEach available globally to reduce code duplication 2018-04-02 11:35:02 +02:00
Johannes Zellner c329541708 Remove mailinglist handling in users/groups view 2018-04-01 23:10:47 +02:00
Johannes Zellner 10b8e93713 Add mailinglist ui in the mail view 2018-04-01 22:42:21 +02:00
Johannes Zellner 963b1d60b5 Remove mailbox settings from user edit dialog 2018-04-01 20:53:49 +02:00
Johannes Zellner 158271de14 Add alias error reporting 2018-04-01 20:31:16 +02:00
Johannes Zellner baba63889d Add logic to set mailbox aliases 2018-04-01 19:12:06 +02:00
Johannes Zellner d52273a516 move mailbox and catchall sections above relay 2018-04-01 19:11:46 +02:00
Johannes Zellner 1b7556443f Add user table to manage mailboxes per domain
This does not yet handle the aliases
2018-03-30 18:34:00 +02:00
Johannes Zellner 9575a1158a Add user listing to mail view to manage per user mailboxes 2018-03-30 18:06:40 +02:00
Johannes Zellner 8ebcc2f8af Immediately check for new configuration after we check for updates 2018-03-30 15:29:45 +02:00
Johannes Zellner 8d6de76fa0 Show update button and dialog in settings view 2018-03-30 15:12:34 +02:00
Johannes Zellner 0ad813cc8d Move update button into notification instead of pill 2018-03-30 15:12:14 +02:00
Johannes Zellner 63ae9a90cf ensure we call the callback 2018-03-28 14:32:21 +02:00
Johannes Zellner 551912145e Refetch the subscription also on the main controller 2018-03-28 14:19:34 +02:00
Johannes Zellner 611f54c237 LICENSE EXPIRED looks quite harsh 2018-03-28 14:18:58 +02:00
Johannes Zellner 60c9f49b44 Show distinct setup billing button in settings 2018-03-28 12:41:20 +02:00
Johannes Zellner 9f66003755 Show trial state in settings view next to plan name 2018-03-28 12:29:37 +02:00
Johannes Zellner 862e1d94be Remove dead notification code 2018-03-28 12:26:53 +02:00
Johannes Zellner 8196f76847 Show different subscription bubbles based on the billing and subscription status 2018-03-28 12:26:24 +02:00
Johannes Zellner 09f1bb4653 Add alias error reporting 2018-03-27 20:19:17 +02:00
Johannes Zellner f626a1f0b7 Fixup all other async occurances 2018-03-27 19:40:20 +02:00
Johannes Zellner fd609d3e19 Fix poor man's async to break on and report errors 2018-03-27 19:38:09 +02:00
Johannes Zellner 977e83cc22 Do not send empty aliases 2018-03-27 18:34:41 +02:00
Johannes Zellner 59b3cabf7e parent.getSubscription() does not exist anymore 2018-03-26 15:22:39 +02:00
Johannes Zellner 4d85c36c16 Show app message if any on status label hover 2018-03-26 11:08:57 +02:00
Girish Ramakrishnan b762f80812 typo 2018-03-22 12:16:16 -07:00
Girish Ramakrishnan 4e0791eb22 Fix gulpfile to handle rename 2018-03-15 14:32:48 -07:00
Girish Ramakrishnan 392e6d1c98 fix gitignore 2018-03-15 14:25:08 -07:00
Girish Ramakrishnan 5a49a555ad we use the package files from the box repo 2018-03-15 14:24:21 -07:00
Girish Ramakrishnan d59cb63188 move files to dashboard/ 2018-03-15 14:23:51 -07:00
Johannes Zellner 1d0f87f408 Avoid reflow on settings page while fetching current subscription 2018-03-14 23:30:42 +01:00
Johannes Zellner a26264e8ce Remove usage of obsolete undecided subscription plan 2018-03-14 23:28:36 +01:00
Johannes Zellner ed716d7569 Sync the text what a subsription offers 2018-03-14 22:34:57 +01:00
Johannes Zellner f85fca1720 An update is actually a positive action 2018-03-14 20:38:17 +01:00
Johannes Zellner ed2539cbfc Change update dialog title and include version 2018-03-14 20:37:39 +01:00
Johannes Zellner 5405338d20 Remove redundant if condition 2018-03-14 20:10:48 +01:00
Johannes Zellner f8ad2fdc11 currentSubscription is not required anymore 2018-03-14 19:53:36 +01:00
Johannes Zellner a618f2b523 Make update button dependent on the sourceTarballUrl instead of the subscription type 2018-03-14 19:53:36 +01:00
Girish Ramakrishnan 8b5a88ba5e Remove break and just use some margin 2018-03-14 09:09:42 -07:00
Girish Ramakrishnan db9e3b44a1 Revert "Show all apps inactive and blurred in the background of the appstore login form"
This reverts commit b9d6c8f8bb.
2018-03-14 09:04:05 -07:00
Girish Ramakrishnan 634408d3a3 Fix the email instructions 2018-03-13 23:16:15 -07:00
Girish Ramakrishnan 529a668db3 Fix eventlog display 2018-03-13 22:03:25 -07:00
Girish Ramakrishnan c0f01da1cd Make it FREE TRIAL instead 2018-03-13 13:38:19 -07:00
Girish Ramakrishnan 4cbab59fdb Fix the setup billing link 2018-03-13 13:30:33 -07:00
Girish Ramakrishnan ec9c9fb0f5 Fix the subscription dialog text 2018-03-13 13:23:22 -07:00
Girish Ramakrishnan 286d634756 always require terms 2018-03-13 11:06:49 -07:00
Girish Ramakrishnan ca2457bfcb smallcase the Account 2018-03-13 11:00:41 -07:00
Girish Ramakrishnan 459cafdf56 Add description text during signup 2018-03-13 10:59:15 -07:00
Johannes Zellner b9d6c8f8bb Show all apps inactive and blurred in the background of the appstore login form 2018-03-13 10:50:03 +01:00
Johannes Zellner 2da019556b Improve and center appstore login form 2018-03-13 10:21:25 +01:00
Johannes Zellner cbd28bc12f Attempt to better position checkboxes 2018-03-13 10:16:31 +01:00
Johannes Zellner 4332f60cc4 Use the admin domain as the default when installing a new app 2018-03-13 09:38:55 +01:00
Girish Ramakrishnan 950179ee1c Just link to docs instead 2018-03-13 00:29:10 -07:00
Girish Ramakrishnan 803eb4760e Make text clearer 2018-03-13 00:24:33 -07:00
Girish Ramakrishnan 32a41e6c1c Clarify that users need a mailbox to access 2018-03-12 15:49:11 -07:00
Girish Ramakrishnan de195c461b make it text-info 2018-03-12 15:04:37 -07:00
Girish Ramakrishnan 5003a8ea4d Make it text-info for the underline to show 2018-03-12 14:17:58 -07:00
Girish Ramakrishnan caa41b0022 Fix the text to handle multi-domain email 2018-03-12 13:57:50 -07:00
Johannes Zellner c7151d2b8d Reduce newlines 2018-03-12 19:08:15 +01:00
Johannes Zellner 0929ae1a4c Remove unused app feedback dialog 2018-03-12 19:08:05 +01:00
Johannes Zellner 0c79c42c10 Use forum links for missing apps 2018-03-12 19:06:15 +01:00
Girish Ramakrishnan 028b24db03 Don't make the whole dialog red 2018-03-09 15:02:30 -08:00
Johannes Zellner bce3d3f664 Use fqdn instead of location for naked domain apps 2018-03-09 10:17:01 +01:00
Girish Ramakrishnan 828d6f6cc8 Show the provider and format for caas 2018-03-09 00:40:55 -08:00
Girish Ramakrishnan 0a026cc143 Display caas as Managed Cloudron 2018-03-09 00:37:20 -08:00
Girish Ramakrishnan 3bc9a87933 Fix display of caas domain 2018-03-09 00:29:00 -08:00
Girish Ramakrishnan 769f9adc9d Update mail domain when domain is updated 2018-03-08 18:06:50 -08:00
Johannes Zellner b5f53d921e Replace app-request link to point to the new forum 2018-03-08 21:46:16 +01:00
Girish Ramakrishnan 105e9e7825 Use the new app update pattern 2018-03-06 21:30:42 -08:00
Girish Ramakrishnan c8cf050156 Keep it alphabetical 2018-03-05 10:28:22 -08:00
Girish Ramakrishnan b7baafbbe6 actions -> events
also make it all past tense
2018-03-05 10:17:44 -08:00
Girish Ramakrishnan 85dde71ec3 fix display of undefined id
remove id display altogether, it's not very interesting to see it
2018-03-05 10:09:06 -08:00
Girish Ramakrishnan 2970b086a3 Updates -> App Updates 2018-03-05 09:39:03 -08:00
Johannes Zellner 5910709008 Use the correct model attribute for appId in feedback form 2018-03-05 17:10:00 +01:00
Johannes Zellner 2b6ce4f813 Reduce feedback form options and add ability to specify failing app 2018-03-05 12:54:09 +01:00
Johannes Zellner 451c697fb7 Show email as fallback when a user has no username yet 2018-03-05 12:14:20 +01:00
Johannes Zellner 09149318b1 Better format the multiselect element 2018-03-05 12:10:17 +01:00
Johannes Zellner d2d8eb9485 Allow to select multiple actions in the eventlog filter 2018-03-05 12:03:02 +01:00
Johannes Zellner 91265613a9 Prettify eventlog source display 2018-03-02 19:21:24 +01:00
Johannes Zellner 31c414bbe1 Use more readable datetime tooltip format in activity log 2018-03-02 18:58:49 +01:00
Johannes Zellner e2a3654ed7 Give the time more space in the activity log 2018-03-02 18:50:49 +01:00
Johannes Zellner 96d7283534 Do not alternate the background color of the activity log 2018-03-02 18:50:32 +01:00
Girish Ramakrishnan 256a7e322b Keep it all to two words 2018-03-02 09:12:53 -08:00
Johannes Zellner e5b78337ac Show more readable user event data 2018-03-02 13:42:24 +01:00
Johannes Zellner 67ba5aa1c5 fix indentation 2018-03-02 13:19:57 +01:00
Johannes Zellner 848a617f98 Make eventlog entries expandable to show raw event data 2018-03-02 10:50:05 +01:00
Johannes Zellner 1fc7efef0d Improve app related eventlog display 2018-03-02 10:49:46 +01:00
Girish Ramakrishnan 576f6eafbb Rename Chat to Forum 2018-03-01 13:40:10 -08:00
Girish Ramakrishnan 2caf73b5e3 Do not list mail domains and aliases if username is not available 2018-02-28 15:21:42 -08:00
Girish Ramakrishnan 56abb68e0c Link admin link to docs 2018-02-28 13:40:06 -08:00
Girish Ramakrishnan 7aaac5a48a reword email address on domains 2018-02-28 13:26:15 -08:00
Girish Ramakrishnan 8326587886 Give indication that the test is for the relay 2018-02-27 09:24:36 -08:00
Girish Ramakrishnan 466b3f4784 Make the user edit dialog say "Primary email" 2018-02-24 16:42:15 -08:00
Girish Ramakrishnan bccdf548a8 Fix typo making the MX records hidden 2018-02-23 17:04:38 -08:00
Girish Ramakrishnan fa4b1b3d5b Add note that user and group mailboxes must be enabled 2018-02-23 17:02:18 -08:00
Girish Ramakrishnan 9d47fd198f replace chat with forum 2018-02-23 15:53:23 -08:00
Girish Ramakrishnan 5966ee6800 replace terms link with license 2018-02-23 15:25:27 -08:00
Johannes Zellner 2d20e3c13d Scroll to top on category activation 2018-02-23 11:34:39 -08:00
Johannes Zellner 2172f8532d Rework the appstore category list 2018-02-23 11:34:27 -08:00
Johannes Zellner 9dc4318152 Reduce category item size 2018-02-23 11:34:04 -08:00
Johannes Zellner e1a92e7127 Make primary email labels explicit 2018-02-23 10:29:09 -08:00
Girish Ramakrishnan 767b31caa2 Display the pretty domain provider name in the table
This is especially needed to distinguish wildcard/manual.
2018-02-21 10:14:17 -08:00
Johannes Zellner c2232936e0 Replace chat with forum in the support page 2018-02-20 11:55:57 -08:00
Johannes Zellner 4f1bbfd9e3 Make it clear that support ssh button should be enabled only if we ask the user to do so 2018-02-20 11:27:12 -08:00
Johannes Zellner caf57e37dc Add eventlog groups for apps and users 2018-02-20 11:13:51 -08:00
Johannes Zellner 64b8e4ad6c Shorten app ids in eventlog 2018-02-19 01:56:12 -08:00
Johannes Zellner c9d3907124 Add missing whitespace 2018-02-19 01:56:12 -08:00
Girish Ramakrishnan bf6bea800b Add note that user/group mailboxes must be enabled 2018-02-18 12:04:37 -08:00
Johannes Zellner 26f1673d47 Show full fqdn on app grid item hover 2018-02-17 16:01:36 -08:00
Johannes Zellner 08153454a2 Show tooltips immediately for app actions to guide the user 2018-02-09 10:11:23 +01:00
Girish Ramakrishnan efc26ab587 Specify which domain mail should be enabled for 2018-02-08 19:08:00 -08:00
Girish Ramakrishnan e24e0a7e87 br was removed by mistake in 23bc267c46 2018-02-08 15:25:37 -08:00
Johannes Zellner 23bc267c46 Show full fqdn in apps grid for now instead of the domain on the top 2018-02-08 16:17:47 +01:00
Johannes Zellner 35cc592d61 Remove altDomain ui bits 2018-02-08 09:44:35 +01:00
Girish Ramakrishnan 512f6a1166 Remove obsolete action 2018-02-06 23:14:37 -08:00
Johannes Zellner 3160ffec3f The update schedule is only set for the apps now 2018-02-06 19:39:06 +01:00
Johannes Zellner c543d4517f Adjust to new autoupdate pattern rest apis 2018-02-06 19:25:06 +01:00
Girish Ramakrishnan d7334b991b Add DO SGP1 2018-02-05 11:06:40 -08:00
205 changed files with 23884 additions and 25083 deletions
+1 -4
View File
@@ -1,9 +1,6 @@
dist/
node_modules/
coverage/
webadmin/dist/
installer/src/certs/server.key
# vim swap files
*.swp
-8
View File
@@ -1,8 +0,0 @@
{
"node": true,
"browser": true,
"unused": true,
"globalstrict": true,
"predef": [ "angular", "$" ],
"esnext": true
}
+1 -1
View File
@@ -1,5 +1,5 @@
The Cloudron Subscription license
Copyright (c) 2018 Cloudron UG
Copyright (c) 2019 Cloudron UG
With regard to the Cloudron Software:
+4 -4
View File
@@ -1,4 +1,4 @@
# Cloudron
# Cloudron Dashboard
[Cloudron](https://cloudron.io) is the best way to run apps on your server.
@@ -29,7 +29,7 @@ anyone to effortlessly host web applications on their server on their own terms.
* Trivially migrate to another server keeping your apps and data (for example, switch your
infrastructure provider or move to a bigger server).
* Comprehensive [REST API](https://cloudron.io/documentation/developer/api/).
* Comprehensive [REST API](https://cloudron.io/developer/api/).
* [CLI](https://cloudron.io/documentation/cli/) to configure apps.
@@ -37,7 +37,7 @@ anyone to effortlessly host web applications on their server on their own terms.
## Demo
Try our demo at https://my-demo.cloudron.me (username: cloudron password: cloudron).
Try our demo at https://my.demo.cloudron.io (username: cloudron password: cloudron).
## Installing
@@ -59,6 +59,6 @@ the containers in the Cloudron.
## Community
* [Chat](https://chat.cloudron.io/)
* [Forum](https://forum.cloudron.io/)
* [Support](mailto:support@cloudron.io)
+145 -154
View File
@@ -7,242 +7,233 @@ var argv = require('yargs').argv,
concat = require('gulp-concat'),
cssnano = require('gulp-cssnano'),
ejs = require('gulp-ejs'),
execSync = require('child_process').execSync,
gulp = require('gulp'),
rimraf = require('rimraf'),
sass = require('gulp-sass'),
serve = require('gulp-serve'),
sourcemaps = require('gulp-sourcemaps'),
uglify = require('gulp-uglify'),
url = require('url');
sourcemaps = require('gulp-sourcemaps');
gulp.task('3rdparty', function () {
gulp.src([
'webadmin/src/3rdparty/**/*.js',
'webadmin/src/3rdparty/**/*.map',
'webadmin/src/3rdparty/**/*.css',
'webadmin/src/3rdparty/**/*.otf',
'webadmin/src/3rdparty/**/*.eot',
'webadmin/src/3rdparty/**/*.svg',
'webadmin/src/3rdparty/**/*.gif',
'webadmin/src/3rdparty/**/*.ttf',
'webadmin/src/3rdparty/**/*.woff',
'webadmin/src/3rdparty/**/*.woff2'
])
.pipe(gulp.dest('webadmin/dist/3rdparty/'));
if (argv.help || argv.h) {
console.log('Supported arguments for "gulp develop":');
console.log(' --api-origin <cloudron api uri>');
console.log(' --revision <revision>');
console.log(' --appstore-web-origin <appstore web uri>');
console.log(' --appstore-api-origin <appstore api uri>');
gulp.src('node_modules/bootstrap-sass/assets/javascripts/bootstrap.min.js')
.pipe(gulp.dest('webadmin/dist/3rdparty/js'));
process.exit(1);
}
const revision = argv.revision || '';
let apiOrigin = '';
if (argv.apiOrigin) {
if (argv.apiOrigin.indexOf('https://') === 0) apiOrigin = argv.apiOrigin;
else apiOrigin = 'https://' + argv.apiOrigin;
}
var appstore = {
webOrigin: argv.appstoreWebOrigin || '',
apiOrigin: argv.appstoreApiOrigin || ''
}
console.log();
console.log('Cloudron API: %s', apiOrigin || 'default');
console.log('Building for revision: %s', revision);
console.log();
console.log('Overriding appstore origin:');
console.log(' Website: %s', appstore.webOrigin || 'no');
console.log(' Api: %s', appstore.apiOrigin || 'no');
console.log();
gulp.task('fontawesome', function () {
return gulp.src([
'node_modules/@fortawesome/fontawesome-free/*css*/all.min.css',
'node_modules/@fortawesome/fontawesome-free/*webfonts*/*.eot',
'node_modules/@fortawesome/fontawesome-free/*webfonts*/*.svg',
'node_modules/@fortawesome/fontawesome-free/*webfonts*/*.ttf',
'node_modules/@fortawesome/fontawesome-free/*webfonts*/*.woff',
'node_modules/@fortawesome/fontawesome-free/*webfonts*/*.woff2'
]).pipe(gulp.dest('dist/3rdparty/fontawesome/'));
});
gulp.task('bootstrap', function () {
return gulp.src('node_modules/bootstrap-sass/assets/javascripts/bootstrap.min.js')
.pipe(gulp.dest('dist/3rdparty/js'));
});
gulp.task('3rdparty-copy', function () {
return gulp.src([
'src/3rdparty/**/*.js',
'src/3rdparty/**/*.map',
'src/3rdparty/**/*.css',
'src/3rdparty/**/*.otf',
'src/3rdparty/**/*.eot',
'src/3rdparty/**/*.svg',
'src/3rdparty/**/*.gif',
'src/3rdparty/**/*.ttf'
])
.pipe(gulp.dest('dist/3rdparty/'));
});
gulp.task('3rdparty', gulp.series(['3rdparty-copy', 'bootstrap', 'fontawesome']));
// --------------
// JavaScript
// --------------
if (argv.help || argv.h) {
console.log('Supported arguments for "gulp develop":');
console.log(' --client-id <clientId>');
console.log(' --client-secret <clientSecret>');
console.log(' --api-origin <cloudron api uri>');
process.exit(1);
}
gulp.task('js', ['js-index', 'js-logs', 'js-terminal', 'js-setup', 'js-setupdns', 'js-restore', 'js-update'], function () {});
var oauth = {
clientId: argv.clientId || 'cid-webadmin',
clientSecret: argv.clientSecret || 'unused',
apiOrigin: argv.apiOrigin || '',
apiOriginHostname: argv.apiOrigin ? url.parse(argv.apiOrigin).hostname : ''
};
console.log();
console.log('Using OAuth credentials:');
console.log(' ClientId: %s', oauth.clientId);
console.log(' ClientSecret: %s', oauth.clientSecret);
console.log(' Cloudron API: %s', oauth.apiOrigin || 'default');
console.log(' Cloudron Host: %s', oauth.apiOriginHostname);
console.log();
gulp.task('js-index', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src([
'webadmin/src/js/index.js',
'webadmin/src/js/client.js',
'webadmin/src/js/appstore.js',
'webadmin/src/js/main.js',
'webadmin/src/views/*.js'
return gulp.src([
'src/js/index.js',
'src/js/client.js',
'src/js/main.js',
'src/views/*.js'
])
.pipe(ejs({ oauth: oauth }, {}, { ext: '.js' }))
.pipe(ejs({ apiOrigin: apiOrigin, revision: revision, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('index.js', { newLine: ';' }))
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-logs', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src(['webadmin/src/js/logs.js', 'webadmin/src/js/client.js'])
.pipe(ejs({ oauth: oauth }, {}, { ext: '.js' }))
return gulp.src(['src/js/logs.js', 'src/js/client.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('logs.js', { newLine: ';' }))
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-terminal', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src(['webadmin/src/js/terminal.js', 'webadmin/src/js/client.js'])
.pipe(ejs({ oauth: oauth }, {}, { ext: '.js' }))
return gulp.src(['src/js/terminal.js', 'src/js/client.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('terminal.js', { newLine: ';' }))
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-login', function () {
return gulp.src(['src/js/login.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('login.js', { newLine: ';' }))
.pipe(sourcemaps.write())
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-setupaccount', function () {
return gulp.src(['src/js/setupaccount.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('setupaccount.js', { newLine: ';' }))
.pipe(sourcemaps.write())
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-setup', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src(['webadmin/src/js/setup.js', 'webadmin/src/js/client.js'])
.pipe(ejs({ oauth: oauth }, {}, { ext: '.js' }))
return gulp.src(['src/js/setup.js', 'src/js/client.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('setup.js', { newLine: ';' }))
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-setupdns', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src(['webadmin/src/js/setupdns.js', 'webadmin/src/js/client.js'])
.pipe(ejs({ oauth: oauth }, {}, { ext: '.js' }))
return gulp.src(['src/js/setupdns.js', 'src/js/client.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('setupdns.js', { newLine: ';' }))
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
.pipe(gulp.dest('dist/js'));
});
gulp.task('js-restore', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src(['webadmin/src/js/restore.js', 'webadmin/src/js/client.js'])
.pipe(ejs({ oauth: oauth }, {}, { ext: '.js' }))
return gulp.src(['src/js/restore.js', 'src/js/client.js'])
.pipe(ejs({ apiOrigin: apiOrigin, appstore: appstore }, {}, { ext: '.js' }))
.pipe(sourcemaps.init())
.pipe(concat('restore.js', { newLine: ';' }))
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
});
gulp.task('js-update', function () {
// needs special treatment for error handling
var uglifyer = uglify();
uglifyer.on('error', function (error) {
console.error(error);
});
gulp.src(['webadmin/src/js/update.js'])
.pipe(sourcemaps.init())
.pipe(uglifyer)
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist/js'));
.pipe(gulp.dest('dist/js'));
});
gulp.task('js', gulp.series([ 'js-index', 'js-logs', 'js-terminal', 'js-login', 'js-setupaccount', 'js-setup', 'js-setupdns', 'js-restore' ]));
// --------------
// HTML
// --------------
gulp.task('html', ['html-views', 'html-templates'], function () {
return gulp.src('webadmin/src/*.html').pipe(ejs({ apiOriginHostname: oauth.apiOriginHostname }, {}, { ext: '.html' })).pipe(gulp.dest('webadmin/dist'));
});
gulp.task('html-views', function () {
return gulp.src('webadmin/src/views/**/*.html').pipe(gulp.dest('webadmin/dist/views'));
return gulp.src('src/views/**/*.html').pipe(gulp.dest('dist/views'));
});
gulp.task('html-templates', function () {
return gulp.src('webadmin/src/templates/**/*.html').pipe(gulp.dest('webadmin/dist/templates'));
return gulp.src('src/templates/**/*.html').pipe(gulp.dest('dist/templates'));
});
gulp.task('html-raw', function () {
return gulp.src('src/*.html').pipe(ejs({ apiOrigin: apiOrigin, revision: revision }, {}, { ext: '.html' })).pipe(gulp.dest('dist'));
});
gulp.task('html', gulp.series(['html-views', 'html-templates', 'html-raw']));
// --------------
// CSS
// --------------
gulp.task('css', function () {
return gulp.src('webadmin/src/*.scss')
return gulp.src('src/*.scss')
.pipe(sourcemaps.init())
.pipe(sass({ includePaths: ['node_modules/bootstrap-sass/assets/stylesheets/'] }).on('error', sass.logError))
.pipe(autoprefixer())
.pipe(cssnano())
.pipe(sourcemaps.write())
.pipe(gulp.dest('webadmin/dist'));
.pipe(gulp.dest('dist'));
});
gulp.task('images', function () {
return gulp.src('webadmin/src/img/**')
.pipe(gulp.dest('webadmin/dist/img'));
return gulp.src('src/img/**')
.pipe(gulp.dest('dist/img'));
});
gulp.task('timezones', function (done) {
execSync('./scripts/createTimezones.js ./dist/js/timezones.js');
done();
});
// --------------
// Utilities
// --------------
gulp.task('watch', ['default'], function () {
gulp.watch(['webadmin/src/*.scss'], ['css']);
gulp.watch(['webadmin/src/img/*'], ['images']);
gulp.watch(['webadmin/src/**/*.html'], ['html']);
gulp.watch(['webadmin/src/views/*.html'], ['html-views']);
gulp.watch(['webadmin/src/templates/*.html'], ['html-templates']);
gulp.watch(['webadmin/src/js/update.js'], ['js-update']);
gulp.watch(['webadmin/src/js/setup.js', 'webadmin/src/js/client.js'], ['js-setup']);
gulp.watch(['webadmin/src/js/setupdns.js', 'webadmin/src/js/client.js'], ['js-setupdns']);
gulp.watch(['webadmin/src/js/restore.js', 'webadmin/src/js/client.js'], ['js-restore']);
gulp.watch(['webadmin/src/js/logs.js', 'webadmin/src/js/client.js'], ['js-logs']);
gulp.watch(['webadmin/src/js/terminal.js', 'webadmin/src/js/client.js'], ['js-terminal']);
gulp.watch(['webadmin/src/js/index.js', 'webadmin/src/js/client.js', 'webadmin/src/js/appstore.js', 'webadmin/src/js/main.js', 'webadmin/src/views/*.js'], ['js-index']);
gulp.watch(['webadmin/src/3rdparty/**/*'], ['3rdparty']);
gulp.task('clean', function (done) {
rimraf.sync('dist');
done();
});
gulp.task('clean', function () {
rimraf.sync('webadmin/dist');
gulp.task('default', gulp.series(['clean', 'html', 'js', 'timezones', '3rdparty', 'images', 'css']));
gulp.task('watch', function (done) {
gulp.watch(['src/*.scss'], gulp.series(['css']));
gulp.watch(['src/img/*'], gulp.series(['images']));
gulp.watch(['src/**/*.html'], gulp.series(['html']));
gulp.watch(['src/views/*.html'], gulp.series(['html-views']));
gulp.watch(['src/templates/*.html'], gulp.series(['html-templates']));
gulp.watch(['scripts/createTimezones.js'], gulp.series(['timezones']));
gulp.watch(['src/js/setup.js', 'src/js/client.js'], gulp.series(['js-setup']));
gulp.watch(['src/js/setupdns.js', 'src/js/client.js'], gulp.series(['js-setupdns']));
gulp.watch(['src/js/restore.js', 'src/js/client.js'], gulp.series(['js-restore']));
gulp.watch(['src/js/logs.js', 'src/js/client.js'], gulp.series(['js-logs']));
gulp.watch(['src/js/terminal.js', 'src/js/client.js'], gulp.series(['js-terminal']));
gulp.watch(['src/js/login.js'], gulp.series(['js-login']));
gulp.watch(['src/js/setupaccount.js'], gulp.series(['js-setupaccount']));
gulp.watch(['src/js/index.js', 'src/js/client.js', 'src/js/main.js', 'src/views/*.js'], gulp.series(['js-index']));
gulp.watch(['src/3rdparty/**/*'], gulp.series(['3rdparty']));
done();
});
gulp.task('default', ['clean', 'html', 'js', '3rdparty', 'images', 'css'], function () {});
gulp.task('serve', serve({ root: 'dist', port: 4000 }));
gulp.task('develop', gulp.series(['default', 'watch', 'serve']));
gulp.task('develop', ['watch'], serve({ root: 'webadmin/dist', port: 4000 }));
+3693 -5594
View File
File diff suppressed because it is too large Load Diff
+23 -101
View File
@@ -1,111 +1,33 @@
{
"name": "cloudron",
"description": "Main code for a cloudron",
"name": "dashboard",
"version": "1.0.0",
"private": true,
"author": {
"name": "Cloudron authors"
"description": "[Cloudron](https://cloudron.io) is the best way to run apps on your server.",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "https://git.cloudron.io/cloudron/box.git"
},
"engines": {
"node": ">=4.0.0 <=4.1.1"
"url": "ssh://git@git.cloudron.io:6000/cloudron/dashboard.git"
},
"author": "",
"license": "SEE LICENSE IN LICENSE",
"dependencies": {
"@google-cloud/dns": "^0.7.0",
"@google-cloud/storage": "^1.2.1",
"@sindresorhus/df": "^2.1.0",
"async": "^2.6.0",
"aws-sdk": "^2.151.0",
"body-parser": "^1.18.2",
"cloudron-manifestformat": "^2.10.0",
"connect-ensure-login": "^0.1.1",
"connect-lastmile": "^1.0.2",
"connect-timeout": "^1.9.0",
"cookie-parser": "^1.3.5",
"cookie-session": "^1.3.2",
"cron": "^1.3.0",
"csurf": "^1.6.6",
"db-migrate": "^0.10.0-beta.24",
"db-migrate-mysql": "^1.1.10",
"debug": "^3.1.0",
"dockerode": "^2.5.3",
"ejs": "^2.5.7",
"ejs-cli": "^2.0.0",
"express": "^4.16.2",
"express-session": "^1.15.6",
"hat": "0.0.3",
"json": "^9.0.3",
"ldapjs": "^1.0.0",
"lodash.chunk": "^4.2.0",
"mime": "^2.0.3",
"moment-timezone": "^0.5.14",
"morgan": "^1.9.0",
"multiparty": "^4.1.2",
"mysql": "^2.15.0",
"nodemailer": "^4.4.0",
"nodemailer-smtp-transport": "^2.7.4",
"oauth2orize": "^1.11.0",
"once": "^1.3.2",
"parse-links": "^0.1.0",
"passport": "^0.4.0",
"passport-http": "^0.3.0",
"passport-http-bearer": "^1.0.1",
"passport-local": "^1.0.0",
"passport-oauth2-client-password": "^0.1.2",
"password-generator": "^2.2.0",
"progress-stream": "^2.0.0",
"proxy-middleware": "^0.15.0",
"recursive-readdir": "^2.2.1",
"request": "^2.83.0",
"s3-block-read-stream": "^0.2.0",
"safetydance": "^0.7.1",
"semver": "^5.4.1",
"showdown": "^1.8.2",
"split": "^1.0.0",
"superagent": "^3.8.1",
"supererror": "^0.7.1",
"tar-fs": "^1.16.0",
"tar-stream": "^1.5.5",
"tldjs": "^2.2.0",
"underscore": "^1.7.0",
"uuid": "^3.1.0",
"valid-url": "^1.0.9",
"validator": "^9.1.1",
"ws": "^3.3.1"
"@fortawesome/fontawesome-free": "^5.5.0",
"bootstrap-sass": "^3.4.1",
"gulp": "^4.0.0",
"gulp-autoprefixer": "^5.0.0",
"gulp-concat": "^2.6.1",
"gulp-cssnano": "^2.1.3",
"gulp-ejs": "^3.3.0",
"gulp-sass": "^4.0.2",
"gulp-serve": "^1.4.0",
"gulp-sourcemaps": "^2.6.5",
"rimraf": "^2.6.2",
"yargs": "^11.0.0"
},
"devDependencies": {
"bootstrap-sass": "^3.3.3",
"expect.js": "*",
"gulp": "^3.9.1",
"gulp-autoprefixer": "^4.0.0",
"gulp-concat": "^2.4.3",
"gulp-cssnano": "^2.1.0",
"gulp-ejs": "^3.1.0",
"gulp-sass": "^3.1.0",
"gulp-serve": "^1.0.0",
"gulp-sourcemaps": "^2.6.1",
"gulp-uglify": "^3.0.0",
"hock": "^1.3.2",
"istanbul": "*",
"js2xmlparser": "^3.0.0",
"mocha": "*",
"mock-aws-s3": "git+https://github.com/cloudron-io/mock-aws-s3.git",
"nock": "^9.0.14",
"node-sass": "^4.6.1",
"readdirp": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
"yargs": "^10.0.3"
},
"scripts": {
"migrate_local": "DATABASE_URL=mysql://root:@localhost/box node_modules/.bin/db-migrate up",
"migrate_test": "BOX_ENV=test DATABASE_URL=mysql://root:@localhost/boxtest node_modules/.bin/db-migrate up",
"test": "npm run migrate_test && src/test/setupTest && BOX_ENV=test ./node_modules/istanbul/lib/cli.js test $1 ./node_modules/mocha/bin/_mocha -- --exit -R spec ./src/test ./src/routes/test/[^a]*",
"test_all": "npm run migrate_test && src/test/setupTest && BOX_ENV=test ./node_modules/istanbul/lib/cli.js test $1 ./node_modules/mocha/bin/_mocha -- --exit -R spec ./src/test ./src/routes/test",
"postmerge": "/bin/true",
"precommit": "/bin/true",
"prepush": "npm test",
"webadmin": "node_modules/.bin/gulp"
"eslintConfig": {
"env": {
"browser": true
}
}
}
+66
View File
@@ -0,0 +1,66 @@
#!/usr/bin/env node
// This script creates many users to test the UI for such a case
// WARNING keep those in sync with delUsers.js
const USERNAME_PREFIX = 'manyuser';
const PASSOWRD_PREFIX = 'password';
const DISPLAYNAME_PREFIX = 'User ';
const EMAIL_DOMAIN = 'example.com'; // addresses will be username@EMAIL_DOMAIN
const COUNT = 100;
var async = require('async'),
readlineSync = require('readline-sync'),
superagent = require('superagent');
if (process.argv.length !== 3) {
console.log('Usage: ./addUsers.js <cloudronDomain>');
process.exit(1);
}
const cloudronDomain = process.argv[2];
function getAccessToken(callback) {
let username = readlineSync.question('Username: ', {});
let password = readlineSync.question('Password: ', { noEchoBack: true });
superagent.post(`https://${cloudronDomain}/api/v1/developer/login`, { username: username, password: password }).end(function (error, result) {
if (error || result.statusCode !== 200) {
console.log('Login failed');
return getAccessToken(callback);
}
callback(result.body.accessToken);
});
}
console.log(`Login to ${cloudronDomain}`);
getAccessToken(function (accessToken) {
console.log(`Now creating ${COUNT} users...`);
async.timesLimit(COUNT, 5, function (n, next) {
let user = {
username: USERNAME_PREFIX + n,
password: PASSOWRD_PREFIX + n,
email: USERNAME_PREFIX + n + '@' + EMAIL_DOMAIN,
displayName: DISPLAYNAME_PREFIX + n
};
superagent.post(`https://${cloudronDomain}/api/v1/users`, user).query({ access_token: accessToken }).end(function (error) {
if (error) return next(error);
process.stdout.write('.');
next();
});
}, function (error) {
console.log();
if (error) {
console.error(error);
process.exit(1);
}
console.log('Done');
});
});
+387
View File
@@ -0,0 +1,387 @@
#!/usr/bin/env node
// This script creates a specific timezones.js to be consumed by the dashboard
var execSync = require('child_process').execSync,
fs = require('fs'),
path = require('path');
if (process.argv.length !== 3) {
console.log('Usage: createTimezones.js <output.js>');
process.exit(1);
}
const destinationFilePath = path.resolve(process.argv[2]);
console.log('Creating timezone info at:', destinationFilePath);
var ubuntuTimezones = execSync('timedatectl list-timezones --no-pager').toString().split('\n').filter(function (t) { return !!t; });
// from https://github.com/dmfilipenko/timezones.json/blob/master/timezones.json
var details = [
{ name: 'UTC', offset: '+00:00' },
{ name: 'Africa/Abidjan', offset: '+00:00' },
{ name: 'Africa/Accra', offset: '+00:00' },
{ name: 'Africa/Algiers', offset: '+01:00' },
{ name: 'Africa/Bissau', offset: '+00:00' },
{ name: 'Africa/Cairo', offset: '+02:00' },
{ name: 'Africa/Casablanca', offset: '+01:00' },
{ name: 'Africa/Ceuta', offset: '+01:00' },
{ name: 'Africa/El_Aaiun', offset: '+00:00' },
{ name: 'Africa/Johannesburg', offset: '+02:00' },
{ name: 'Africa/Juba', offset: '+03:00' },
{ name: 'Africa/Khartoum', offset: '+02:00' },
{ name: 'Africa/Lagos', offset: '+01:00' },
{ name: 'Africa/Maputo', offset: '+02:00' },
{ name: 'Africa/Monrovia', offset: '+00:00' },
{ name: 'Africa/Nairobi', offset: '+03:00' },
{ name: 'Africa/Ndjamena', offset: '+01:00' },
{ name: 'Africa/Tripoli', offset: '+02:00' },
{ name: 'Africa/Tunis', offset: '+01:00' },
{ name: 'Africa/Windhoek', offset: '+02:00' },
{ name: 'America/Adak', offset: '10:00' },
{ name: 'America/Anchorage', offset: '09:00' },
{ name: 'America/Araguaina', offset: '03:00' },
{ name: 'America/Argentina/Buenos_Aires', offset: '03:00' },
{ name: 'America/Argentina/Catamarca', offset: '03:00' },
{ name: 'America/Argentina/Cordoba', offset: '03:00' },
{ name: 'America/Argentina/Jujuy', offset: '03:00' },
{ name: 'America/Argentina/La_Rioja', offset: '03:00' },
{ name: 'America/Argentina/Mendoza', offset: '03:00' },
{ name: 'America/Argentina/Rio_Gallegos', offset: '03:00' },
{ name: 'America/Argentina/Salta', offset: '03:00' },
{ name: 'America/Argentina/San_Juan', offset: '03:00' },
{ name: 'America/Argentina/San_Luis', offset: '03:00' },
{ name: 'America/Argentina/Tucuman', offset: '03:00' },
{ name: 'America/Argentina/Ushuaia', offset: '03:00' },
{ name: 'America/Asuncion', offset: '04:00' },
{ name: 'America/Atikokan', offset: '05:00' },
{ name: 'America/Bahia', offset: '03:00' },
{ name: 'America/Bahia_Banderas', offset: '06:00' },
{ name: 'America/Barbados', offset: '04:00' },
{ name: 'America/Belem', offset: '03:00' },
{ name: 'America/Belize', offset: '06:00' },
{ name: 'America/Blanc-Sablon', offset: '04:00' },
{ name: 'America/Boa_Vista', offset: '04:00' },
{ name: 'America/Bogota', offset: '05:00' },
{ name: 'America/Boise', offset: '07:00' },
{ name: 'America/Cambridge_Bay', offset: '07:00' },
{ name: 'America/Campo_Grande', offset: '04:00' },
{ name: 'America/Cancun', offset: '05:00' },
{ name: 'America/Caracas', offset: '04:00' },
{ name: 'America/Cayenne', offset: '03:00' },
{ name: 'America/Chicago', offset: '06:00' },
{ name: 'America/Chihuahua', offset: '07:00' },
{ name: 'America/Costa_Rica', offset: '06:00' },
{ name: 'America/Creston', offset: '07:00' },
{ name: 'America/Cuiaba', offset: '04:00' },
{ name: 'America/Curacao', offset: '04:00' },
{ name: 'America/Danmarkshavn', offset: '+00:00' },
{ name: 'America/Dawson', offset: '08:00' },
{ name: 'America/Dawson_Creek', offset: '07:00' },
{ name: 'America/Denver', offset: '07:00' },
{ name: 'America/Detroit', offset: '05:00' },
{ name: 'America/Edmonton', offset: '07:00' },
{ name: 'America/Eirunepe', offset: '05:00' },
{ name: 'America/El_Salvador', offset: '06:00' },
{ name: 'America/Fort_Nelson', offset: '07:00' },
{ name: 'America/Fortaleza', offset: '03:00' },
{ name: 'America/Glace_Bay', offset: '04:00' },
{ name: 'America/Godthab', offset: '03:00' },
{ name: 'America/Goose_Bay', offset: '04:00' },
{ name: 'America/Grand_Turk', offset: '05:00' },
{ name: 'America/Guatemala', offset: '06:00' },
{ name: 'America/Guayaquil', offset: '05:00' },
{ name: 'America/Guyana', offset: '04:00' },
{ name: 'America/Halifax', offset: '04:00' },
{ name: 'America/Havana', offset: '05:00' },
{ name: 'America/Hermosillo', offset: '07:00' },
{ name: 'America/Indiana/Indianapolis', offset: '05:00' },
{ name: 'America/Indiana/Knox', offset: '06:00' },
{ name: 'America/Indiana/Marengo', offset: '05:00' },
{ name: 'America/Indiana/Petersburg', offset: '05:00' },
{ name: 'America/Indiana/Tell_City', offset: '06:00' },
{ name: 'America/Indiana/Vevay', offset: '05:00' },
{ name: 'America/Indiana/Vincennes', offset: '05:00' },
{ name: 'America/Indiana/Winamac', offset: '05:00' },
{ name: 'America/Inuvik', offset: '07:00' },
{ name: 'America/Iqaluit', offset: '05:00' },
{ name: 'America/Jamaica', offset: '05:00' },
{ name: 'America/Juneau', offset: '09:00' },
{ name: 'America/Kentucky/Louisville', offset: '05:00' },
{ name: 'America/Kentucky/Monticello', offset: '05:00' },
{ name: 'America/La_Paz', offset: '04:00' },
{ name: 'America/Lima', offset: '05:00' },
{ name: 'America/Los_Angeles', offset: '08:00' },
{ name: 'America/Maceio', offset: '03:00' },
{ name: 'America/Managua', offset: '06:00' },
{ name: 'America/Manaus', offset: '04:00' },
{ name: 'America/Martinique', offset: '04:00' },
{ name: 'America/Matamoros', offset: '06:00' },
{ name: 'America/Mazatlan', offset: '07:00' },
{ name: 'America/Menominee', offset: '06:00' },
{ name: 'America/Merida', offset: '06:00' },
{ name: 'America/Metlakatla', offset: '09:00' },
{ name: 'America/Mexico_City', offset: '06:00' },
{ name: 'America/Miquelon', offset: '03:00' },
{ name: 'America/Moncton', offset: '04:00' },
{ name: 'America/Monterrey', offset: '06:00' },
{ name: 'America/Montevideo', offset: '03:00' },
{ name: 'America/Nassau', offset: '05:00' },
{ name: 'America/New_York', offset: '05:00' },
{ name: 'America/Nipigon', offset: '05:00' },
{ name: 'America/Nome', offset: '09:00' },
{ name: 'America/Noronha', offset: '02:00' },
{ name: 'America/North_Dakota/Beulah', offset: '06:00' },
{ name: 'America/North_Dakota/Center', offset: '06:00' },
{ name: 'America/North_Dakota/New_Salem', offset: '06:00' },
{ name: 'America/Ojinaga', offset: '07:00' },
{ name: 'America/Panama', offset: '05:00' },
{ name: 'America/Pangnirtung', offset: '05:00' },
{ name: 'America/Paramaribo', offset: '03:00' },
{ name: 'America/Phoenix', offset: '07:00' },
{ name: 'America/Port_of_Spain', offset: '04:00' },
{ name: 'America/Port-au-Prince', offset: '05:00' },
{ name: 'America/Porto_Velho', offset: '04:00' },
{ name: 'America/Puerto_Rico', offset: '04:00' },
{ name: 'America/Punta_Arenas', offset: '03:00' },
{ name: 'America/Rainy_River', offset: '06:00' },
{ name: 'America/Rankin_Inlet', offset: '06:00' },
{ name: 'America/Recife', offset: '03:00' },
{ name: 'America/Regina', offset: '06:00' },
{ name: 'America/Resolute', offset: '06:00' },
{ name: 'America/Rio_Branco', offset: '05:00' },
{ name: 'America/Santarem', offset: '03:00' },
{ name: 'America/Santiago', offset: '04:00' },
{ name: 'America/Santo_Domingo', offset: '04:00' },
{ name: 'America/Sao_Paulo', offset: '03:00' },
{ name: 'America/Scoresbysund', offset: '01:00' },
{ name: 'America/Sitka', offset: '09:00' },
{ name: 'America/St_Johns', offset: '03:30' },
{ name: 'America/Swift_Current', offset: '06:00' },
{ name: 'America/Tegucigalpa', offset: '06:00' },
{ name: 'America/Thule', offset: '04:00' },
{ name: 'America/Thunder_Bay', offset: '05:00' },
{ name: 'America/Tijuana', offset: '08:00' },
{ name: 'America/Toronto', offset: '05:00' },
{ name: 'America/Vancouver', offset: '08:00' },
{ name: 'America/Whitehorse', offset: '08:00' },
{ name: 'America/Winnipeg', offset: '06:00' },
{ name: 'America/Yakutat', offset: '09:00' },
{ name: 'America/Yellowknife', offset: '07:00' },
{ name: 'Antarctica/Casey', offset: '+11:00' },
{ name: 'Antarctica/Davis', offset: '+07:00' },
{ name: 'Antarctica/DumontDUrville', offset: '+10:00' },
{ name: 'Antarctica/Macquarie', offset: '+11:00' },
{ name: 'Antarctica/Mawson', offset: '+05:00' },
{ name: 'Antarctica/Palmer', offset: '03:00' },
{ name: 'Antarctica/Rothera', offset: '03:00' },
{ name: 'Antarctica/Syowa', offset: '+03:00' },
{ name: 'Antarctica/Troll', offset: '+00:00' },
{ name: 'Antarctica/Vostok', offset: '+06:00' },
{ name: 'Asia/Almaty', offset: '+06:00' },
{ name: 'Asia/Amman', offset: '+02:00' },
{ name: 'Asia/Anadyr', offset: '+12:00' },
{ name: 'Asia/Aqtau', offset: '+05:00' },
{ name: 'Asia/Aqtobe', offset: '+05:00' },
{ name: 'Asia/Ashgabat', offset: '+05:00' },
{ name: 'Asia/Atyrau', offset: '+05:00' },
{ name: 'Asia/Baghdad', offset: '+03:00' },
{ name: 'Asia/Baku', offset: '+04:00' },
{ name: 'Asia/Bangkok', offset: '+07:00' },
{ name: 'Asia/Barnaul', offset: '+07:00' },
{ name: 'Asia/Beirut', offset: '+02:00' },
{ name: 'Asia/Bishkek', offset: '+06:00' },
{ name: 'Asia/Brunei', offset: '+08:00' },
{ name: 'Asia/Chita', offset: '+09:00' },
{ name: 'Asia/Choibalsan', offset: '+08:00' },
{ name: 'Asia/Colombo', offset: '+05:30' },
{ name: 'Asia/Damascus', offset: '+02:00' },
{ name: 'Asia/Dhaka', offset: '+06:00' },
{ name: 'Asia/Dili', offset: '+09:00' },
{ name: 'Asia/Dubai', offset: '+04:00' },
{ name: 'Asia/Dushanbe', offset: '+05:00' },
{ name: 'Asia/Famagusta', offset: '+02:00' },
{ name: 'Asia/Gaza', offset: '+02:00' },
{ name: 'Asia/Hebron', offset: '+02:00' },
{ name: 'Asia/Ho_Chi_Minh', offset: '+07:00' },
{ name: 'Asia/Hong_Kong', offset: '+08:00' },
{ name: 'Asia/Hovd', offset: '+07:00' },
{ name: 'Asia/Irkutsk', offset: '+08:00' },
{ name: 'Asia/Jakarta', offset: '+07:00' },
{ name: 'Asia/Jayapura', offset: '+09:00' },
{ name: 'Asia/Jerusalem', offset: '+02:00' },
{ name: 'Asia/Kabul', offset: '+04:30' },
{ name: 'Asia/Kamchatka', offset: '+12:00' },
{ name: 'Asia/Karachi', offset: '+05:00' },
{ name: 'Asia/Kathmandu', offset: '+05:45' },
{ name: 'Asia/Khandyga', offset: '+09:00' },
{ name: 'Asia/Kolkata', offset: '+05:30' },
{ name: 'Asia/Krasnoyarsk', offset: '+07:00' },
{ name: 'Asia/Kuala_Lumpur', offset: '+08:00' },
{ name: 'Asia/Kuching', offset: '+08:00' },
{ name: 'Asia/Macau', offset: '+08:00' },
{ name: 'Asia/Magadan', offset: '+11:00' },
{ name: 'Asia/Makassar', offset: '+08:00' },
{ name: 'Asia/Manila', offset: '+08:00' },
{ name: 'Asia/Novokuznetsk', offset: '+07:00' },
{ name: 'Asia/Novosibirsk', offset: '+07:00' },
{ name: 'Asia/Omsk', offset: '+06:00' },
{ name: 'Asia/Oral', offset: '+05:00' },
{ name: 'Asia/Pontianak', offset: '+07:00' },
{ name: 'Asia/Pyongyang', offset: '+09:00' },
{ name: 'Asia/Qatar', offset: '+03:00' },
{ name: 'Asia/Qyzylorda', offset: '+05:00' },
{ name: 'Asia/Riyadh', offset: '+03:00' },
{ name: 'Asia/Sakhalin', offset: '+11:00' },
{ name: 'Asia/Samarkand', offset: '+05:00' },
{ name: 'Asia/Seoul', offset: '+09:00' },
{ name: 'Asia/Shanghai', offset: '+08:00' },
{ name: 'Asia/Singapore', offset: '+08:00' },
{ name: 'Asia/Srednekolymsk', offset: '+11:00' },
{ name: 'Asia/Taipei', offset: '+08:00' },
{ name: 'Asia/Tashkent', offset: '+05:00' },
{ name: 'Asia/Tbilisi', offset: '+04:00' },
{ name: 'Asia/Tehran', offset: '+03:30' },
{ name: 'Asia/Thimphu', offset: '+06:00' },
{ name: 'Asia/Tokyo', offset: '+09:00' },
{ name: 'Asia/Tomsk', offset: '+07:00' },
{ name: 'Asia/Ulaanbaatar', offset: '+08:00' },
{ name: 'Asia/Urumqi', offset: '+06:00' },
{ name: 'Asia/Ust-Nera', offset: '+10:00' },
{ name: 'Asia/Vladivostok', offset: '+10:00' },
{ name: 'Asia/Yakutsk', offset: '+09:00' },
{ name: 'Asia/Yangon', offset: '+06:30' },
{ name: 'Asia/Yekaterinburg', offset: '+05:00' },
{ name: 'Asia/Yerevan', offset: '+04:00' },
{ name: 'Atlantic/Azores', offset: '01:00' },
{ name: 'Atlantic/Bermuda', offset: '04:00' },
{ name: 'Atlantic/Canary', offset: '+00:00' },
{ name: 'Atlantic/Cape_Verde', offset: '01:00' },
{ name: 'Atlantic/Faroe', offset: '+00:00' },
{ name: 'Atlantic/Madeira', offset: '+00:00' },
{ name: 'Atlantic/Reykjavik', offset: '+00:00' },
{ name: 'Atlantic/South_Georgia', offset: '02:00' },
{ name: 'Atlantic/Stanley', offset: '03:00' },
{ name: 'Australia/Adelaide', offset: '+09:30' },
{ name: 'Australia/Brisbane', offset: '+10:00' },
{ name: 'Australia/Broken_Hill', offset: '+09:30' },
{ name: 'Australia/Currie', offset: '+10:00' },
{ name: 'Australia/Darwin', offset: '+09:30' },
{ name: 'Australia/Eucla', offset: '+08:45' },
{ name: 'Australia/Hobart', offset: '+10:00' },
{ name: 'Australia/Lindeman', offset: '+10:00' },
{ name: 'Australia/Lord_Howe', offset: '+10:30' },
{ name: 'Australia/Melbourne', offset: '+10:00' },
{ name: 'Australia/Perth', offset: '+08:00' },
{ name: 'Australia/Sydney', offset: '+10:00' },
{ name: 'Europe/Amsterdam', offset: '+01:00' },
{ name: 'Europe/Andorra', offset: '+01:00' },
{ name: 'Europe/Astrakhan', offset: '+04:00' },
{ name: 'Europe/Athens', offset: '+02:00' },
{ name: 'Europe/Belgrade', offset: '+01:00' },
{ name: 'Europe/Berlin', offset: '+01:00' },
{ name: 'Europe/Brussels', offset: '+01:00' },
{ name: 'Europe/Bucharest', offset: '+02:00' },
{ name: 'Europe/Budapest', offset: '+01:00' },
{ name: 'Europe/Chisinau', offset: '+02:00' },
{ name: 'Europe/Copenhagen', offset: '+01:00' },
{ name: 'Europe/Dublin', offset: '+00:00' },
{ name: 'Europe/Gibraltar', offset: '+01:00' },
{ name: 'Europe/Helsinki', offset: '+02:00' },
{ name: 'Europe/Istanbul', offset: '+03:00' },
{ name: 'Europe/Kaliningrad', offset: '+02:00' },
{ name: 'Europe/Kiev', offset: '+02:00' },
{ name: 'Europe/Kirov', offset: '+03:00' },
{ name: 'Europe/Lisbon', offset: '+00:00' },
{ name: 'Europe/London', offset: '+00:00' },
{ name: 'Europe/Luxembourg', offset: '+01:00' },
{ name: 'Europe/Madrid', offset: '+01:00' },
{ name: 'Europe/Malta', offset: '+01:00' },
{ name: 'Europe/Minsk', offset: '+03:00' },
{ name: 'Europe/Monaco', offset: '+01:00' },
{ name: 'Europe/Moscow', offset: '+03:00' },
{ name: 'Asia/Nicosia', offset: '+02:00' },
{ name: 'Europe/Oslo', offset: '+01:00' },
{ name: 'Europe/Paris', offset: '+01:00' },
{ name: 'Europe/Prague', offset: '+01:00' },
{ name: 'Europe/Riga', offset: '+02:00' },
{ name: 'Europe/Rome', offset: '+01:00' },
{ name: 'Europe/Samara', offset: '+04:00' },
{ name: 'Europe/Saratov', offset: '+04:00' },
{ name: 'Europe/Simferopol', offset: '+03:00' },
{ name: 'Europe/Sofia', offset: '+02:00' },
{ name: 'Europe/Stockholm', offset: '+01:00' },
{ name: 'Europe/Tallinn', offset: '+02:00' },
{ name: 'Europe/Tirane', offset: '+01:00' },
{ name: 'Europe/Ulyanovsk', offset: '+04:00' },
{ name: 'Europe/Uzhgorod', offset: '+02:00' },
{ name: 'Europe/Vienna', offset: '+01:00' },
{ name: 'Europe/Vilnius', offset: '+02:00' },
{ name: 'Europe/Volgograd', offset: '+04:00' },
{ name: 'Europe/Warsaw', offset: '+01:00' },
{ name: 'Europe/Zaporozhye', offset: '+02:00' },
{ name: 'Europe/Zurich', offset: '+01:00' },
{ name: 'Indian/Chagos', offset: '+06:00' },
{ name: 'Indian/Christmas', offset: '+07:00' },
{ name: 'Indian/Cocos', offset: '+06:30' },
{ name: 'Indian/Kerguelen', offset: '+05:00' },
{ name: 'Indian/Mahe', offset: '+04:00' },
{ name: 'Indian/Maldives', offset: '+05:00' },
{ name: 'Indian/Mauritius', offset: '+04:00' },
{ name: 'Indian/Reunion', offset: '+04:00' },
{ name: 'Pacific/Apia', offset: '+13:00' },
{ name: 'Pacific/Auckland', offset: '+12:00' },
{ name: 'Pacific/Bougainville', offset: '+11:00' },
{ name: 'Pacific/Chatham', offset: '+12:45' },
{ name: 'Pacific/Chuuk', offset: '+10:00' },
{ name: 'Pacific/Easter', offset: '06:00' },
{ name: 'Pacific/Efate', offset: '+11:00' },
{ name: 'Pacific/Enderbury', offset: '+13:00' },
{ name: 'Pacific/Fakaofo', offset: '+13:00' },
{ name: 'Pacific/Fiji', offset: '+12:00' },
{ name: 'Pacific/Funafuti', offset: '+12:00' },
{ name: 'Pacific/Galapagos', offset: '06:00' },
{ name: 'Pacific/Gambier', offset: '09:00' },
{ name: 'Pacific/Guadalcanal', offset: '+11:00' },
{ name: 'Pacific/Guam', offset: '+10:00' },
{ name: 'Pacific/Honolulu', offset: '10:00' },
{ name: 'Pacific/Kiritimati', offset: '+14:00' },
{ name: 'Pacific/Kosrae', offset: '+11:00' },
{ name: 'Pacific/Kwajalein', offset: '+12:00' },
{ name: 'Pacific/Majuro', offset: '+12:00' },
{ name: 'Pacific/Marquesas', offset: '09:30' },
{ name: 'Pacific/Nauru', offset: '+12:00' },
{ name: 'Pacific/Niue', offset: '11:00' },
{ name: 'Pacific/Norfolk', offset: '+11:00' },
{ name: 'Pacific/Noumea', offset: '+11:00' },
{ name: 'Pacific/Pago_Pago', offset: '11:00' },
{ name: 'Pacific/Palau', offset: '+09:00' },
{ name: 'Pacific/Pitcairn', offset: '08:00' },
{ name: 'Pacific/Pohnpei', offset: '+11:00' },
{ name: 'Pacific/Port_Moresby', offset: '+10:00' },
{ name: 'Pacific/Rarotonga', offset: '10:00' },
{ name: 'Pacific/Tahiti', offset: '10:00' },
{ name: 'Pacific/Tarawa', offset: '+12:00' },
{ name: 'Pacific/Tongatapu', offset: '+13:00' },
{ name: 'Pacific/Wake', offset: '+12:00' },
{ name: 'Pacific/Wallis', offset: '+12:00' },
];
var timezones = ubuntuTimezones.map(function (t) {
var detail = details.find(function (d) {
return d.name === t;
});
if (!detail) return null;
return {
id: t,
display: `${t} (UTC${detail.offset})`
}
}).filter(function (t) { return !!t; });
var output = `(function () { window.timezones = ${JSON.stringify(timezones)}; })();\n`;
fs.writeFileSync(destinationFilePath, output, 'utf-8');
console.log('Done');
+69
View File
@@ -0,0 +1,69 @@
#!/usr/bin/env node
// This script deletes many users to test the UI for such a case
// WARNING keep those in sync with addUsers.js
const USERNAME_PREFIX = 'manyuser';
var async = require('async'),
readlineSync = require('readline-sync'),
superagent = require('superagent');
if (process.argv.length !== 3) {
console.log('Usage: ./delUsers.js <cloudronDomain>');
process.exit(1);
}
const cloudronDomain = process.argv[2];
function getAccessToken(callback) {
let username = readlineSync.question('Username: ', {});
let password = readlineSync.question('Password: ', { noEchoBack: true });
superagent.post(`https://${cloudronDomain}/api/v1/developer/login`, { username: username, password: password }).end(function (error, result) {
if (error || result.statusCode !== 200) {
console.log('Login failed');
return getAccessToken(callback);
}
callback(result.body.accessToken);
});
}
console.log(`Login to ${cloudronDomain}`);
getAccessToken(function (accessToken) {
console.log('Listing users...');
superagent.get(`https://${cloudronDomain}/api/v1/users`).query({ access_token: accessToken, per_page: 1000 }).end(function (error, result) {
if (error) {
console.error(error);
process.exit(1);
}
console.log(`Found ${result.body.users.length} users`);
let matchingUsers = result.body.users.filter(function (u) { return u.username.indexOf(USERNAME_PREFIX) === 0; });
console.log(`Found ${matchingUsers.length} users with matching prefix`);
console.log('Deleting users...');
async.eachLimit(matchingUsers, 5, function (user, next) {
superagent.del(`https://${cloudronDomain}/api/v1/users/${user.id}`).query({ access_token: accessToken }).end(function (error) {
if (error) return next(error);
process.stdout.write('.');
next();
});
}, function (error) {
console.log();
if (error) {
console.error(error);
process.exit(1);
}
console.log('Done');
});
});
});
+163
View File
@@ -0,0 +1,163 @@
{
"name": "scripts",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"async": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz",
"integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"component-emitter": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
},
"cookiejar": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
"ms": "^2.1.1"
}
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"fast-safe-stringify": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
"integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
},
"form-data": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
"integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
}
},
"formidable": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
"integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"methods": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
"mime": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
"integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
},
"mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
},
"mime-types": {
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"requires": {
"mime-db": "1.40.0"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"qs": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.9.0.tgz",
"integrity": "sha512-27RP4UotQORTpmNQDX8BHPukOnBP3p1uUJY5UnDhaJB+rMt9iMsok724XL+UHU23bEFOHRMQ2ZhI99qOWUMGFA=="
},
"readable-stream": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
"integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
},
"readline-sync": {
"version": "1.4.10",
"resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
"integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="
},
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
"integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"requires": {
"safe-buffer": "~5.2.0"
}
},
"superagent": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-5.1.0.tgz",
"integrity": "sha512-7V6JVx5N+eTL1MMqRBX0v0bG04UjrjAvvZJTF/VDH/SH2GjSLqlrcYepFlpTrXpm37aSY6h3GGVWGxXl/98TKA==",
"requires": {
"component-emitter": "^1.3.0",
"cookiejar": "^2.1.2",
"debug": "^4.1.1",
"fast-safe-stringify": "^2.0.6",
"form-data": "^2.3.3",
"formidable": "^1.2.1",
"methods": "^1.1.2",
"mime": "^2.4.4",
"qs": "^6.7.0",
"readable-stream": "^3.4.0",
"semver": "^6.1.1"
}
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}
}
}
+16
View File
@@ -0,0 +1,16 @@
{
"name": "scripts",
"version": "1.0.0",
"description": "",
"main": "manyUsers.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"async": "^3.1.0",
"readline-sync": "^1.4.10",
"superagent": "^5.1.0"
}
}

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

+85
View File
@@ -0,0 +1,85 @@
/**
* angular-ui-notification - Angular.js service providing simple notifications using Bootstrap 3 styles with css transitions for animating
* @author Alex_Crack
* @version v0.3.6
* @link https://github.com/alexcrack/angular-ui-notification
* @license MIT
*/
.ui-notification
{
position: fixed;
z-index: 9999;
width: 300px;
-webkit-transition: all ease .5s;
-o-transition: all ease .5s;
transition: all ease .5s;
color: #fff;
border-radius: 0;
background: #337ab7;
box-shadow: 5px 5px 10px rgba(0, 0, 0, .3);
}
.ui-notification.clickable
{
cursor: pointer;
}
.ui-notification.clickable:hover
{
opacity: .7;
}
.ui-notification.killed
{
-webkit-transition: opacity ease 1s;
-o-transition: opacity ease 1s;
transition: opacity ease 1s;
opacity: 0;
}
.ui-notification > h3
{
font-size: 14px;
font-weight: bold;
display: block;
margin: 10px 10px 0 10px;
padding: 0 0 5px 0;
text-align: left;
border-bottom: 1px solid rgba(255, 255, 255, .3);
}
.ui-notification a
{
color: #fff;
}
.ui-notification a:hover
{
text-decoration: underline;
}
.ui-notification > .message
{
margin: 10px 10px 10px 10px;
}
.ui-notification.warning
{
color: #fff;
background: #f0ad4e;
}
.ui-notification.error
{
color: #fff;
background: #d9534f;
}
.ui-notification.success
{
color: #fff;
background: #5cb85c;
}
.ui-notification.info
{
color: #fff;
background: #5bc0de;
}

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 106 KiB

+10
View File
File diff suppressed because one or more lines are too long
+271
View File
@@ -0,0 +1,271 @@
/**
* angular-ui-notification - Angular.js service providing simple notifications using Bootstrap 3 styles with css transitions for animating
* @author Alex_Crack
* @version v0.3.6
* @link https://github.com/alexcrack/angular-ui-notification
* @license MIT
*/
angular.module('ui-notification', []);
angular.module('ui-notification').provider('Notification', function () {
this.options = {
delay: 5000,
startTop: 10,
startRight: 10,
verticalSpacing: 10,
horizontalSpacing: 10,
positionX: 'right',
positionY: 'top',
replaceMessage: false,
templateUrl: 'angular-ui-notification.html',
onClose: undefined,
onClick: undefined,
closeOnClick: true,
maxCount: 0, // 0 - Infinite
container: 'body',
priority: 10
};
this.setOptions = function (options) {
if (!angular.isObject(options)) throw new Error("Options should be an object!");
this.options = angular.extend({}, this.options, options);
};
this.$get = ["$timeout", "$http", "$compile", "$templateCache", "$rootScope", "$injector", "$sce", "$q", "$window", function ($timeout, $http, $compile, $templateCache, $rootScope, $injector, $sce, $q, $window) {
var options = this.options;
var startTop = options.startTop;
var startRight = options.startRight;
var verticalSpacing = options.verticalSpacing;
var horizontalSpacing = options.horizontalSpacing;
var delay = options.delay;
var messageElements = [];
var isResizeBound = false;
var notify = function (args, t) {
var deferred = $q.defer();
if (typeof args !== 'object' || args === null) {
args = {message: args};
}
args.scope = args.scope ? args.scope : $rootScope;
args.template = args.templateUrl ? args.templateUrl : options.templateUrl;
args.delay = !angular.isUndefined(args.delay) ? args.delay : delay;
args.type = t || args.type || options.type || '';
args.positionY = args.positionY ? args.positionY : options.positionY;
args.positionX = args.positionX ? args.positionX : options.positionX;
args.replaceMessage = args.replaceMessage ? args.replaceMessage : options.replaceMessage;
args.onClose = args.onClose ? args.onClose : options.onClose;
args.onClick = args.onClick ? args.onClick : options.onClick;
args.closeOnClick = (args.closeOnClick !== null && args.closeOnClick !== undefined) ? args.closeOnClick : options.closeOnClick;
args.container = args.container ? args.container : options.container;
args.priority = args.priority ? args.priority : options.priority;
var template = $templateCache.get(args.template);
if (template) {
processNotificationTemplate(template);
} else {
// load it via $http only if it isn't default template and template isn't exist in template cache
// cache:true means cache it for later access.
$http.get(args.template, {cache: true})
.then(function (response) {
processNotificationTemplate(response.data);
})
.catch(function (data) {
throw new Error('Template (' + args.template + ') could not be loaded. ' + data);
});
}
function processNotificationTemplate(template) {
var scope = args.scope.$new();
scope.message = $sce.trustAsHtml(args.message);
scope.title = $sce.trustAsHtml(args.title);
scope.t = args.type.substr(0, 1);
scope.delay = args.delay;
scope.onClose = args.onClose;
scope.onClick = args.onClick;
var priorityCompareTop = function (a, b) {
return a._priority - b._priority;
};
var priorityCompareBtm = function (a, b) {
return b._priority - a._priority;
};
var reposite = function () {
var j = 0;
var k = 0;
var lastTop = startTop;
var lastRight = startRight;
var lastPosition = [];
if (args.positionY === 'top') {
messageElements.sort(priorityCompareTop);
} else if (args.positionY === 'bottom') {
messageElements.sort(priorityCompareBtm);
}
for (var i = messageElements.length - 1; i >= 0; i--) {
var element = messageElements[i];
if (args.replaceMessage && i < messageElements.length - 1) {
element.addClass('killed');
continue;
}
var elHeight = parseInt(element[0].offsetHeight);
var elWidth = parseInt(element[0].offsetWidth);
var position = lastPosition[element._positionY + element._positionX];
if ((top + elHeight) > window.innerHeight) {
position = startTop;
k++;
j = 0;
}
var top = (lastTop = position ? (j === 0 ? position : position + verticalSpacing) : startTop);
var right = lastRight + (k * (horizontalSpacing + elWidth));
element.css(element._positionY, top + 'px');
if (element._positionX === 'center') {
element.css('left', parseInt(window.innerWidth / 2 - elWidth / 2) + 'px');
} else {
element.css(element._positionX, right + 'px');
}
lastPosition[element._positionY + element._positionX] = top + elHeight;
if (options.maxCount > 0 && messageElements.length > options.maxCount && i === 0) {
element.scope().kill(true);
}
j++;
}
};
var templateElement = $compile(template)(scope);
templateElement._positionY = args.positionY;
templateElement._positionX = args.positionX;
templateElement._priority = args.priority;
templateElement.addClass(args.type);
var closeEvent = function (e) {
e = e.originalEvent || e;
if (e.type === 'click' || e.propertyName === 'opacity' && e.elapsedTime >= 1) {
if (scope.onClose) {
scope.$apply(scope.onClose(templateElement));
}
if (e.type === 'click')
if (scope.onClick) {
scope.$apply(scope.onClick(templateElement));
}
templateElement.remove();
messageElements.splice(messageElements.indexOf(templateElement), 1);
scope.$destroy();
reposite();
}
};
if (args.closeOnClick) {
templateElement.addClass('clickable');
templateElement.bind('click', closeEvent);
}
templateElement.bind('webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd', closeEvent);
if (angular.isNumber(args.delay)) {
$timeout(function () {
templateElement.addClass('killed');
}, args.delay);
}
setCssTransitions('none');
angular.element(document.querySelector(args.container)).append(templateElement);
var offset = -(parseInt(templateElement[0].offsetHeight) + 50);
templateElement.css(templateElement._positionY, offset + "px");
messageElements.push(templateElement);
if (args.positionX == 'center') {
var elWidth = parseInt(templateElement[0].offsetWidth);
templateElement.css('left', parseInt(window.innerWidth / 2 - elWidth / 2) + 'px');
}
$timeout(function () {
setCssTransitions('');
});
function setCssTransitions(value) {
['-webkit-transition', '-o-transition', 'transition'].forEach(function (prefix) {
templateElement.css(prefix, value);
});
}
scope._templateElement = templateElement;
scope.kill = function (isHard) {
if (isHard) {
if (scope.onClose) {
scope.$apply(scope.onClose(scope._templateElement));
}
messageElements.splice(messageElements.indexOf(scope._templateElement), 1);
scope._templateElement.remove();
scope.$destroy();
$timeout(reposite);
} else {
scope._templateElement.addClass('killed');
}
};
$timeout(reposite);
if (!isResizeBound) {
angular.element($window).bind('resize', function (e) {
$timeout(reposite);
});
isResizeBound = true;
}
deferred.resolve(scope);
}
return deferred.promise;
};
notify.primary = function (args) {
return this(args, 'primary');
};
notify.error = function (args) {
return this(args, 'error');
};
notify.success = function (args) {
return this(args, 'success');
};
notify.info = function (args) {
return this(args, 'info');
};
notify.warning = function (args) {
return this(args, 'warning');
};
notify.clearAll = function () {
angular.forEach(messageElements, function (element) {
element.addClass('killed');
});
};
return notify;
}];
});
angular.module("ui-notification").run(["$templateCache", function($templateCache) {$templateCache.put("angular-ui-notification.html","<div class=\"ui-notification\"><h3 ng-show=\"title\" ng-bind-html=\"title\"></h3><div class=\"message\" ng-bind-html=\"message\"></div></div>");}]);
File diff suppressed because one or more lines are too long
@@ -22,6 +22,9 @@
height: 100%;
width: 100%;
text-align: center;
font-family: "Roboto","Helvetica Neue",Helvetica,Arial,sans-serif;
font-size: 13px;
line-height: 1.846;
}
.content {
@@ -37,23 +40,31 @@
bottom: 0;
width: 100%;
color: #555;
font-size: 14px;
font-size: 12px;
text-align: center;
padding: 5px;
z-index: 1000;
position: fixed;
opacity: .5;
transition: all .25s;
}
footer a {
color: #62bdfc;
padding: 10px;
footer:hover {
opacity: 1;
}
a {
color: #2196f3;
text-decoration: none;
background-color: transparent;
}
h1, h2, p {
margin: 10px;
a:hover {
color: #0a6ebd;
text-decoration: underline;
}
</style>
</style>
</head>
@@ -65,10 +76,8 @@
<p>This app is currently not responding. Try refreshing the page.</p>
</div>
<footer class="text-center">
<footer>
<span class="text-muted"><a href="https://cloudron.io" target="_blank">Cloudron</a></span>
<span class="text-muted"><a href="https://twitter.com/cloudron_io" target="_blank">Twitter</a></span>
<span class="text-muted"><a href="https://chat.cloudron.io" target="_blank">Chat <i class="fa fa-comments"></i></a></span>
</footer>
</body>
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+102
View File
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="546.13336"
height="546.13336"
viewBox="0 0 512.00001 512.00001"
id="svg4519"
version="1.1"
inkscape:version="0.92.2 2405546, 2018-03-11"
sodipodi:docname="appicon_fallback.svg"
inkscape:export-filename="/home/nebulon/projects/yellowtent/dashboard/src/img/appicon_fallback.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4521" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="89.894291"
inkscape:cy="162.5294"
inkscape:document-units="px"
inkscape:current-layer="g4496"
showgrid="false"
units="px"
inkscape:window-width="2880"
inkscape:window-height="1565"
inkscape:window-x="0"
inkscape:window-y="55"
inkscape:window-maximized="1" />
<metadata
id="metadata4524">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-540.36216)">
<g
id="g4467"
transform="matrix(20.50952,0,0,20.859456,-526.58031,-94.042799)">
<g
inkscape:export-ydpi="67.349998"
inkscape:export-xdpi="67.349998"
transform="matrix(0.59473169,0,0,0.59473169,31.04719,102.48374)"
id="g4382">
<g
id="g4496">
<path
sodipodi:type="star"
style="opacity:1;fill:#03a9f4;fill-opacity:1;stroke:none;stroke-width:1.10000002;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="path4162"
sodipodi:sides="6"
sodipodi:cx="12.46875"
sodipodi:cy="-99.893143"
sodipodi:r1="19.266006"
sodipodi:r2="16.307295"
sodipodi:arg1="-0.52224059"
sodipodi:arg2="0.0013581913"
inkscape:flatsided="true"
inkscape:rounded="0.12490573"
inkscape:randomized="0"
d="m 29.166669,-109.50348 c 1.200386,2.08567 1.17988,17.183595 -0.02617,19.265993 -1.206046,2.082397 -14.291486,9.613601 -16.697919,9.610333 -2.406432,-0.0033 -15.4713664,-7.56999 -16.671752,-9.655655 -1.2003857,-2.085666 -1.1798799,-17.183591 0.026167,-19.265991 1.2060467,-2.0824 14.2914862,-9.6136 16.6979192,-9.61033 2.406432,0.003 15.471366,7.56999 16.671752,9.65565 z"
transform="rotate(-30,10.993604,-99.259973)"
inkscape:export-xdpi="67.349998"
inkscape:export-ydpi="67.349998" />
<rect
inkscape:transform-center-x="0.66390665"
ry="3.9522502"
y="-107.69034"
x="4.8100815"
height="14.288903"
width="14.288903"
id="rect4168-1-1"
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:3.75875854;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
inkscape:transform-center-y="3.7035412e-06" />
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

+169
View File
@@ -0,0 +1,169 @@
<!DOCTYPE html>
<html ng-app="Application" ng-controller="MainController">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height" />
<!-- this gets changed once we get the config (because angular has not loaded yet, we see template string for a flash) -->
<title>&lrm;</title>
<link id="favicon" type="image/png" rel="icon" href="/api/v1/cloudron/avatar">
<link rel="apple-touch-icon" href="/api/v1/cloudron/avatar">
<link rel="icon" href="/api/v1/cloudron/avatar">
<!-- CSS -->
<link type="text/css" rel="stylesheet" href="/3rdparty/slick.css?<%= revision %>"/>
<link type="text/css" rel="stylesheet" href="/3rdparty/angular-ui-notification.css?<%= revision %>"/>
<link type="text/css" rel="stylesheet" href="/3rdparty/bootstrap-slider/bootstrap-slider.min.css?<%= revision %>"/>
<link type="text/css" rel="stylesheet" href="/theme.css?<%= revision %>">
<!-- Custom Fonts -->
<link type="text/css" rel="stylesheet" href="/3rdparty/fontawesome/css/all.min.css?<%= revision %>">
<!-- jQuery-->
<script type="text/javascript" src="/3rdparty/js/jquery.min.js?<%= revision %>"></script>
<!-- async -->
<script type="text/javascript" src="/3rdparty/js/async-3.2.0.min.js?<%= revision %>"></script>
<!-- toBlob() polyfill-->
<script type="text/javascript" src="/3rdparty/js/canvas-to-blob.min.js?<%= revision %>"></script>
<!-- Bootstrap Core JavaScript -->
<script type="text/javascript" src="/3rdparty/js/bootstrap.min.js?<%= revision %>"></script>
<!-- Slick carousel -->
<script type="text/javascript" src="/3rdparty/js/slick.js?<%= revision %>"></script>
<!-- Angularjs scripts -->
<script type="text/javascript" src="/3rdparty/js/angular.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-loader.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-route.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-animate.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-base64.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-md5.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-sanitize.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-slick.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-ui-notification.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-fittext.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/autofill-event.js?<%= revision %>"></script>
<!-- Angular directives for tldjs -->
<script type="text/javascript" src="/3rdparty/js/tld.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/angular-tld.js?<%= revision %>"></script>
<!-- Angular directives for bootstrap https://angular-ui.github.io/bootstrap/ -->
<script type="text/javascript" src="/3rdparty/js/ui-bootstrap-tpls-1.3.3.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/Chart.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/ansi_up.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/clipboard.min.js?<%= revision %>"></script>
<!-- Showdown (markdown converter) -->
<script type="text/javascript" src="/3rdparty/js/showdown-1.6.4.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/js/showdown-target-blank.min.js?<%= revision %>"></script>
<!-- Bootstrap slider -->
<script type="text/javascript" src="/3rdparty/bootstrap-slider/bootstrap-slider.min.js?<%= revision %>"></script>
<script type="text/javascript" src="/3rdparty/bootstrap-slider/slider.js?<%= revision %>"></script>
<!-- Anugular Multiselect https://github.com/sebastianha/angular-bootstrap-multiselect -->
<script type="text/javascript" src="/3rdparty/js/angular-bootstrap-multiselect.js?<%= revision %>"></script>
<!-- colors -->
<script type="text/javascript" src="/3rdparty/js/colors.js?<%= revision %>"></script>
<!-- moment -->
<script type="text/javascript" src="/3rdparty/js/moment.min.js?<%= revision %>"></script>
<!-- timezone list -->
<script type="text/javascript" src="/js/timezones.js?<%= revision %>"></script>
<!-- Main Application -->
<script type="text/javascript" src="/js/index.js?<%= revision %>"></script>
</head>
<body>
<script type="text/ng-template" id="notification.html">
<div class="ui-notification">
<h3 ng-show="title" ng-bind-html="title"></h3>
<div class="message">
<a href="{{action}}" ng-show="action" ng-bind-html="message"></a>
<span ng-hide="action" ng-bind-html="message"></span>
</div>
</div>
</script>
<a class="offline-banner animateMe" ng-show="client.offline" ng-cloak href="https://cloudron.io/documentation/troubleshooting/" target="_blank"><i class="fa fa-circle-notch fa-spin"></i> Cloudron is offline. Reconnecting...</a>
<div class="animateMe ng-hide layout-root" ng-show="initialized">
<!-- Navigation -->
<nav class="navbar navbar-default navbar-static-top shadow" role="navigation" style="margin-bottom: 0">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand navbar-brand-icon" href="#/"><img ng-src="{{ client.avatar }}" width="40" height="40"/></a>
<a class="navbar-brand" href="#/">{{ config.cloudronName || 'Cloudron' }}</a>
</div>
<!-- /.navbar-header -->
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav navbar-right" ng-hide="hideNavBarActions">
<li ng-show="user.isAtLeastOwner && (subscription.plan.id === 'free' || subscription.plan.id === 'expired')">
<a ng-click="openSubscriptionSetup()" style="cursor: pointer">
<span class="badge badge-success">{{ subscription.plan.id === 'free' ? 'Setup' : 'Reactivate' }} Subscription</span>
</a>
</li>
<li>
<a ng-class="{ active: isActive('/apps')}" href="#/apps"><i class="fa fa-th fa-fw"></i> My Apps</a>
</li>
<li ng-show="user.isAtLeastAdmin">
<a ng-class="{ active: isActive('/appstore')}" href="#/appstore"><i class="fa fa-cloud-download-alt fa-fw"></i> App Store</a>
</li>
<li ng-show="user.isAtLeastUserManager">
<a ng-class="{ active: isActive('/users')}" href="#/users"><i class="fa fa-users fa-fw"></i> Users</a>
</li>
<li class="dropdown">
<a href="" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><img ng-src="{{user.avatarUrl}}" style="width: 24px; height: 24px;"/> {{user.username}} <span class="badge badge-danger" ng-show="notifications.length">{{ notifications.length }}</span> <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu">
<li><a href="#/profile"><i class="fa fa-user fa-fw"></i> Profile</a></li>
<li ng-show="user.isAtLeastAdmin" class="divider"></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/backups"><i class="fa fa-archive fa-fw"></i> Backups</a></li>
<li ng-show="user.role === 'owner'"><a href="#/branding"><i class="fa fa-passport fa-fw"></i> Branding</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/domains"><i class="fa fa-globe fa-fw"></i> Domains & Certs</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/email"><i class="fa fa-envelope fa-fw"></i> Email</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/activity"><i class="fa fa-list-alt fa-fw"></i> Event Log</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/network"><i class="fas fa-network-wired fa-fw"></i> Network</a></li>
<li><a href="#/notifications"><i class="fa fa-bell fa-fw"></i> Notifications <span class="badge badge-danger" ng-show="notifications.length">{{ notifications.length }}</span></a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/settings"><i class="fa fa-wrench fa-fw"></i> Settings</a></li>
<li ng-show="user.isAtLeastAdmin" class="divider"></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/support"><i class="fa fa-comment fa-fw"></i> Support</a></li>
<li ng-show="user.isAtLeastAdmin"><a href="#/system"><i class="fa fa-cogs fa-fw"></i> System</a></li>
<li class="divider"></li>
<li><a href="" ng-click="logout($event)"><i class="fa fa-sign-out-alt fa-fw"></i> Logout</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<div ng-view id="ng-view" class="layout-content"></div>
<footer class="text-center ng-cloak">
<span class="text-muted" ng-bind-html="config.footer | markdown2html"></span>
<span class="version">v{{config.version}}</span>
</footer>
</div>
</body>
</html>
+2361
View File
File diff suppressed because it is too large Load Diff
+255 -161
View File
@@ -2,6 +2,9 @@
/* global angular:false */
/* global showdown:false */
/* global moment:false */
/* global $:false */
/* global ERROR,ISTATES,HSTATES,RSTATES */
// deal with accessToken in the query, this is passed for example on password reset and account setup upon invite
var search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.split('='); }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
@@ -16,7 +19,6 @@ if (search.accessToken) {
window.location.search = encodeURIComponent(Object.keys(search).map(function (key) { return key + '=' + search[key]; }).join('&'));
}
// create main application module
var app = angular.module('Application', ['ngFitText', 'ngRoute', 'ngAnimate', 'ngSanitize', 'angular-md5', 'base64', 'slick', 'ui-notification', 'ui.bootstrap', 'ui.bootstrap-slider', 'ngTld', 'ui.multiselect']);
@@ -25,76 +27,85 @@ app.config(['NotificationProvider', function (NotificationProvider) {
delay: 5000,
startTop: 60,
positionX: 'left',
maxCount: 3,
templateUrl: 'notification.html'
});
}]);
// configure resourceUrlWhitelist https://code.angularjs.org/1.5.8/docs/api/ng/provider/$sceDelegateProvider#resourceUrlWhitelist
app.config(function ($sceDelegateProvider) {
$sceDelegateProvider.resourceUrlWhitelist([
// Allow same origin resource loads.
'self',
// Allow loading from our assets domain.
'https://cloudron.io/**',
'https://staging.cloudron.io/**',
'https://dev.cloudron.io/**',
// Allow local development against the appstore pages
'http://localhost:5000/**'
]);
});
// setup all major application routes
app.config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/', {
redirectTo: '/apps'
}).when('/users', {
controller: 'UsersController',
templateUrl: 'views/users.html'
templateUrl: 'views/users.html?<%= revision %>'
}).when('/app/:appId/:view?', {
controller: 'AppController',
templateUrl: 'views/app.html?<%= revision %>'
}).when('/appstore', {
controller: 'AppStoreController',
templateUrl: 'views/appstore.html'
templateUrl: 'views/appstore.html?<%= revision %>'
}).when('/appstore/:appId', {
controller: 'AppStoreController',
templateUrl: 'views/appstore.html'
templateUrl: 'views/appstore.html?<%= revision %>'
}).when('/apps', {
controller: 'AppsController',
templateUrl: 'views/apps.html'
}).when('/account', {
controller: 'AccountController',
templateUrl: 'views/account.html'
}).when('/graphs', {
controller: 'GraphsController',
templateUrl: 'views/graphs.html'
templateUrl: 'views/apps.html?<%= revision %>'
}).when('/profile', {
controller: 'ProfileController',
templateUrl: 'views/profile.html?<%= revision %>'
}).when('/backups', {
controller: 'BackupsController',
templateUrl: 'views/backups.html?<%= revision %>'
}).when('/branding', {
controller: 'BrandingController',
templateUrl: 'views/branding.html?<%= revision %>'
}).when('/network', {
controller: 'NetworkController',
templateUrl: 'views/network.html?<%= revision %>'
}).when('/domains', {
controller: 'DomainsController',
templateUrl: 'views/domains.html'
templateUrl: 'views/domains.html?<%= revision %>'
}).when('/email', {
controller: 'EmailsController',
templateUrl: 'views/emails.html?<%= revision %>'
}).when('/email/:domain', {
controller: 'EmailController',
templateUrl: 'views/email.html'
templateUrl: 'views/email.html?<%= revision %>'
}).when('/notifications', {
controller: 'NotificationsController',
templateUrl: 'views/notifications.html?<%= revision %>'
}).when('/settings', {
controller: 'SettingsController',
templateUrl: 'views/settings.html'
templateUrl: 'views/settings.html?<%= revision %>'
}).when('/activity', {
controller: 'ActivityController',
templateUrl: 'views/activity.html'
templateUrl: 'views/activity.html?<%= revision %>'
}).when('/support', {
controller: 'SupportController',
templateUrl: 'views/support.html'
}).when('/tokens', {
controller: 'TokensController',
templateUrl: 'views/tokens.html'
templateUrl: 'views/support.html?<%= revision %>'
}).when('/system', {
controller: 'SystemController',
templateUrl: 'views/system.html?<%= revision %>'
}).otherwise({ redirectTo: '/'});
}]);
// keep in sync with appdb.js
var ISTATES = {
PENDING_INSTALL: 'pending_install',
PENDING_CLONE: 'pending_clone',
PENDING_CONFIGURE: 'pending_configure',
PENDING_UNINSTALL: 'pending_uninstall',
PENDING_RESTORE: 'pending_restore',
PENDING_UPDATE: 'pending_update',
PENDING_FORCE_UPDATE: 'pending_force_update',
PENDING_BACKUP: 'pending_backup',
ERROR: 'error',
INSTALLED: 'installed'
};
var HSTATES = {
HEALTHY: 'healthy',
UNHEALTHY: 'unhealthy',
ERROR: 'error',
DEAD: 'dead'
};
app.filter('installError', function () {
return function (app) {
if (!app) return false;
if (app.installationState === ISTATES.ERROR) return true;
if (app.installationState === ISTATES.INSTALLED) {
// app.health can also be null to indicate insufficient data
@@ -105,85 +116,207 @@ app.filter('installError', function () {
};
});
app.filter('activeTask', function () {
return function (app) {
if (!app) return false;
return app.taskId !== null;
};
});
app.filter('installSuccess', function () {
return function (app) {
if (!app) return false;
return app.installationState === ISTATES.INSTALLED;
};
});
app.filter('activeOAuthClients', function () {
return function (clients, user) {
return clients.filter(function (c) { return user.admin || (c.activeTokens && c.activeTokens.length > 0); });
app.filter('appIsInstalledAndHealthy', function () {
return function (app) {
if (!app) return false;
return (app.installationState === ISTATES.INSTALLED && app.health === HSTATES.HEALTHY && app.runState === RSTATES.RUNNING);
};
});
app.filter('prettyAppMessage', function () {
return function (message) {
if (message === 'ETRYAGAIN') return 'The DNS record for this location is not setup correctly. Please verify your DNS settings and repair this app.';
if (message === 'DNS Record already exists') return 'The DNS record for this location already exists. Manually remove the DNS record and then click on repair.';
app.filter('applicationLink', function() {
return function(app) {
if (!app) return '';
if (app.installationState === ISTATES.INSTALLED && app.health === HSTATES.HEALTHY && app.runState === RSTATES.RUNNING && !app.pendingPostInstallConfirmation) {
return 'https://' + app.fqdn;
} else {
return '';
}
};
});
// this appears when an item in app grid is clicked
app.filter('prettyAppErrorMessage', function () {
return function (app) {
if (!app) return '';
if (app.installationState === ISTATES.INSTALLED) {
// app.health can also be null to indicate insufficient data
if (app.health === HSTATES.UNHEALTHY) return 'The app is not responding to health checks. Check the logs for any error messages.';
}
if (app.error.reason === 'Access Denied') {
if (app.error.domain) return 'The DNS record for this location is not setup correctly. Please verify your DNS settings and repair this app.';
} else if (app.error.reason === 'Already Exists') {
if (app.error.domain) return 'The DNS record for this location already exists. Cloudron does not remove existing DNS records. Manually remove the DNS record and then click on repair.';
}
return app.error.message;
};
});
// this appears as tool tip in app grid
app.filter('appProgressMessage', function () {
return function (app) {
var message = app.message || (app.error ? app.error.message : '');
return message;
};
});
app.filter('shortAppMessage', function () {
return function (message) {
if (message === 'ETRYAGAIN') return 'DNS record not setup correctly';
return message;
app.filter('selectedTagFilter', function () {
return function selectedTagFilter(apps, selectedTags) {
return apps.filter(function (app) {
if (selectedTags.length === 0) return true;
if (!app.tags) return false;
for (var i = 0; i < selectedTags.length; i++) {
if (app.tags.indexOf(selectedTags[i]) === -1) return false;
}
return true;
});
};
});
app.filter('prettyMemory', function () {
return function (memory) {
// Adjust the default memory limit if it changes
return memory ? Math.floor(memory / 1024 / 1024) : 256;
app.filter('selectedDomainFilter', function () {
return function selectedDomainFilter(apps, selectedDomain) {
return apps.filter(function (app) {
if (!selectedDomain) return true;
if (selectedDomain._alldomains) return true; // magic domain for single select, see apps.js ALL_DOMAINS_DOMAIN
if (selectedDomain.domain === app.domain) return true;
return !!app.alternateDomains.find(function (ad) { return ad.domain === selectedDomain.domain; });
});
};
});
app.filter('appSearchFilter', function () {
return function appSearchFilter(apps, appSearch) {
return apps.filter(function (app) {
if (!appSearch) return true;
return app.fqdn.indexOf(appSearch) !== -1 || (app.label && app.label.indexOf(appSearch) !== -1);
});
};
});
app.filter('prettyDomains', function () {
return function prettyDomains(domains) {
return domains.map(function (d) { return d.domain; }).join(', ');
};
});
app.filter('installationActive', function () {
return function(app) {
return function (app) {
if (app.installationState === ISTATES.ERROR) return false;
if (app.installationState === ISTATES.INSTALLED) return false;
return true;
};
});
app.filter('installationStateLabel', function() {
// for better DNS errors
function detailedError(app) {
if (app.installationProgress === 'ETRYAGAIN') return 'DNS Error';
return 'Error';
}
// this appears in the app grid
app.filter('installationStateLabel', function () {
return function(app) {
var waiting = app.progress === 0 ? ' (Pending)' : '';
if (!app) return '';
var waiting = app.progress === 0 ? ' (Queued)' : '';
switch (app.installationState) {
case ISTATES.PENDING_INSTALL:
case ISTATES.PENDING_CLONE:
return 'Installing' + waiting;
case ISTATES.PENDING_CONFIGURE: return 'Configuring' + waiting;
case ISTATES.PENDING_CLONE:
return 'Cloning' + waiting;
case ISTATES.PENDING_LOCATION_CHANGE:
case ISTATES.PENDING_CONFIGURE:
case ISTATES.PENDING_RECREATE_CONTAINER:
case ISTATES.PENDING_DEBUG:
return 'Configuring' + waiting;
case ISTATES.PENDING_RESIZE:
return 'Resizing' + waiting;
case ISTATES.PENDING_DATA_DIR_MIGRATION:
return 'Migrating data' + waiting;
case ISTATES.PENDING_UNINSTALL: return 'Uninstalling' + waiting;
case ISTATES.PENDING_RESTORE: return 'Restoring' + waiting;
case ISTATES.PENDING_UPDATE: return 'Updating' + waiting;
case ISTATES.PENDING_FORCE_UPDATE: return 'Updating' + waiting;
case ISTATES.PENDING_BACKUP: return 'Backing up' + waiting;
case ISTATES.ERROR: return detailedError(app);
case ISTATES.PENDING_START: return 'Starting' + waiting;
case ISTATES.PENDING_STOP: return 'Stopping' + waiting;
case ISTATES.PENDING_RESTART: return 'Restarting' + waiting;
case ISTATES.ERROR: {
if (app.error && app.error.message === 'ETRYAGAIN') return 'DNS Error';
return 'Error';
}
case ISTATES.INSTALLED: {
if (app.runState === 'running') {
if (app.debugMode) {
return 'Recovery Mode';
} else if (app.runState === 'running') {
if (!app.health) return 'Starting...'; // no data yet
if (app.health === HSTATES.HEALTHY) return 'Running';
return 'Not responding'; // dead/exit/unhealthy
} else if (app.runState === 'pending_start') return 'Starting...';
else if (app.runState === 'pending_stop') return 'Stopping...';
else if (app.runState === 'stopped') return 'Stopped';
} else if (app.runState === 'stopped') return 'Stopped';
else return app.runState;
break;
}
default: return app.installationState;
}
};
});
app.filter('taskName', function () {
return function(installationState) {
switch (installationState) {
case ISTATES.PENDING_INSTALL: return 'install';
case ISTATES.PENDING_CLONE: return 'clone';
case ISTATES.PENDING_LOCATION_CHANGE: return 'location change';
case ISTATES.PENDING_CONFIGURE: return 'configure';
case ISTATES.PENDING_RECREATE_CONTAINER: return 'create container';
case ISTATES.PENDING_DEBUG: return 'debug';
case ISTATES.PENDING_RESIZE: return 'resize';
case ISTATES.PENDING_DATA_DIR_MIGRATION: return 'data migration';
case ISTATES.PENDING_UNINSTALL: return 'uninstall';
case ISTATES.PENDING_RESTORE: return 'restore';
case ISTATES.PENDING_UPDATE: return 'update';
case ISTATES.PENDING_BACKUP: return 'backup';
case ISTATES.PENDING_START: return 'start app';
case ISTATES.PENDING_STOP: return 'stop app';
case ISTATES.PENDING_RESTART: return 'restart app';
default: return installationState || '';
}
};
});
app.filter('errorSuggestion', function () {
return function (error) {
if (!error) return '';
switch (error.reason) {
case ERROR.ACCESS_DENIED:
if (error.domain) return 'Check the DNS credentials of ' + error.domain.domain + ' in the Domains & Certs view';
return '';
case ERROR.COLLECTD_ERROR: return 'Check if collectd is running on the server';
case ERROR.DATABASE_ERROR: return 'Check if MySQL database is running on the server';
case ERROR.DOCKER_ERROR: return 'Check if docker is running on the server';
case ERROR.DNS_ERROR: return 'Check if the DNS service of the domain is running';
case ERROR.LOGROTATE_ERROR: return 'Check if logrotate is running on the server';
case ERROR.NETWORK_ERROR: return 'Check if there are any network issues on the server';
case ERROR.REVERSEPROXY_ERROR: return 'Check if nginx is running on the server';
default: return '';
}
};
});
app.filter('readyToUpdate', function () {
return function (apps) {
return apps.every(function (app) {
@@ -200,25 +333,6 @@ app.filter('inProgressApps', function () {
};
});
app.filter('ignoreAdminGroup', function () {
return function (groups) {
return groups.filter(function (group) {
if (group.id) return group.id !== 'admin';
return group !== 'admin';
});
};
});
app.filter('applicationLink', function() {
return function(app) {
if (app.installationState === ISTATES.INSTALLED && app.health === HSTATES.HEALTHY) {
return 'https://' + app.fqdn;
} else {
return '';
}
};
});
app.filter('prettyHref', function () {
return function (input) {
if (!input) return input;
@@ -230,8 +344,8 @@ app.filter('prettyHref', function () {
app.filter('prettyDate', function () {
// http://ejohn.org/files/pretty.js
return function prettyDate(time) {
var date = new Date(time),
return function prettyDate(utc) {
var date = new Date(utc), // this converts utc into browser timezone and not cloudron timezone!
diff = (((new Date()).getTime() - date.getTime()) / 1000) + 30, // add 30seconds for clock skew
day_diff = Math.floor(diff / 86400);
@@ -252,16 +366,41 @@ app.filter('prettyDate', function () {
};
});
app.filter('prettyLongDate', function () {
return function prettyLongDate(utc) {
return moment(utc).format('MMMM Do YYYY, h:mm:ss a'); // this converts utc into browser timezone and not cloudron timezone!
};
});
app.filter('prettyShortDate', function () {
return function prettyShortDate(utc) {
return moment(utc).format('MMMM Do YYYY'); // this converts utc into browser timezone and not cloudron timezone!
};
});
app.filter('prettyEmailAddresses', function () {
return function prettyEmailAddresses(addresses) {
if (!addresses || addresses === '<>') return '<>';
if (Array.isArray(addresses)) return addresses.map(function (a) { return a.slice(1, -1); }).join(', ');
return addresses.slice(1, -1);
};
});
app.filter('markdown2html', function () {
var converter = new showdown.Converter({
extensions: ['targetblank'],
extensions: [ 'targetblank' ],
simplifiedAutoLink: true,
strikethrough: true,
tables: true
});
// without this cache, the code runs into some infinite loop (https://github.com/angular/angular.js/issues/3980)
var cache = {};
return function (text) {
return converter.makeHtml(text);
if (cache[text]) return cache[text];
cache[text] = converter.makeHtml(text);
return cache[text];
};
});
@@ -284,58 +423,6 @@ app.filter('postInstallMessage', function () {
};
});
// keep this in sync with eventlog.js and CLI tool
var ACTION_ACTIVATE = 'cloudron.activate';
var ACTION_APP_CONFIGURE = 'app.configure';
var ACTION_APP_INSTALL = 'app.install';
var ACTION_APP_RESTORE = 'app.restore';
var ACTION_APP_UNINSTALL = 'app.uninstall';
var ACTION_APP_UPDATE = 'app.update';
var ACTION_APP_LOGIN = 'app.login';
var ACTION_BACKUP_FINISH = 'backup.finish';
var ACTION_BACKUP_START = 'backup.start';
var ACTION_BACKUP_CLEANUP = 'backup.cleanup';
var ACTION_CERTIFICATE_RENEWAL = 'certificate.renew';
var ACTION_CLI_MODE = 'settings.climode';
var ACTION_START = 'cloudron.start';
var ACTION_UPDATE = 'cloudron.update';
var ACTION_USER_ADD = 'user.add';
var ACTION_USER_LOGIN = 'user.login';
var ACTION_USER_REMOVE = 'user.remove';
var ACTION_USER_UPDATE = 'user.update';
app.filter('eventLogDetails', function() {
// NOTE: if you change this, the CLI tool (cloudron machine eventlog) probably needs fixing as well
return function(eventLog) {
var source = eventLog.source;
var data = eventLog.data;
var errorMessage = data.errorMessage;
switch (eventLog.action) {
case ACTION_ACTIVATE: return 'Cloudron activated';
case ACTION_APP_CONFIGURE: return 'App ' + data.appId + ' was configured';
case ACTION_APP_INSTALL: return 'App ' + data.manifest.id + '@' + data.manifest.version + ' installed at ' + data.location + ' with id ' + data.appId;
case ACTION_APP_RESTORE: return 'App ' + data.appId + ' restored';
case ACTION_APP_UNINSTALL: return 'App ' + data.appId + ' uninstalled';
case ACTION_APP_UPDATE: return 'App ' + data.appId + ' updated to version ' + data.toManifest.id + '@' + data.toManifest.version;
case ACTION_APP_LOGIN: return 'App ' + data.appId + ' logged in';
case ACTION_BACKUP_START: return 'Backup started';
case ACTION_BACKUP_FINISH: return 'Backup finished. ' + (errorMessage ? ('error: ' + errorMessage) : ('id: ' + data.filename));
case ACTION_BACKUP_CLEANUP: return 'Backup ' + data.backup.id + ' removed';
case ACTION_CERTIFICATE_RENEWAL: return 'Certificate renewal for ' + data.domain + (errorMessage ? ' failed' : 'succeeded');
case ACTION_CLI_MODE: return 'CLI mode was ' + (data.enabled ? 'enabled' : 'disabled');
case ACTION_START: return 'Cloudron started with version ' + data.version;
case ACTION_UPDATE: return 'Updating to version ' + data.boxUpdateInfo.version;
case ACTION_USER_ADD: return 'User ' + data.email + ' added with id ' + data.userId;
case ACTION_USER_LOGIN: return 'User ' + data.userId + ' logged in';
case ACTION_USER_REMOVE: return 'User ' + data.userId + ' removed';
case ACTION_USER_UPDATE: return 'User ' + data.userId + ' updated';
default: return eventLog.action;
}
};
});
// custom directive for dynamic names in forms
// See http://stackoverflow.com/questions/23616578/issue-registering-form-control-with-interpolated-name#answer-23617401
app.directive('laterName', function () { // (2)
@@ -375,7 +462,7 @@ app.run(['$route', '$rootScope', '$location', function ($route, $rootScope, $loc
app.directive('ngClickSelect', function () {
return {
restrict: 'AC',
link: function (scope, element, attrs) {
link: function (scope, element/*, attrs */) {
element.bind('click', function () {
var selection = window.getSelection();
var range = document.createRange();
@@ -416,7 +503,8 @@ app.directive('tagInput', function () {
scope: {
inputTags: '=taglist'
},
link: function ($scope, element, attrs) {
require: '^form',
link: function ($scope, element, attrs, formCtrl) {
$scope.defaultWidth = 200;
$scope.tagText = ''; // current tag being edited
$scope.placeholder = attrs.placeholder;
@@ -424,18 +512,20 @@ app.directive('tagInput', function () {
if ($scope.inputTags === undefined) {
return [];
}
return $scope.inputTags.split(',').filter(function (tag) {
return $scope.inputTags.split(' ').filter(function (tag) {
return tag !== '';
});
};
$scope.addTag = function () {
var tagArray;
if ($scope.tagText.length === 0) {
return;
var tagArray = $scope.tagArray();
// prevent adding empty or existing items
if ($scope.tagText.length === 0 || tagArray.indexOf($scope.tagText) !== -1) {
return $scope.tagText = '';
}
tagArray = $scope.tagArray();
tagArray.push($scope.tagText);
$scope.inputTags = tagArray.join(',');
$scope.inputTags = tagArray.join(' ');
return $scope.tagText = '';
};
$scope.deleteTag = function (key) {
@@ -448,7 +538,8 @@ app.directive('tagInput', function () {
tagArray.splice(key, 1);
}
}
return $scope.inputTags = tagArray.join(',');
formCtrl.$setDirty();
return $scope.inputTags = tagArray.join(' ');
};
$scope.$watch('tagText', function (newVal, oldVal) {
var tempEl;
@@ -461,6 +552,9 @@ app.directive('tagInput', function () {
return tempEl.remove();
}
});
element.bind('click', function () {
element[0].firstChild.lastChild.focus();
});
element.bind('keydown', function (e) {
var key = e.which;
if (key === 9 || key === 13) {
@@ -472,7 +566,7 @@ app.directive('tagInput', function () {
});
element.bind('keyup', function (e) {
var key = e.which;
if (key === 9 || key === 13 || key === 32 || key === 188) {
if (key === 9 || key === 13 || key === 32) {
e.preventDefault();
return $scope.$apply('addTag()');
}
@@ -480,9 +574,9 @@ app.directive('tagInput', function () {
},
template:
'<div class="tag-input-container">' +
'<div class="input-tag" data-ng-repeat="tag in tagArray()">' +
'{{tag}}' +
'<div class="delete-tag" data-ng-click="deleteTag($index)">&times;</div>' +
'<div class="btn-group input-tag" data-ng-repeat="tag in tagArray()">' +
'<button type="button" class="btn btn-xs btn-primary" disabled>{{ tag }}</button>' +
'<button type="button" class="btn btn-xs btn-primary" data-ng-click="deleteTag($index)">&times;</button>' +
'</div>' +
'<input type="text" data-ng-model="tagText" ng-blur="addTag()" placeholder="{{placeholder}}"/>' +
'</div>'
+149
View File
@@ -0,0 +1,149 @@
'use strict';
/* global angular, $, showdown */
// create main application module
var app = angular.module('Application', []);
app.filter('markdown2html', function () {
var converter = new showdown.Converter({
extensions: [ 'targetblank' ],
simplifiedAutoLink: true,
strikethrough: true,
tables: true
});
return function (text) {
return converter.makeHtml(text);
};
});
// disable sce for footer https://code.angularjs.org/1.5.8/docs/api/ng/service/$sce
app.config(function ($sceProvider) {
$sceProvider.enabled(false);
});
app.controller('LoginController', ['$scope', '$http', function ($scope, $http) {
// Stupid angular location provider either wants html5 location mode or not, do the query parsing on my own
var search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.indexOf('=') === -1 ? [item, true] : [item.slice(0, item.indexOf('=')), item.slice(item.indexOf('=')+1)]; }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
$scope.initialized = false;
$scope.mode = '';
$scope.busy = false;
$scope.error = false;
$scope.status = null;
$scope.username = '';
$scope.password = '';
$scope.totpToken = '';
$scope.passwordResetIdentifier = '';
$scope.newPassword = '';
$scope.newPasswordRepeat = '';
var API_ORIGIN = '<%= apiOrigin %>' || window.location.origin;
$scope.onLogin = function () {
$scope.busy = true;
$scope.error = false;
var data = {
username: $scope.username,
password: $scope.password,
totpToken: $scope.totpToken
};
function error() {
$scope.busy = false;
$scope.error = true;
$scope.password = '';
$scope.loginForm.$setPristine();
setTimeout(function () { $('#inputPassword').focus(); }, 200);
}
$http.post(API_ORIGIN + '/api/v1/cloudron/login', data).success(function (data, status) {
if (status !== 200) return error();
localStorage.token = data.accessToken;
window.location.href = search.returnTo || '/';
}).error(error);
};
$scope.onPasswordReset = function () {
$scope.busy = true;
var data = {
identifier: $scope.passwordResetIdentifier
};
function done() {
$scope.busy = false;
$scope.mode = 'passwordResetDone';
}
$http.post(API_ORIGIN + '/api/v1/cloudron/password_reset_request', data).success(done).error(done);
};
$scope.onNewPassword = function () {
$scope.busy = true;
var data = {
resetToken: search.resetToken,
password: $scope.newPassword
};
function error(status) {
console.log('error', status)
$scope.busy = false;
if (status === 401) $scope.error = 'Invalid reset token';
else if (status === 409) $scope.error = 'Ask your admin for an invite link first';
else $scope.error = 'Unknown error';
}
$http.post(API_ORIGIN + '/api/v1/cloudron/password_reset', data).success(function (data, status) {
if (status !== 202) return error(status);
// set token to autologin
localStorage.token = data.accessToken;
$scope.mode = 'newPasswordDone';
}).error(function (data, status) {
error(status);
});
};
$scope.showPasswordReset = function () {
window.document.title = 'Password Reset';
$scope.mode = 'passwordReset';
$scope.passwordResetIdentifier = '';
setTimeout(function () { $('#inputPasswordResetIdentifier').focus(); }, 200);
};
$scope.showLogin = function () {
if ($scope.status) window.document.title = $scope.status.cloudronName + ' Login';
$scope.mode = 'login';
$scope.error = false;
setTimeout(function () { $('#inputUsername').focus(); }, 200);
};
$scope.showNewPassword = function () {
window.document.title = 'Set New Password';
$scope.mode = 'newPassword';
setTimeout(function () { $('#inputNewPassword').focus(); }, 200);
};
$http.get(API_ORIGIN + '/api/v1/cloudron/status').success(function (data, status) {
$scope.initialized = true;
if (status !== 200) return;
if ($scope.mode === 'login') window.document.title = data.cloudronName + ' Login';
$scope.status = data;
}).error(function () {
$scope.initialized = false;
});
// Init into the correct view
if (search.passwordReset) $scope.showPasswordReset();
else if (search.resetToken) $scope.showNewPassword();
else $scope.showLogin();
}]);
+190
View File
@@ -0,0 +1,190 @@
'use strict';
/* global angular */
/* global moment */
/* global $ */
// create main application module
var app = angular.module('Application', ['angular-md5', 'ui-notification']);
app.controller('LogsController', ['$scope', 'Client', function ($scope, Client) {
var search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.split('='); }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
$scope.initialized = false;
$scope.client = Client;
$scope.selected = '';
$scope.activeEventSource = null;
$scope.lines = 100;
$scope.selectedAppInfo = null;
$scope.selectedTaskInfo = null;
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
$scope.clear = function () {
var logViewer = $('.logs-container');
logViewer.empty();
};
// https://github.com/janl/mustache.js/blob/master/mustache.js#L60
var entityMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#39;',
'/': '&#x2F;',
'`': '&#x60;',
'=': '&#x3D;'
};
function escapeHtml(string) {
return String(string).replace(/[&<>"'`=\/]/g, function fromEntityMap (s) {
return entityMap[s];
});
}
function showLogs() {
if (!$scope.selected) return;
var func;
if ($scope.selected.type === 'platform') func = Client.getPlatformLogs;
else if ($scope.selected.type === 'service') func = Client.getServiceLogs;
else if ($scope.selected.type === 'task') func = Client.getTaskLogs;
else if ($scope.selected.type === 'app') func = Client.getAppLogs;
func($scope.selected.value, true /* follow */, $scope.lines, function handleLogs(error, result) {
if (error) return console.error(error);
$scope.activeEventSource = result;
result.onmessage = function handleMessage(message) {
var data;
try {
data = JSON.parse(message.data);
} catch (e) {
return console.error(e);
}
// check if we want to auto scroll (this is before the appending, as that skews the check)
var tmp = $('.logs-container');
var autoScroll = tmp[0].scrollTop > (tmp[0].scrollHeight - tmp.innerHeight() - 24);
var logLine = $('<div class="log-line">');
// realtimeTimestamp is 0 if line is blank or some parse error
var timeString = data.realtimeTimestamp ? moment(data.realtimeTimestamp/1000).format('MMM DD HH:mm:ss') : '';
logLine.html('<span class="time">' + timeString + ' </span>' + window.ansiToHTML(escapeHtml(typeof data.message === 'string' ? data.message : ab2str(data.message))));
tmp.append(logLine);
if (autoScroll) tmp[0].lastChild.scrollIntoView({ behavior: 'instant', block: 'end' });
};
});
}
function select(ids, callback) {
if (ids.id) {
var BUILT_IN_LOGS = [
{ name: 'Box', type: 'platform', value: 'box', url: Client.makeURL('/api/v1/cloudron/logs/box') },
{ name: 'Graphite', type: 'service', value: 'graphite', url: Client.makeURL('/api/v1/services/graphite/logs') },
{ name: 'MongoDB', type: 'service', value: 'mongodb', url: Client.makeURL('/api/v1/services/mongodb/logs') },
{ name: 'MySQL', type: 'service', value: 'mysql', url: Client.makeURL('/api/v1/services/mysql/logs') },
{ name: 'PostgreSQL', type: 'service', value: 'postgresql', url: Client.makeURL('/api/v1/services/postgresql/logs') },
{ name: 'Mail', type: 'service', value: 'mail', url: Client.makeURL('/api/v1/services/mail/logs') },
{ name: 'Docker', type: 'service', value: 'docker', url: Client.makeURL('/api/v1/services/docker/logs') },
{ name: 'Nginx', type: 'service', value: 'nginx', url: Client.makeURL('/api/v1/services/nginx/logs') },
{ name: 'Unbound', type: 'service', value: 'unbound', url: Client.makeURL('/api/v1/services/unbound/logs') },
{ name: 'SFTP', type: 'service', value: 'sftp', url: Client.makeURL('/api/v1/services/sftp/logs') },
{ name: 'TURN/STUN', type: 'service', value: 'turn', url: Client.makeURL('/api/v1/services/turn/logs') },
];
$scope.selected = BUILT_IN_LOGS.find(function (e) { return e.value === ids.id; });
callback();
} else if (ids.crashId) {
$scope.selected = {
type: 'platform',
value: 'crash-' + ids.crashId,
name: 'Crash',
url: Client.makeURL('/api/v1/cloudron/logs/crash-' + ids.crashId)
};
callback();
} else if (ids.appId) {
Client.getApp(ids.appId, function (error, app) {
if (error) return callback(error);
$scope.selectedAppInfo = app;
$scope.selected = {
type: 'app',
value: app.id,
name: app.fqdn + ' (' + app.manifest.title + ')',
url: Client.makeURL('/api/v1/apps/' + app.id + '/logs'),
addons: app.manifest.addons
};
callback();
});
} else if (ids.taskId) {
Client.getTask(ids.taskId, function (error, task) {
if (error) return callback(error);
$scope.selectedTaskInfo = task;
$scope.selected = {
type: 'task',
value: task.id,
name: task.type,
url: Client.makeURL('/api/v1/tasks/' + task.id + '/logs')
};
callback();
});
}
}
function init() {
Client.getStatus(function (error, status) {
if (error) return Client.initError(error, init);
if (!status.activated) {
console.log('Not activated yet, redirecting', status);
window.location.href = '/';
return;
}
// check version and force reload if needed
if (!localStorage.version) {
localStorage.version = status.version;
} else if (localStorage.version !== status.version) {
localStorage.version = status.version;
window.location.reload(true);
}
console.log('Running log version ', localStorage.version);
// get user profile as the first thing. this populates the "scope" and affects subsequent API calls
Client.refreshUserInfo(function (error) {
if (error) return Client.initError(error, init);
Client.refreshConfig(function (error) {
if (error) return Client.initError(error, init);
select({ id: search.id, taskId: search.taskId, appId: search.appId, crashId: search.crashId }, function (error) {
if (error) return Client.initError(error, init);
// now mark the Client to be ready
Client.setReady();
$scope.initialized = true;
showLogs();
});
});
});
});
}
init();
}]);
+140
View File
@@ -0,0 +1,140 @@
'use strict';
/* global angular */
/* global $ */
angular.module('Application').controller('MainController', ['$scope', '$route', '$timeout', '$location', 'Client', function ($scope, $route, $timeout, $location, Client) {
$scope.initialized = false; // used to animate the UI
$scope.user = Client.getUserInfo();
$scope.installedApps = Client.getInstalledApps();
$scope.config = {};
$scope.client = Client;
$scope.subscription = {};
$scope.notifications = [];
$scope.hideNavBarActions = $location.path() === '/logs';
$scope.isActive = function (url) {
if (!$route.current) return false;
return $route.current.$$route.originalPath.indexOf(url) === 0;
};
$scope.logout = function (event) {
event.stopPropagation();
$scope.initialized = false;
Client.logout();
};
$scope.openSubscriptionSetup = function () {
Client.openSubscriptionSetup($scope.subscription);
};
// NOTE: this function is exported and called from the appstore.js
$scope.updateSubscriptionStatus = function () {
if (!Client.getUserInfo().isAtLeastAdmin) return;
Client.getSubscription(function (error, subscription) {
if (error && error.statusCode === 412) return; // ignore if not yet registered
if (error && error.statusCode === 402) return; // ignore if not yet registered
if (error) return console.error(error);
$scope.subscription = subscription;
});
};
function refreshNotifications(poll) {
Client.getNotifications(false, 1, 100, function (error, results) {
if (error) console.error(error);
else $scope.notifications = results;
if (poll) $timeout(refreshNotifications, 60 * 1000);
});
}
// update state of acknowledged notification
$scope.notificationAcknowledged = function (notificationId) {
// remove notification from list
$scope.notifications = $scope.notifications.filter(function (n) { return n.id !== notificationId; });
};
function init() {
Client.getStatus(function (error, status) {
if (error) return Client.initError(error, init);
// WARNING if anything about the routing is changed here test these use-cases:
//
// 1. Caas
// 3. selfhosted restore
// 4. local development with gulp develop
if (!status.activated) {
console.log('Not activated yet, redirecting', status);
if (status.restore.active || status.restore.errorMessage) { // show the error message in restore page
window.location.href = '/restore.html';
} else {
window.location.href = status.adminFqdn ? '/setup.html' : '/setupdns.html';
}
return;
}
// support local development with localhost check
if (window.location.hostname !== status.adminFqdn && window.location.hostname !== 'localhost') {
// user is accessing by IP or by the old admin location (pre-migration)
window.location.href = '/setupdns.html';
return;
}
// check version and force reload if needed
if (!localStorage.version) {
localStorage.version = status.version;
} else if (localStorage.version !== status.version) {
localStorage.version = status.version;
window.location.reload(true);
}
console.log('Running dashboard version ', localStorage.version);
// get user profile as the first thing. this populates the "scope" and affects subsequent API calls
Client.refreshUserInfo(function (error) {
if (error) return Client.initError(error, init);
Client.refreshConfig(function (error) {
if (error) return Client.initError(error, init);
Client.refreshInstalledApps(function (error) {
if (error) return Client.initError(error, init);
// now mark the Client to be ready
Client.setReady();
$scope.config = Client.getConfig();
$scope.initialized = true;
refreshNotifications(true);
$scope.updateSubscriptionStatus();
});
});
});
});
}
Client.onConfig(function (config) {
if (config.cloudronName) {
document.title = config.cloudronName;
}
});
Client.onReconnect(function () {
refreshNotifications(false);
});
init();
// setup all the dialog focus handling
['updateModal'].forEach(function (id) {
$('#' + id).on('shown.bs.modal', function () {
$(this).find('[autofocus]:first').focus();
});
});
}]);
+163 -25
View File
@@ -1,9 +1,11 @@
'use strict';
/* global angular */
/* global tld */
/* global $ */
// create main application module
var app = angular.module('Application', ['angular-md5', 'ui-notification']);
var app = angular.module('Application', ['angular-md5', 'ui-notification', 'ui.bootstrap']);
app.filter('zoneName', function () {
return function (domain) {
@@ -11,11 +13,15 @@ app.filter('zoneName', function () {
};
});
app.controller('RestoreController', ['$scope', '$http', 'Client', function ($scope, $http, Client) {
app.controller('RestoreController', ['$scope', 'Client', function ($scope, Client) {
var search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.split('='); }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
$scope.client = Client;
$scope.busy = false;
$scope.error = {};
$scope.message = ''; // progress
// variables here have to match the import config logic!
$scope.provider = '';
$scope.bucket = '';
$scope.prefix = '';
@@ -29,10 +35,35 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
$scope.instanceId = '';
$scope.acceptSelfSignedCerts = false;
$scope.format = 'tgz';
$scope.advancedVisible = false;
$scope.password = '';
$scope.encrypted = false; // only used if a backup config contains that flag
$scope.sysinfo = {
provider: 'generic',
ip: '',
ifname: ''
};
$scope.sysinfoProvider = [
{ name: 'Public IP', value: 'generic' },
{ name: 'Static IP Address', value: 'fixed' },
{ name: 'Network Interface', value: 'network-interface' }
];
$scope.prettySysinfoProviderName = function (provider) {
switch (provider) {
case 'generic': return 'Public IP';
case 'fixed': return 'Static IP Address';
case 'network-interface': return 'Network Interface';
default: return 'Unknown';
}
};
// List is from http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region
$scope.s3Regions = [
{ name: 'Asia Pacific (Mumbai)', value: 'ap-south-1' },
{ name: 'Asia Pacific (Osaka-Local)', value: 'ap-northeast-3' },
{ name: 'Asia Pacific (Seoul)', value: 'ap-northeast-2' },
{ name: 'Asia Pacific (Singapore)', value: 'ap-southeast-1' },
{ name: 'Asia Pacific (Sydney)', value: 'ap-southeast-2' },
@@ -41,6 +72,8 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
{ name: 'EU (Frankfurt)', value: 'eu-central-1' },
{ name: 'EU (Ireland)', value: 'eu-west-1' },
{ name: 'EU (London)', value: 'eu-west-2' },
{ name: 'EU (Paris)', value: 'eu-west-3' },
{ name: 'EU (Stockholm)', value: 'eu-north-1' },
{ name: 'South America (São Paulo)', value: 'sa-east-1' },
{ name: 'US East (N. Virginia)', value: 'us-east-1' },
{ name: 'US East (Ohio)', value: 'us-east-2' },
@@ -50,18 +83,58 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
$scope.doSpacesRegions = [
{ name: 'AMS3', value: 'https://ams3.digitaloceanspaces.com' },
{ name: 'FRA1', value: 'https://fra1.digitaloceanspaces.com' },
{ name: 'NYC3', value: 'https://nyc3.digitaloceanspaces.com' },
{ name: 'SFO2', value: 'https://sfo2.digitaloceanspaces.com' },
{ name: 'SGP1', value: 'https://sgp1.digitaloceanspaces.com' }
];
$scope.exoscaleSosRegions = [
{ name: 'AT-VIE-1', value: 'https://sos-at-vie-1.exo.io' },
{ name: 'CH-DK-2', value: 'https://sos-ch-dk-2.exo.io' },
{ name: 'CH-GVA-2', value: 'https://sos-ch-gva-2.exo.io' },
{ name: 'DE-FRA-1', value: 'https://sos-de-fra-1.exo.io' },
];
// https://www.scaleway.com/docs/object-storage-feature/
$scope.scalewayRegions = [
{ name: 'FR-PAR', value: 'https://s3.fr-par.scw.cloud', region: 'fr-par' }, // default
{ name: 'NL-AMS', value: 'https://s3.nl-ams.scw.cloud', region: 'nl-ams' }
];
$scope.linodeRegions = [
{ name: 'Newark', value: 'us-east-1.linodeobjects.com', region: 'us-east-1' }, // default
{ name: 'Frankfurt', value: 'eu-central-1.linodeobjects.com', region: 'us-east-1' },
];
$scope.ovhRegions = [
{ name: 'Beauharnois (BHS)', value: 'https://s3.bhs.cloud.ovh.net', region: 'bhs' }, // default
{ name: 'Frankfurt (DE)', value: 'https://s3.de.cloud.ovh.net', region: 'de' },
{ name: 'Gravelines (GRA)', value: 'https://s3.gra.cloud.ovh.net', region: 'gra' },
{ name: 'Strasbourg (SBG)', value: 'https://s3.sbg.cloud.ovh.net', region: 'sbg' },
{ name: 'London (UK)', value: 'https://s3.uk.cloud.ovh.net', region: 'uk' },
{ name: 'Warsaw (WAW)', value: 'https://s3.waw.cloud.ovh.net', region: 'waw' },
];
$scope.wasabiRegions = [
{ name: 'EU Central 1', value: 'https://s3.eu-central-1.wasabisys.com' },
{ name: 'US East 1', value: 'https://s3.us-east-1.wasabisys.com' },
{ name: 'US East 2', value: 'https://s3.us-east-2.wasabisys.com ' },
{ name: 'US West 1', value: 'https://s3.us-west-1.wasabisys.com' }
];
$scope.storageProvider = [
{ name: 'Amazon S3', value: 's3' },
{ name: 'DigitalOcean Spaces', value: 'digitalocean-spaces' },
{ name: 'Exoscale SOS', value: 'exoscale-sos' },
{ name: 'Filesystem', value: 'filesystem' },
{ name: 'Google Cloud Storage', value: 'gcs' },
{ name: 'Linode Object Storage', value: 'linode-objectstorage' },
{ name: 'Minio', value: 'minio' },
{ name: 'OVH Object Storage', value: 'ovh-objectstorage' },
{ name: 'Scaleway Object Storage', value: 'scaleway-objectstorage' },
{ name: 'S3 API Compatible (v4)', value: 's3-v4-compat' },
{ name: 'Wasabi', value: 'wasabi' }
];
$scope.formats = [
@@ -70,7 +143,9 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
];
$scope.s3like = function (provider) {
return provider === 's3' || provider === 'minio' || provider === 's3-v4-compat' || provider === 'exoscale-sos' || provider === 'digitalocean-spaces';
return provider === 's3' || provider === 'minio' || provider === 's3-v4-compat' || provider === 'exoscale-sos'
|| provider === 'digitalocean-spaces' || provider === 'wasabi' || provider === 'scaleway-objectstorage'
|| provider === 'linode-objectstorage' || provider === 'ovh-objectstorage';
};
$scope.restore = function () {
@@ -79,9 +154,9 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
var backupConfig = {
provider: $scope.provider,
key: $scope.key,
format: $scope.format
};
if ($scope.password) backupConfig.password = $scope.password;
// only set provider specific fields, this will clear them in the db
if ($scope.s3like(backupConfig.provider)) {
@@ -94,13 +169,25 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
if (backupConfig.provider === 's3') {
if ($scope.region) backupConfig.region = $scope.region;
delete backupConfig.endpoint;
} else if (backupConfig.provider === 'minio' || backupConfig.provider === 's3-v4-compat') {
backupConfig.region = 'us-east-1';
backupConfig.acceptSelfSignedCerts = $scope.acceptSelfSignedCerts;
} else if (backupConfig.provider === 'exoscale-sos') {
backupConfig.endpoint = 'https://sos-ch-dk-2.exo.io';
backupConfig.region = 'us-east-1';
backupConfig.signatureVersion = 'v4';
} else if (backupConfig.provider === 'wasabi') {
backupConfig.region = $scope.wasabiRegions.find(function (x) { return x.value === $scope.endpoint; }).region;
backupConfig.signatureVersion = 'v4';
} else if (backupConfig.provider === 'scaleway-objectstorage') {
backupConfig.region = $scope.scalewayRegions.find(function (x) { return x.value === $scope.endpoint; }).region;
backupConfig.signatureVersion = 'v4';
} else if (backupConfig.provider === 'linode-objectstorage') {
backupConfig.region = $scope.linodeRegions.find(function (x) { return x.value === $scope.endpoint; }).region;
backupConfig.signatureVersion = 'v4';
} else if (backupConfig.provider === 'ovh-objectstorage') {
backupConfig.region = $scope.ovhRegions.find(function (x) { return x.value === $scope.endpoint; }).region;
backupConfig.signatureVersion = 'v4';
} else if (backupConfig.provider === 'digitalocean-spaces') {
backupConfig.region = 'us-east-1';
}
@@ -135,6 +222,13 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
return;
}
if ($scope.backupId.indexOf('box') === -1) {
$scope.error.generic = 'Backup id must contain "box"';
$scope.error.backupId = true;
$scope.busy = false;
return;
}
var version = $scope.backupId.match(/_v(\d+.\d+.\d+)/);
if (!version) {
$scope.error.generic = 'Backup id is missing version information';
@@ -143,11 +237,20 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
return;
}
Client.restore(backupConfig, $scope.backupId.replace(/\.tar\.gz(\.enc)?$/, ''), version ? version[1] : '', function (error) {
var sysinfoConfig = {
provider: $scope.sysinfo.provider
};
if ($scope.sysinfo.provider === 'fixed') {
sysinfoConfig.ip = $scope.sysinfo.ip;
} else if ($scope.sysinfo.provider === 'network-interface') {
sysinfoConfig.ifname = $scope.sysinfo.ifname;
}
Client.restore(backupConfig, $scope.backupId.replace(/\.tar\.gz(\.enc)?$/, ''), version ? version[1] : '', sysinfoConfig, function (error) {
$scope.busy = false;
if (error) {
if (error.statusCode === 402) {
if (error.statusCode === 424) {
$scope.error.generic = error.message;
if (error.message.indexOf('AWS Access Key Id') !== -1) {
@@ -169,12 +272,12 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
$scope.error.generic = 'Unknown region';
$scope.error.region = true;
$scope.configureBackupForm.region.$setPristine();
$('#inputConfigureBackupRegion').focus();
$('#inputConfigureBackupDORegion').focus();
} else if (error.message.toLowerCase() === 'wrong region') {
$scope.error.generic = 'Wrong S3 Region';
$scope.error.region = true;
$scope.configureBackupForm.region.$setPristine();
$('#inputConfigureBackupRegion').focus();
$('#inputConfigureBackupS3Region').focus();
} else {
$('#inputConfigureBackupBucket').focus();
}
@@ -187,16 +290,24 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
waitForRestore();
});
}
};
function waitForRestore() {
$scope.busy = true;
Client.getStatus(function (error, status) {
if (!error && !status.webadminStatus.restoring) {
window.location.href = '/';
if (!error && !status.restore.active) { // restore finished
if (status.restore.errorMessage) {
$scope.busy = false;
$scope.error.generic = status.restore.errorMessage;
} else { // restore worked, redirect to admin page
window.location.href = '/';
}
return;
}
$scope.message = status.restore.message;
setTimeout(waitForRestore, 5000);
});
}
@@ -219,20 +330,47 @@ app.controller('RestoreController', ['$scope', '$http', 'Client', function ($sco
document.getElementById('gcsKeyFileInput').onchange = readFileLocally($scope.gcsKey, 'content', 'keyFileName');
Client.getStatus(function (error, status) {
if (error) {
window.location.href = '/error.html';
return;
}
document.getElementById('backupConfigFileInput').onchange = function (event) {
var reader = new FileReader();
reader.onload = function (result) {
if (!result.target || !result.target.result) return console.error('Unable to read backup config');
if (status.restoring) return waitForRestore();
var backupConfig;
try {
backupConfig = JSON.parse(result.target.result);
} catch (e) {
console.error('Unable to parse backup config');
return;
}
if (status.activated) {
window.location.href = '/';
return;
}
$scope.$apply(function () {
// we assume property names match here, this does not yet work for gcs keys
Object.keys(backupConfig).forEach(function (k) {
if (k in $scope) $scope[k] = backupConfig[k];
});
});
};
reader.readAsText(event.target.files[0]);
};
$scope.instanceId = search.instanceId;
$scope.initialized = true;
});
function init() {
Client.getStatus(function (error, status) {
if (error) return Client.initError(error, init);
if (status.restore.active) return waitForRestore();
if (status.restore.errorMessage) $scope.error.generic = status.restore.errorMessage;
if (status.activated) {
window.location.href = '/';
return;
}
$scope.status = status;
$scope.instanceId = search.instanceId;
$scope.initialized = true;
});
}
init();
}]);
+105
View File
@@ -0,0 +1,105 @@
'use strict';
/* global angular */
/* global $ */
// create main application module
var app = angular.module('Application', ['angular-md5', 'ui-notification', 'ui.bootstrap']);
app.controller('SetupController', ['$scope', 'Client', function ($scope, Client) {
// Stupid angular location provider either wants html5 location mode or not, do the query parsing on my own
var search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.split('='); }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
$scope.client = Client;
$scope.view = '';
$scope.initialized = false;
$scope.apiServerOrigin = '';
$scope.webServerOrigin = '';
$scope.owner = {
error: null,
busy: false,
email: '',
displayName: '',
username: '',
password: '',
submit: function () {
$scope.owner.busy = true;
$scope.owner.error = null;
Client.createAdmin($scope.owner.username, $scope.owner.password, $scope.owner.email, $scope.owner.displayName, function (error) {
if (error && error.statusCode === 400) {
$scope.owner.busy = false;
$scope.owner.error = { username: error.message };
$scope.owner.username = '';
$scope.ownerForm.username.$setPristine();
setTimeout(function () { $('#inputUsername').focus(); }, 200);
return;
} else if (error) {
$scope.owner.busy = false;
console.error('Internal error', error);
$scope.owner.error = { generic: error.message };
return;
}
setView('finished');
});
}
};
function redirectIfNeeded(status) {
if ('develop' in search || localStorage.getItem('develop')) {
console.warn('Cloudron develop mode on. To disable run localStorage.removeItem(\'develop\')');
localStorage.setItem('develop', true);
return;
}
// if we are here from the ip first go to the real domain if already setup
if (status.adminFqdn && status.adminFqdn !== window.location.hostname) {
window.location.href = 'https://' + status.adminFqdn + '/setup.html';
return;
}
// if we don't have a domain yet, first go to domain setup
if (!status.adminFqdn) {
window.location.href = '/setupdns.html';
return;
}
if (status.activated) {
window.location.href = '/';
return;
}
}
function setView(view) {
if (view === 'finished') {
$scope.view = 'finished';
} else {
$scope.view = 'owner';
}
}
function init() {
Client.getStatus(function (error, status) {
if (error) return Client.initError(error, init);
redirectIfNeeded(status);
setView(search.view);
$scope.apiServerOrigin = status.apiServerOrigin;
$scope.webServerOrigin = status.webServerOrigin;
$scope.initialized = true;
// Ensure we have a good autofocus
setTimeout(function () {
$(document).find("[autofocus]:first").focus();
}, 250);
});
}
init();
}]);
+101
View File
@@ -0,0 +1,101 @@
'use strict';
/* global angular, $, showdown */
// create main application module
var app = angular.module('Application', []);
app.filter('markdown2html', function () {
var converter = new showdown.Converter({
extensions: [ 'targetblank' ],
simplifiedAutoLink: true,
strikethrough: true,
tables: true
});
return function (text) {
return converter.makeHtml(text);
};
});
// disable sce for footer https://code.angularjs.org/1.5.8/docs/api/ng/service/$sce
app.config(function ($sceProvider) {
$sceProvider.enabled(false);
});
app.controller('SetupAccountController', ['$scope', '$http', function ($scope, $http) {
// Stupid angular location provider either wants html5 location mode or not, do the query parsing on my own
var search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.indexOf('=') === -1 ? [item, true] : [item.slice(0, item.indexOf('=')), item.slice(item.indexOf('=')+1)]; }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
var API_ORIGIN = '<%= apiOrigin %>' || window.location.origin;
$scope.initialized = false;
$scope.busy = false;
$scope.error = null;
$scope.view = 'setup';
$scope.status = null;
$scope.existingUsername = !!search.username;
$scope.username = search.username || '';
$scope.displayName = search.displayName || '';
$scope.password = '';
$scope.passwordRepeat = '';
$scope.onSubmit = function () {
$scope.busy = true;
$scope.error = null;
var data = {
resetToken: search.resetToken,
email: search.email,
username: $scope.username,
displayName: $scope.displayName,
password: $scope.password
};
function error(data, status) {
$scope.busy = false;
if (status === 401) {
$scope.view = 'invalidToken';
} else if (status === 409) {
$scope.error = {
username: true,
message: 'Username already taken'
};
$scope.setupAccountForm.username.$setPristine();
setTimeout(function () { $('#inputUsername').focus(); }, 200);
} else if (status === 400) {
$scope.error = {
message: data.message
};
if (data.message.indexOf('Username') === 0) {
$scope.setupAccountForm.username.$setPristine();
$scope.error.username = true;
}
} else {
$scope.error = { message: 'Unknown error. Please try again later.' };
console.error(status, data);
}
}
$http.post(API_ORIGIN + '/api/v1/cloudron/setup_account', data).success(function (data, status) {
if (status !== 201) return error(data, status);
// set token to autologin
localStorage.token = data.accessToken;
$scope.view = 'done';
}).error(error);
};
$http.get(API_ORIGIN + '/api/v1/cloudron/status').success(function (data, status) {
$scope.initialized = true;
if (status !== 200) return;
$scope.status = data;
}).error(function () {
$scope.initialized = false;
});
}]);

Some files were not shown because too many files have changed in this diff Show More