improve(ui): polish settings options ui

This commit is contained in:
charlie
2021-02-27 17:04:48 +08:00
parent ace88231de
commit d18ee7f8c4
5 changed files with 321 additions and 217 deletions

View File

@@ -27,8 +27,8 @@
[:div
[:h1.title.mb-1
"Your email address:"]
[:div.mt-2.mb-4.relative.rounded-md.shadow-sm.max-w-xs
[:input#.form-input.block.w-full.pl-2.sm:text-sm.sm:leading-5
[:div.mt-2.mb-4.relative.rounded-md.max-w-xs
[:input#.form-input.is-small
{:autoFocus true
:on-change (fn [e]
(reset! email (util/evalue e)))}]]]]
@@ -51,8 +51,8 @@
[:div
[:h1.title.mb-1
"Your cors address:"]
[:div.mt-2.mb-4.relative.rounded-md.shadow-sm.max-w-xs
[:input#.form-input.block.w-full.pl-2.sm:text-sm.sm:leading-5
[:div.mt-2.mb-4.relative.rounded-md.max-w-xs
[:input#.form-input.is-small
{:autoFocus true
:on-change (fn [e]
(reset! cors (util/evalue e)))}]]]]
@@ -68,13 +68,13 @@
(defn toggle
[label-for name state on-toggle]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for label-for}
name]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle state on-toggle)]]])
(ui/toggle state on-toggle true)]]])
(rum/defcs app-updater < rum/reactive
[state]
@@ -119,12 +119,12 @@
:important
[:p.text-gray-700 (t :user/delete-account-notice)])
[:div.mt-5.sm:mt-4.sm:flex.sm:flex-row-reverse
[:span.flex.w-full.rounded-md.shadow-sm.sm:ml-3.sm:w-auto
[:span.flex.w-full.rounded-md.sm:ml-3.sm:w-auto
[:button.inline-flex.justify-center.w-full.rounded-md.border.border-transparent.px-4.py-2.bg-indigo-600.text-base.leading-6.font-medium.text-white.shadow-sm.hover:bg-indigo-500.focus:outline-none.focus:border-indigo-700.focus:shadow-outline-indigo.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5
{:type "button"
:on-click user-handler/delete-account!}
(t :user/delete-account)]]
[:span.mt-3.flex.w-full.rounded-md.shadow-sm.sm:mt-0.sm:w-auto
[:span.mt-3.flex.w-full.rounded-md.sm:mt-0.sm:w-auto
[:button.inline-flex.justify-center.w-full.rounded-md.border.border-gray-300.px-4.py-2.bg-white.text-base.leading-6.font-medium.text-gray-700.shadow-sm.hover:text-gray-500.focus:outline-none.focus:border-blue-300.focus:shadow-outline-blue.transition.ease-in-out.duration-150.sm:text-sm.sm:leading-5
{:type "button"
:on-click close-fn}
@@ -153,215 +153,223 @@
[:div#settings
[:h1.title (t :settings)]
[:div.mb-1.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5.pl-1
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "toggle_theme"}
(t :right-side-bar/switch-theme (string/capitalize switch-theme))]
[:div.flex.flex-row.mt-1.sm:mt-0.sm:col-span-2.pt-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle dark?
(fn []
(state/set-theme! switch-theme)))]
[:span.ml-4.opacity-50 "t t"]]]
[:div.panel-wrap
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "toggle_theme"}
(t :right-side-bar/switch-theme (string/capitalize switch-theme))]
[:div.flex.flex-row.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle dark?
(fn []
(state/set-theme! switch-theme))
true)]
[:span.ml-4.opacity-50.text-sm "t t"]]]
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5.pl-1
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "show_brackets"}
(t :settings-page/show-brackets)]
[:div.flex.flex-row.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle show-brackets?
config-handler/toggle-ui-show-brackets!)]
[:span.ml-4.opacity-50 "Ctrl-c Ctrl-b"]]]
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "show_brackets"}
(t :settings-page/show-brackets)]
[:div.flex.flex-row.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle show-brackets?
config-handler/toggle-ui-show-brackets!
true)]
[:span.ml-4.opacity-50.text-sm "Ctrl-c Ctrl-b"]]]
[:div.mb-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5.pl-1
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_language"}
(t :language)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [lang (util/evalue e)
lang-val (filter (fn [el] (if (= (:label el) lang) true nil)) dicts/languages)
lang-val (name (:value (first lang-val)))]
(state/set-preferred-language! lang-val)
(ui-handler/re-render-root!)))}
(for [language dicts/languages]
[:option (cond->
{:key (:value language)}
(= (name (:value language)) preferred-language)
(assoc :selected "selected"))
(:label language)])]]]]
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "preferred_language"}
(t :language)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md
[:select.form-select.is-small
{:on-change (fn [e]
(let [lang (util/evalue e)
lang-val (filter (fn [el] (if (= (:label el) lang) true nil)) dicts/languages)
lang-val (name (:value (first lang-val)))]
(state/set-preferred-language! lang-val)
(ui-handler/re-render-root!)))}
(for [language dicts/languages]
[:option (cond->
{:key (:value language)}
(= (name (:value language)) preferred-language)
(assoc :selected "selected"))
(:label language)])]]]]
[:div.pl-1
;; config.edn
;; config.edn
(when current-repo
[:a {:href (rfe/href :file {:path (config/get-config-path)})}
(t :settings-page/edit-config-edn)])
[:div.mt-5.text-sm
[:a {:href (rfe/href :file {:path (config/get-config-path)})
:on-click #(js/setTimeout (fn [] (ui-handler/toggle-settings-modal!)))}
(t :settings-page/edit-config-edn)]])]
[:hr]
[:hr]
[:div.mt-6.sm:mt-5
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_format"}
(t :settings-page/preferred-file-format)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [format (-> (util/evalue e)
(string/lower-case)
keyword)]
(user-handler/set-preferred-format! format)))}
(for [format [:org :markdown]]
[:option (cond->
{:key (name format)}
(= format preferred-format)
(assoc :selected "selected"))
(string/capitalize (name format))])]]]]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_workflow"}
(t :settings-page/preferred-workflow)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [workflow (-> (util/evalue e)
(string/lower-case)
keyword)
workflow (if (= workflow :now/later)
:now
:todo)]
(user-handler/set-preferred-workflow! workflow)))}
(for [workflow [:now :todo]]
[:option (cond->
{:key (name workflow)}
(= workflow preferred-workflow)
(assoc :selected "selected"))
(if (= workflow :now)
"NOW/LATER"
"TODO/DOING")])]]]]
[:div.panel-wrap
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "preferred_format"}
(t :settings-page/preferred-file-format)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md
[:select.form-select.is-small
{:on-change (fn [e]
(let [format (-> (util/evalue e)
(string/lower-case)
keyword)]
(user-handler/set-preferred-format! format)))}
(for [format [:org :markdown]]
[:option (cond->
{:key (name format)}
(= format preferred-format)
(assoc :selected "selected"))
(string/capitalize (name format))])]]]]
(toggle "enable_timetracking"
(t :settings-page/enable-timetracking)
enable-timetracking?
(fn []
(let [value (not enable-timetracking?)]
(config-handler/set-config! :feature/enable-timetracking? value))))
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "preferred_workflow"}
(t :settings-page/preferred-workflow)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md
[:select.form-select.is-small
{:on-change (fn [e]
(let [workflow (-> (util/evalue e)
(string/lower-case)
keyword)
workflow (if (= workflow :now/later)
:now
:todo)]
(user-handler/set-preferred-workflow! workflow)))}
(for [workflow [:now :todo]]
[:option (cond->
{:key (name workflow)}
(= workflow preferred-workflow)
(assoc :selected "selected"))
(if (= workflow :now)
"NOW/LATER"
"TODO/DOING")])]]]]
;; (toggle "enable_block_time"
;; (t :settings-page/enable-block-time)
;; enable-block-time?
;; (fn []
;; (let [value (not enable-block-time?)]
;; (config-handler/set-config! :feature/enable-block-time? value))))
(toggle "enable_timetracking"
(t :settings-page/enable-timetracking)
enable-timetracking?
(fn []
(let [value (not enable-timetracking?)]
(config-handler/set-config! :feature/enable-timetracking? value))))
(toggle "enable_journals"
(t :settings-page/enable-journals)
enable-journals?
(fn []
(let [value (not enable-journals?)]
(config-handler/set-config! :feature/enable-journals? value))))
;; (toggle "enable_block_time"
;; (t :settings-page/enable-block-time)
;; enable-block-time?
;; (fn []
;; (let [value (not enable-block-time?)]
;; (config-handler/set-config! :feature/enable-block-time? value))))
(when (not enable-journals?)
(toggle "enable_journals"
(t :settings-page/enable-journals)
enable-journals?
(fn []
(let [value (not enable-journals?)]
(config-handler/set-config! :feature/enable-journals? value))))
(when (not enable-journals?)
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "default page"}
(t :settings-page/home-default-page)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
[:input#home-default-page.form-input.is-small.transition.duration-150.ease-in-out
{:default-value (state/sub-default-home-page)
:on-blur (fn [event]
(let [value (util/evalue event)]
(cond
(string/blank? value)
(let [home (get (state/get-config) :default-home {})
new-home (dissoc home :page)]
(config-handler/set-config! :default-home new-home)
(notification/show! "Home default page updated successfully!" :success))
(page-handler/page-exists? (string/lower-case value))
(let [home (get (state/get-config) :default-home {})
new-home (assoc home :page value)]
(config-handler/set-config! :default-home new-home)
(notification/show! "Home default page updated successfully!" :success))
:else
(notification/show! "Please make sure the page exists!" :warning))))}]]]])
(toggle "enable_encryption"
(t :settings-page/enable-encryption)
enable-encryption?
(fn []
(let [value (not enable-encryption?)]
(config-handler/set-config! :feature/enable-encryption? value))))
(when (string/starts-with? current-repo "https://")
(toggle "enable_git_auto_push"
"Enable Git auto push"
enable-git-auto-push?
(fn []
(let [value (not enable-git-auto-push?)]
(config-handler/set-config! :git-auto-push value)))))]
[:hr]
[:div.panel-wrap
[:div.it.app-updater.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
(t :settings-page/current-version)]
[:div.wrap.sm:mt-0.sm:col-span-2
[:div.ver version]
(if (util/electron?) (app-updater))]]
[:div.it.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "developer_mode"}
(t :settings-page/developer-mode)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/button (if developer-mode? (t :settings-page/disable-developer-mode) (t :settings-page/enable-developer-mode))
:on-click #(state/set-developer-mode! (not developer-mode?)))]]]
[:div.text-sm.opacity-50
(t :settings-page/developer-mode-desc)]
(when logged?
[:div
(ui/admonition
:important
[:p (t :settings-page/dont-use-other-peoples-proxy-servers)
[:a {:href "https://github.com/isomorphic-git/cors-proxy"
:target "_blank"}
"https://github.com/isomorphic-git/cors-proxy"]])
[:div.mt-6.sm:mt-5.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "default page"}
(t :settings-page/home-default-page)]
[:label.block.text-sm.font-medium.leading-5.sm:mt-px..opacity-70
{:for "cors"}
(t :settings-page/custom-cors-proxy-server)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
[:input#pat.form-input.is-small.transition.duration-150.ease-in-out
{:default-value cors-proxy
:on-blur (fn [event]
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))
:on-key-press (fn [event]
(let [k (gobj/get event "key")]
(if (= "Enter" k)
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))))}]]]]])
(when logged?
[:div
[:hr]
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.opacity-70.text-red-600
{:for "delete account"}
(t :user/delete-account)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:input#home-default-page.form-input.block.w-full.transition.duration-150.ease-in-out.sm:text-sm.sm:leading-5
{:default-value (state/sub-default-home-page)
:on-blur (fn [event]
(let [value (util/evalue event)]
(cond
(string/blank? value)
(let [home (get (state/get-config) :default-home {})
new-home (dissoc home :page)]
(config-handler/set-config! :default-home new-home)
(notification/show! "Home default page updated successfully!" :success))
(ui/button (t :user/delete-your-account)
:on-click #(state/set-modal! delete-account-confirm))]]]])]])))
(page-handler/page-exists? (string/lower-case value))
(let [home (get (state/get-config) :default-home {})
new-home (assoc home :page value)]
(config-handler/set-config! :default-home new-home)
(notification/show! "Home default page updated successfully!" :success))
:else
(notification/show! "Please make sure the page exists!" :warning))))}]]]])
(toggle "enable_encryption"
(t :settings-page/enable-encryption)
enable-encryption?
(fn []
(let [value (not enable-encryption?)]
(config-handler/set-config! :feature/enable-encryption? value))))
(when (string/starts-with? current-repo "https://")
(toggle "enable_git_auto_push"
"Enable Git auto push"
enable-git-auto-push?
(fn []
(let [value (not enable-git-auto-push?)]
(config-handler/set-config! :git-auto-push value))))) [:hr]
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
(t :settings-page/current-version)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:p version]
(if (util/electron?) (app-updater))]]
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "developer_mode"}
(t :settings-page/developer-mode)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
(ui/button (if developer-mode? (t :settings-page/disable-developer-mode) (t :settings-page/enable-developer-mode))
:on-click #(state/set-developer-mode! (not developer-mode?)))]]]
[:br]
(t :settings-page/developer-mode-desc)
(when logged?
[:div
(ui/admonition
:important
[:p (t :settings-page/dont-use-other-peoples-proxy-servers)
[:a {:href "https://github.com/isomorphic-git/cors-proxy"
:target "_blank"}
"https://github.com/isomorphic-git/cors-proxy"]])
[:div.mt-6.sm:mt-5.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "cors"}
(t :settings-page/custom-cors-proxy-server)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:input#pat.form-input.block.w-full.transition.duration-150.ease-in-out.sm:text-sm.sm:leading-5
{:default-value cors-proxy
:on-blur (fn [event]
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))
:on-key-press (fn [event]
(let [k (gobj/get event "key")]
(if (= "Enter" k)
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))))}]]]]])
(when logged?
[:div
[:hr]
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70.text-red-600
{:for "delete account"}
(t :user/delete-account)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
(ui/button (t :user/delete-your-account)
:on-click #(state/set-modal! delete-account-confirm))]]]])]]])))