diff --git a/backend/resources/emails/change-email/en.mustache b/backend/resources/emails/change-email/en.mustache
index efae9b35f7..93ed9a5772 100644
--- a/backend/resources/emails/change-email/en.mustache
+++ b/backend/resources/emails/change-email/en.mustache
@@ -9,7 +9,7 @@ We received a request to change your current email to {{ pendingEmail }}.
Click to the link below to confirm the change:
-{{ publicUrl }}/#/auth/verify-token?token={{token}}
+{{ publicUri }}/#/auth/verify-token?token={{token}}
If you received this email by mistake, please consider changing your password
for security reasons.
diff --git a/backend/resources/emails/password-recovery/en.mustache b/backend/resources/emails/password-recovery/en.mustache
index c08997c515..f419e46a60 100644
--- a/backend/resources/emails/password-recovery/en.mustache
+++ b/backend/resources/emails/password-recovery/en.mustache
@@ -8,7 +8,7 @@ Hello {{name}}!
We received a request to reset your password. Click the link below to choose a
new one:
-{{ publicUrl }}/#/auth/recovery?token={{token}}
+{{ publicUri }}/#/auth/recovery?token={{token}}
If you received this email by mistake, you can safely ignore it. Your password
won't be changed.
diff --git a/backend/resources/emails/register/en.mustache b/backend/resources/emails/register/en.mustache
index 23992f8740..ff63fd0b78 100644
--- a/backend/resources/emails/register/en.mustache
+++ b/backend/resources/emails/register/en.mustache
@@ -8,7 +8,7 @@ Hello {{name}}!
Thanks for signing up for your UXBOX account! Please verify your email using the
link below adn get started building mockups and prototypes today!
-{{ publicUrl }}/#/auth/verify-token?token={{token}}
+{{ publicUri }}/#/auth/verify-token?token={{token}}
Enjoy!
The UXBOX team.
diff --git a/backend/src/uxbox/emails.clj b/backend/src/uxbox/emails.clj
index 901e1fb9e9..28077838c8 100644
--- a/backend/src/uxbox/emails.clj
+++ b/backend/src/uxbox/emails.clj
@@ -22,9 +22,11 @@
;; --- Defaults
-(def default-context
+(defn default-context
+ []
{:static media/resolve-asset
- :comment (constantly nil)})
+ :comment (constantly nil)
+ :public-uri (:public-uri cfg/config)})
;; --- Public API
diff --git a/backend/src/uxbox/fixtures.clj b/backend/src/uxbox/fixtures.clj
index 24dbd58aae..a928c27c8d 100644
--- a/backend/src/uxbox/fixtures.clj
+++ b/backend/src/uxbox/fixtures.clj
@@ -220,7 +220,7 @@
(let [owner-id (:id owner)
id (mk-uuid "file" "draft" owner-id index)
name (str "file" index)
- project-id (:default-project owner)]
+ project-id (:default-project-id owner)]
(log/info "create draft file" id)
(db/insert! conn :file
{:id id
diff --git a/backend/src/uxbox/services/mutations/profile.clj b/backend/src/uxbox/services/mutations/profile.clj
index 42045ec8b0..d2b43537aa 100644
--- a/backend/src/uxbox/services/mutations/profile.clj
+++ b/backend/src/uxbox/services/mutations/profile.clj
@@ -156,6 +156,9 @@
(sm/defmutation ::login
[{:keys [email password scope] :as params}]
(letfn [(check-password [profile password]
+ (when (= (:password profile) "!")
+ (ex/raise :type :validation
+ :code ::account-without-password))
(let [result (sodi.pwhash/verify password (:password profile))]
(:valid result)))
diff --git a/backend/src/uxbox/util/emails.clj b/backend/src/uxbox/util/emails.clj
index b7d4897269..2540859c24 100644
--- a/backend/src/uxbox/util/emails.clj
+++ b/backend/src/uxbox/util/emails.clj
@@ -95,7 +95,10 @@
(when-let [spec (s/get-spec id)]
(s/assert spec context))
- (let [context (merge extra-context context)
+ (let [context (merge (if (fn? extra-context)
+ (extra-context)
+ extra-context)
+ context)
email (impl-build-email id context)]
(when-not email
(ex/raise :type :internal
diff --git a/backend/tests/uxbox/tests/test_common_pages.clj b/backend/tests/uxbox/tests/test_common_pages.clj
index 90c9ecec54..3c79c81843 100644
--- a/backend/tests/uxbox/tests/test_common_pages.clj
+++ b/backend/tests/uxbox/tests/test_common_pages.clj
@@ -2,6 +2,9 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.tests.test-common-pages
diff --git a/backend/tests/uxbox/tests/test_services_colors.clj b/backend/tests/uxbox/tests/test_services_colors.clj
index ac13bce194..0b352023c3 100644
--- a/backend/tests/uxbox/tests/test_services_colors.clj
+++ b/backend/tests/uxbox/tests/test_services_colors.clj
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.tests.test-services-colors
(:require
[clojure.test :as t]
@@ -16,7 +25,7 @@
(t/deftest color-libraries-crud
(let [id (uuid/next)
prof (th/create-profile db/pool 2)
- team-id (:default-team prof)]
+ team-id (:default-team-id prof)]
(t/testing "create library"
(let [data {::sm/type :create-color-library
@@ -72,7 +81,7 @@
(t/deftest colors-crud
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
+ team-id (:default-team-id prof)
coll (th/create-color-library db/pool team-id 1)
color-id (uuid/next)]
diff --git a/backend/tests/uxbox/tests/test_services_files.clj b/backend/tests/uxbox/tests/test_services_files.clj
index 4f0abc0ed8..4701599731 100644
--- a/backend/tests/uxbox/tests/test_services_files.clj
+++ b/backend/tests/uxbox/tests/test_services_files.clj
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.tests.test-services-files
(:require
[clojure.test :as t]
@@ -16,8 +25,8 @@
(t/deftest files-crud
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
- proj-id (:default-project prof)
+ team-id (:default-team-id prof)
+ proj-id (:default-project-id prof)
file-id (uuid/next)
page-id (uuid/next)]
@@ -122,8 +131,8 @@
(t/deftest file-images-crud
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
- proj-id (:default-project prof)
+ team-id (:default-team-id prof)
+ proj-id (:default-project-id prof)
file (th/create-file db/pool (:id prof) proj-id 1)]
(t/testing "upload file image"
diff --git a/backend/tests/uxbox/tests/test_services_icons.clj b/backend/tests/uxbox/tests/test_services_icons.clj
index 0faad20ec3..d52e5920a0 100644
--- a/backend/tests/uxbox/tests/test_services_icons.clj
+++ b/backend/tests/uxbox/tests/test_services_icons.clj
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.tests.test-services-icons
(:require
[clojure.java.io :as io]
@@ -16,7 +25,7 @@
(t/deftest icon-libraries-crud
(let [id (uuid/next)
prof (th/create-profile db/pool 2)
- team-id (:default-team prof)]
+ team-id (:default-team-id prof)]
(t/testing "create library"
(let [data {::sm/type :create-icon-library
@@ -89,7 +98,7 @@
(t/deftest icons-crud
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
+ team-id (:default-team-id prof)
coll (th/create-icon-library db/pool team-id 1)
icon-id (uuid/next)]
diff --git a/backend/tests/uxbox/tests/test_services_images.clj b/backend/tests/uxbox/tests/test_services_images.clj
index 9869d718ab..5d6e8721f9 100644
--- a/backend/tests/uxbox/tests/test_services_images.clj
+++ b/backend/tests/uxbox/tests/test_services_images.clj
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.tests.test-services-images
(:require
[clojure.test :as t]
@@ -15,7 +24,7 @@
(t/deftest image-libraries-crud
(let [id (uuid/next)
prof (th/create-profile db/pool 2)
- team-id (:default-team prof)]
+ team-id (:default-team-id prof)]
(t/testing "create library"
(let [data {::sm/type :create-image-library
@@ -96,7 +105,7 @@
(t/deftest images-crud
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
+ team-id (:default-team-id prof)
lib (th/create-image-library db/pool team-id 1)
image-id (uuid/next)]
diff --git a/backend/tests/uxbox/tests/test_services_pages.clj b/backend/tests/uxbox/tests/test_services_pages.clj
index 5275c443eb..90f602c95f 100644
--- a/backend/tests/uxbox/tests/test_services_pages.clj
+++ b/backend/tests/uxbox/tests/test_services_pages.clj
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.tests.test-services-pages
(:require
[clojure.spec.alpha :as s]
@@ -16,8 +25,8 @@
(t/deftest pages-crud
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
- proj-id (:default-project prof)
+ team-id (:default-team-id prof)
+ proj-id (:default-project-id prof)
file (th/create-file db/pool (:id prof) proj-id 1)
page-id (uuid/next)]
@@ -93,8 +102,8 @@
(t/deftest update-page-data
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
- proj-id (:default-project prof)
+ team-id (:default-team-id prof)
+ proj-id (:default-project-id prof)
file (th/create-file db/pool (:id prof) proj-id 1)
page-id (uuid/next)]
@@ -169,8 +178,8 @@
(t/deftest update-page-data-2
(let [prof (th/create-profile db/pool 1)
- team-id (:default-team prof)
- proj-id (:default-project prof)
+ team-id (:default-team-id prof)
+ proj-id (:default-project-id prof)
file (th/create-file db/pool (:id prof) proj-id 1)
page (th/create-page db/pool (:id prof) (:id file) 1)]
(t/testing "lagging changes"
diff --git a/backend/tests/uxbox/tests/test_services_viewer.clj b/backend/tests/uxbox/tests/test_services_viewer.clj
index 47761dc912..c2f4dd912b 100644
--- a/backend/tests/uxbox/tests/test_services_viewer.clj
+++ b/backend/tests/uxbox/tests/test_services_viewer.clj
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.tests.test-services-viewer
(:require
[clojure.test :as t]
@@ -17,8 +26,8 @@
(t/deftest retrieve-bundle
(let [prof (th/create-profile db/pool 1)
prof2 (th/create-profile db/pool 2)
- team-id (:default-team prof)
- proj-id (:default-project prof)
+ team-id (:default-team-id prof)
+ proj-id (:default-project-id prof)
file (th/create-file db/pool (:id prof) proj-id 1)
page (th/create-page db/pool (:id prof) (:id file) 1)
diff --git a/frontend/resources/images/icons/msg-error.svg b/frontend/resources/images/icons/msg-error.svg
new file mode 100644
index 0000000000..44ef863ce0
--- /dev/null
+++ b/frontend/resources/images/icons/msg-error.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/resources/images/icons/msg-info.svg b/frontend/resources/images/icons/msg-info.svg
new file mode 100644
index 0000000000..8c04184cc1
--- /dev/null
+++ b/frontend/resources/images/icons/msg-info.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/resources/images/icons/msg-success.svg b/frontend/resources/images/icons/msg-success.svg
new file mode 100644
index 0000000000..584811b182
--- /dev/null
+++ b/frontend/resources/images/icons/msg-success.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/resources/images/icons/msg-warning.svg b/frontend/resources/images/icons/msg-warning.svg
new file mode 100644
index 0000000000..a2e327a0e9
--- /dev/null
+++ b/frontend/resources/images/icons/msg-warning.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/resources/locales.json b/frontend/resources/locales.json
index 4183c8d8a2..16b4660327 100644
--- a/frontend/resources/locales.json
+++ b/frontend/resources/locales.json
@@ -1,54 +1,60 @@
{
"auth.already-have-account" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:111" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:107" ],
"translations" : {
"en" : "Already have an account?",
"fr" : "Vous avez déjà un compte ?"
}
},
"auth.confirm-password-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:78" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:77" ],
"translations" : {
"en" : "Confirm password",
"fr" : "Confirmez mot de passe"
}
},
"auth.create-demo-profile" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:90", "src/uxbox/main/ui/auth/register.cljs:120" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:114", "src/uxbox/main/ui/auth/register.cljs:116" ],
"translations" : {
"en" : "Create demo account",
"fr" : null
}
},
"auth.create-demo-profile-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:87", "src/uxbox/main/ui/auth/register.cljs:117" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:111", "src/uxbox/main/ui/auth/register.cljs:113" ],
"translations" : {
"en" : "Just wanna try it?"
}
},
+ "auth.demo-warning" : {
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:33" ],
+ "translations" : {
+ "en" : "This is a DEMO service, DO NOT USE for real work, the projects will be periodicaly wiped."
+ }
+ },
"auth.email-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:55", "src/uxbox/main/ui/auth/register.cljs:86", "src/uxbox/main/ui/auth/recovery_request.cljs:47" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:73", "src/uxbox/main/ui/auth/recovery_request.cljs:45", "src/uxbox/main/ui/auth/register.cljs:82" ],
"translations" : {
"en" : "Email",
"fr" : "adresse email"
}
},
"auth.forgot-password" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:78" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:102" ],
"translations" : {
"en" : "Forgot your password?",
"fr" : "Mot de passe oublié ?"
}
},
"auth.fullname-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:80" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:76" ],
"translations" : {
"en" : "Full Name",
"fr" : "Nom complet"
}
},
"auth.go-back-to-login" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:67" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:66" ],
"translations" : {
"en" : "Go back!",
"fr" : "Retour!"
@@ -61,126 +67,126 @@
}
},
"auth.login-here" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:114" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:110" ],
"translations" : {
"en" : "Login here"
}
},
"auth.login-submit-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:63" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:81" ],
"translations" : {
"en" : "Sign in",
"fr" : "Se connecter"
}
},
"auth.login-subtitle" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:70" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:89" ],
"translations" : {
"en" : "Enter your details below"
}
},
"auth.login-title" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:69" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:88" ],
"translations" : {
"en" : "Great to see you again!"
}
},
"auth.new-password-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:74" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:73" ],
"translations" : {
"en" : "Type a new password",
"fr" : null
}
},
"auth.notifications.invalid-token-error" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:50" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:49" ],
"translations" : {
"en" : "The recovery token is invalid.",
"fr" : "Le jeton de récupération n'est pas valide."
}
},
"auth.notifications.password-changed-succesfully" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:54" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:53" ],
"translations" : {
"en" : "Password successfully changed"
}
},
"auth.notifications.recovery-token-sent" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:34" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:32" ],
"translations" : {
"en" : "Password recovery link sent to your inbox.",
"fr" : "Lien de récupération de mot de passe envoyé."
}
},
"auth.password-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:61", "src/uxbox/main/ui/auth/register.cljs:90" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:79", "src/uxbox/main/ui/auth/register.cljs:86" ],
"translations" : {
"en" : "Password",
"fr" : "Mot de passe"
}
},
"auth.password-length-hint" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:89" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:85" ],
"translations" : {
"en" : "At least 8 characters"
}
},
"auth.recovery-request-submit-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:51" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:50" ],
"translations" : {
"en" : "Recover Password"
}
},
"auth.recovery-request-subtitle" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:60" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:59" ],
"translations" : {
"en" : "We'll send you an email with instructions"
}
},
"auth.recovery-request-title" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:59" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery_request.cljs:58" ],
"translations" : {
"en" : "Forgot your password?"
}
},
"auth.recovery-submit-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:81" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:80" ],
"translations" : {
"en" : "Change your password"
}
},
"auth.register" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:84" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:108" ],
"translations" : {
"en" : "Sign up here"
}
},
"auth.register-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:81" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:105" ],
"translations" : {
"en" : "No account yet?"
}
},
"auth.register-submit-label" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:94" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:90" ],
"translations" : {
"en" : "Create an account"
}
},
"auth.register-subtitle" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:103" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:99" ],
"translations" : {
"en" : "It's free, it's Open Source"
}
},
"auth.register-title" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:102" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:98" ],
"translations" : {
"en" : "Create an account"
}
},
"auth.sidebar-tagline" : {
- "used-in" : [ "src/uxbox/main/ui/auth.cljs:44" ],
+ "used-in" : [ "src/uxbox/main/ui/auth.cljs:42" ],
"translations" : {
"en" : "The open-source solution for design and prototyping."
}
@@ -228,21 +234,21 @@
}
},
"dashboard.header.profile-menu.logout" : {
- "used-in" : [ "src/uxbox/main/ui/dashboard/profile.cljs:59" ],
+ "used-in" : [ "src/uxbox/main/ui/dashboard/profile.cljs:58" ],
"translations" : {
"en" : "Exit",
"fr" : "Quitter"
}
},
"dashboard.header.profile-menu.password" : {
- "used-in" : [ "src/uxbox/main/ui/dashboard/profile.cljs:56" ],
+ "used-in" : [ "src/uxbox/main/ui/dashboard/profile.cljs:55" ],
"translations" : {
"en" : "Password",
"fr" : "Mot de passe"
}
},
"dashboard.header.profile-menu.profile" : {
- "used-in" : [ "src/uxbox/main/ui/dashboard/profile.cljs:53" ],
+ "used-in" : [ "src/uxbox/main/ui/dashboard/profile.cljs:52" ],
"translations" : {
"en" : "Profile",
"fr" : "Profil"
@@ -478,7 +484,7 @@
"unused" : true
},
"ds.store-images-title" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:181" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:183" ],
"translations" : {
"en" : "IMAGES STORE",
"fr" : "BOUTIQUE"
@@ -499,7 +505,7 @@
"unused" : true
},
"ds.your-images-title" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:178" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:180" ],
"translations" : {
"en" : "YOUR IMAGES",
"fr" : "VOS IMAGES"
@@ -520,27 +526,27 @@
"unused" : true
},
"errors.auth.unauthorized" : {
- "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:37" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/login.cljs:62" ],
"translations" : {
"en" : "Username or password seems to be wrong.",
"fr" : "Le nom d'utilisateur ou le mot de passe semble être faux."
}
},
"errors.email-already-exists" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:38", "src/uxbox/main/ui/auth.cljs:84" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:38", "src/uxbox/main/ui/auth.cljs:87" ],
"translations" : {
"en" : "Email already used"
}
},
"errors.generic" : {
- "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:37", "src/uxbox/main/ui/auth.cljs:88", "src/uxbox/main/ui.cljs:179" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:37", "src/uxbox/main/ui/auth.cljs:91", "src/uxbox/main/ui.cljs:184" ],
"translations" : {
"en" : "Something wrong has happened.",
"fr" : "Quelque chose c'est mal passé."
}
},
"errors.network" : {
- "used-in" : [ "src/uxbox/main/ui.cljs:173" ],
+ "used-in" : [ "src/uxbox/main/ui.cljs:178" ],
"translations" : {
"en" : "Unable to connect to backend server.",
"fr" : "Impossible de se connecter au serveur principal."
@@ -560,14 +566,14 @@
}
},
"errors.registration-disabled" : {
- "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:52" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/register.cljs:48" ],
"translations" : {
"en" : "The registration is currently disabled.",
"fr" : "L'enregistrement est actuellement désactivé."
}
},
"errors.unexpected-error" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:44", "src/uxbox/main/ui/auth/register.cljs:58" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:42", "src/uxbox/main/ui/auth/register.cljs:54" ],
"translations" : {
"en" : "An unexpected error occurred.",
"fr" : "Une erreur inattendue c'est produite"
@@ -601,28 +607,28 @@
}
},
"image.import-library" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:170" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:172" ],
"translations" : {
"en" : "Import image from library",
"fr" : "Importer une image depuis une librairie"
}
},
"image.new" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:84" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:86" ],
"translations" : {
"en" : "New image",
"fr" : "Nouvelle image"
}
},
"image.select" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:90", "src/uxbox/main/ui/workspace/images.cljs:95" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:92", "src/uxbox/main/ui/workspace/images.cljs:97" ],
"translations" : {
"en" : "Select from library",
"fr" : "Choisir depuis une librairie"
}
},
"image.upload" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:102" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/images.cljs:104" ],
"translations" : {
"en" : "Upload file",
"fr" : "Envoyer un fichier"
@@ -635,7 +641,7 @@
}
},
"profile.recovery.go-to-login" : {
- "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:97" ],
+ "used-in" : [ "src/uxbox/main/ui/auth/recovery.cljs:96" ],
"translations" : {
"en" : null,
"fr" : null
@@ -647,6 +653,30 @@
"en" : "Cancel and keep my account"
}
},
+ "settings.cancel-email-change" : {
+ "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:81" ],
+ "translations" : {
+ "en" : "Cancel"
+ }
+ },
+ "settings.change-email-info" : {
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:58" ],
+ "translations" : {
+ "en" : "We'll send you an email to your current email “%s” to verify your identity."
+ }
+ },
+ "settings.change-email-info2" : {
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:82" ],
+ "translations" : {
+ "en" : "We have sent you an email to “%s”. Please follow the instructions to verify the email."
+ }
+ },
+ "settings.change-email-info3" : {
+ "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:78" ],
+ "translations" : {
+ "en" : "There is a pending change of your email to “%s”."
+ }
+ },
"settings.change-email-label" : {
"used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:73" ],
"translations" : {
@@ -654,25 +684,25 @@
}
},
"settings.change-email-submit-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:76" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:72" ],
"translations" : {
"en" : "Change email"
}
},
"settings.change-email-title" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:56" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:54" ],
"translations" : {
"en" : "Change your email"
}
},
"settings.close-modal-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:92" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:86" ],
"translations" : {
"en" : "Close"
}
},
"settings.confirm-email-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:73" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:69" ],
"translations" : {
"en" : "Verify new email"
}
@@ -702,6 +732,12 @@
"en" : "Email"
}
},
+ "settings.email-verification-pending" : {
+ "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:86" ],
+ "translations" : {
+ "en" : "There is a pending email validation."
+ }
+ },
"settings.fullname-label" : {
"used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:60" ],
"translations" : {
@@ -722,7 +758,7 @@
}
},
"settings.new-email-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:69" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:65" ],
"translations" : {
"en" : "New email"
}
@@ -734,53 +770,24 @@
"fr" : "Nouveau mot de passe"
}
},
- "settings.notifications.description" : {
- "translations" : {
- "en" : null,
- "fr" : null
- },
- "unused" : true
- },
"settings.notifications.email-changed-successfully" : {
- "used-in" : [ "src/uxbox/main/ui/auth.cljs:64" ],
+ "used-in" : [ "src/uxbox/main/ui/auth.cljs:62" ],
"translations" : {
"en" : "Your email address has been updated successfully"
}
},
+ "settings.notifications.email-not-verified" : {
+ "used-in" : [ "src/uxbox/main/ui/dashboard.cljs:109" ],
+ "translations" : {
+ "en" : "Your email address has not been verified yet. Please check your inbox at “%s” for a confirmation email."
+ }
+ },
"settings.notifications.email-verified-successfully" : {
- "used-in" : [ "src/uxbox/main/ui/auth.cljs:57" ],
+ "used-in" : [ "src/uxbox/main/ui/auth.cljs:55" ],
"translations" : {
"en" : "Your email address has been verified successfully"
}
},
- "settings.notifications.every-day" : {
- "translations" : {
- "en" : null,
- "fr" : null
- },
- "unused" : true
- },
- "settings.notifications.every-hour" : {
- "translations" : {
- "en" : null,
- "fr" : null
- },
- "unused" : true
- },
- "settings.notifications.none" : {
- "translations" : {
- "en" : null,
- "fr" : null
- },
- "unused" : true
- },
- "settings.notifications.notifications-saved" : {
- "translations" : {
- "en" : null,
- "fr" : null
- },
- "unused" : true
- },
"settings.notifications.password-saved" : {
"used-in" : [ "src/uxbox/main/ui/settings/password.cljs:36" ],
"translations" : {
@@ -789,11 +796,10 @@
}
},
"settings.notifications.profile-deletion-not-allowed" : {
+ "used-in" : [ "src/uxbox/main/data/auth.cljs:136" ],
"translations" : {
- "en" : null,
- "fr" : null
- },
- "used-in" : [ "src/uxbox/main/data/auth.cljs:121" ]
+ "en" : "You can't delete you profile. Reasign your teams before proceed."
+ }
},
"settings.notifications.profile-saved" : {
"used-in" : [ "src/uxbox/main/ui/settings/options.cljs:37", "src/uxbox/main/ui/settings/profile.cljs:42" ],
@@ -810,13 +816,13 @@
}
},
"settings.options" : {
- "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:52" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:54" ],
"translations" : {
"en" : "OPTIONS"
}
},
"settings.password" : {
- "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:47" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:49" ],
"translations" : {
"en" : "PASSWORD",
"fr" : "MOT DE PASSE"
@@ -830,27 +836,27 @@
}
},
"settings.profile" : {
- "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:42" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:44" ],
"translations" : {
"en" : "PROFILE",
"fr" : "PROFIL"
}
},
"settings.profile-submit-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/options.cljs:65", "src/uxbox/main/ui/settings/password.cljs:94", "src/uxbox/main/ui/settings/profile.cljs:92" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/options.cljs:65", "src/uxbox/main/ui/settings/password.cljs:94", "src/uxbox/main/ui/settings/profile.cljs:89" ],
"translations" : {
"en" : "Update settings",
"fr" : "Mettre à jour les paramètres"
}
},
"settings.remove-account-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:97" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:94" ],
"translations" : {
"en" : "Want to remove your account?"
}
},
"settings.teams" : {
- "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:57" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/header.cljs:59" ],
"translations" : {
"en" : "TEAMS"
}
@@ -868,7 +874,7 @@
}
},
"settings.update-photo-label" : {
- "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:119" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/profile.cljs:116" ],
"translations" : {
"en" : "UPDATE"
}
@@ -881,7 +887,7 @@
"unused" : true
},
"settings.verification-sent-title" : {
- "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:81" ],
+ "used-in" : [ "src/uxbox/main/ui/settings/change_email.cljs:77" ],
"translations" : {
"en" : "Verification email sent"
}
@@ -893,13 +899,13 @@
}
},
"viewer.empty-state" : {
- "used-in" : [ "src/uxbox/main/ui/viewer.cljs:44" ],
+ "used-in" : [ "src/uxbox/main/ui/viewer.cljs:43" ],
"translations" : {
"en" : "No frames found on the page."
}
},
"viewer.frame-not-found" : {
- "used-in" : [ "src/uxbox/main/ui/viewer.cljs:48" ],
+ "used-in" : [ "src/uxbox/main/ui/viewer.cljs:47" ],
"translations" : {
"en" : "Frame not found."
}
@@ -1467,7 +1473,7 @@
"unused" : true
},
"workspace.options.position" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/frame.cljs:127", "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:138" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/frame.cljs:127", "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:134" ],
"translations" : {
"en" : "Position",
"fr" : "Position"
@@ -1480,14 +1486,14 @@
}
},
"workspace.options.radius" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:179" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:175" ],
"translations" : {
"en" : "Radius",
"fr" : "TODO"
}
},
"workspace.options.rotation" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:154" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:150" ],
"translations" : {
"en" : "Rotation",
"fr" : "TODO"
@@ -1513,7 +1519,7 @@
}
},
"workspace.options.size" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/frame.cljs:102", "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:110" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/options/frame.cljs:102", "src/uxbox/main/ui/workspace/sidebar/options/measures.cljs:106" ],
"translations" : {
"en" : "Size",
"fr" : "Taille"
@@ -1599,7 +1605,7 @@
}
},
"workspace.sidebar.icons" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/icons.cljs:88" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/sidebar/icons.cljs:89" ],
"translations" : {
"en" : "Icons",
"fr" : "Icône"
@@ -1717,7 +1723,7 @@
}
},
"workspace.viewport.click-to-close-path" : {
- "used-in" : [ "src/uxbox/main/ui/workspace/drawarea.cljs:363" ],
+ "used-in" : [ "src/uxbox/main/ui/workspace/drawarea.cljs:373" ],
"translations" : {
"en" : "Click to close the path"
}
diff --git a/frontend/resources/styles/common/dependencies/colors.scss b/frontend/resources/styles/common/dependencies/colors.scss
index faaf930aec..07a903d4f5 100644
--- a/frontend/resources/styles/common/dependencies/colors.scss
+++ b/frontend/resources/styles/common/dependencies/colors.scss
@@ -14,7 +14,7 @@ $color-canvas: #E8E9EA;
$color-primary: #31EFB8;
// Secondary colors
-$color-success: #49D793;
+$color-success: #58C35C;
$color-complete : #a599c6;
$color-warning: #FC8802;
$color-danger: #E65244;
diff --git a/frontend/resources/styles/common/framework.scss b/frontend/resources/styles/common/framework.scss
index f4789d0260..f12e85a295 100644
--- a/frontend/resources/styles/common/framework.scss
+++ b/frontend/resources/styles/common/framework.scss
@@ -994,50 +994,205 @@ input[type=range]:focus::-ms-fill-upper {
white-space: normal;
width: 100%;
}
-
}
-
}
-
}
-.message-version {
- align-items: center;
- background-color: rgba(27, 170, 214, .6);
- border-radius: $br-small;
- color: $color-white;
+// Messages
+
+// Banner top
+
+.banner {
+ top: 0;
+ left: 0px;
+ width: 100%;
+ height: 40px;
+ z-index: 13;
+
display: flex;
- flex-direction: column;
justify-content: center;
- padding: $small;
- position: absolute;
- right: 250px;
- top: 40px;
- @include animation(0, 1s, fadeInDown);
+ align-items: center;
- span {
- font-size: $fs13;
- font-weight: bold;
- }
+ .btn-close {
+ position: absolute;
+ right: 0px;
+ top: 0px;
+ width: 40px;
+ height: 40px;
- .message-action {
- align-items: center;
display: flex;
- justify-content: space-around;
- margin-top: $small;
- width: 100%;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ opacity: .35;
- .btn-transparent {
- font-size: $fs12;
- padding: .3rem .5rem;
+ svg {
+ fill: $color-black;
+ height: 18px;
+ width: 18px;
+ transform: rotate(45deg);
}
+ &:hover {
+ opacity: .8;
+ }
}
- &.hide-message {
+ .content {
+ align-items: center;
+ color: $color-white;
+ display: flex;
+ justify-content: center;
+ max-width: 60%;
+
+ .icon {
+ display: flex;
+ margin-right: $medium;
+ svg {
+ fill: $color-white;
+ height: 20px;
+ width: 20px;
+ }
+ }
+
+ span {
+ font-size: $fs15;
+ }
+ }
+
+ &.fixed {
+ position: fixed;
+ }
+
+ &.error {
+ background-color: $color-danger;
+ }
+
+ &.success {
+ background-color: $color-success;
+ }
+
+ &.warning {
+ background-color: $color-warning;
+ }
+
+ &.info {
+ background-color: $color-info;
+ }
+
+ &.quick {
+ .btn-close {
+ display: none;
+ }
+ }
+
+ &.hide {
@include animation(0, .6s, fadeOutUp);
}
+}
+.inline-banner {
+ display: flex;
+ margin-bottom: $big;
+ min-height: 40px;
+ width: 100%;
+
+ .icon {
+ display: flex;
+ flex-shrink: 0;
+ justify-content: center;
+ margin-right: $small;
+ padding: $small;
+ width: 40px;
+
+ svg {
+ fill: $color-white;
+ height: 20px;
+ width: 20px;
+ }
+ }
+
+ .content {
+ display: flex;
+ flex-direction: column;
+ }
+
+ .main {
+ display: flex;
+ }
+
+ .extra {
+ display: flex;
+ justify-content: flex-end;
+ padding: $small;
+
+ > div:not(:last-child) {
+ margin-right: $small;
+ }
+ }
+
+ .text {
+ display: flex;
+ font-size: $fs14;
+ color: $color-black;
+ padding: $small;
+ }
+
+ &.error {
+ background-color: lighten($color-danger,30%);
+ .icon {
+ background-color: $color-danger;
+ }
+ }
+
+ &.success {
+ background-color: lighten($color-success,30%);
+ .icon {
+ background-color: $color-success;
+ }
+ }
+
+ &.warning {
+ background-color: lighten($color-warning,30%);
+ .icon {
+ background-color: $color-warning;
+ }
+ }
+
+ &.info {
+ background-color: lighten($color-info,30%);
+ .icon {
+ background-color: $color-info;
+ }
+ }
+
+ .btn-close {
+ width: 40px;
+ height: 40px;
+ flex-shrink: 0;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ cursor: pointer;
+ opacity: .35;
+
+ svg {
+ fill: $color-black;
+ height: 18px;
+ width: 18px;
+ transform: rotate(45deg);
+ }
+
+ &:hover {
+ opacity: .8;
+ }
+ }
+
+ &.quick {
+ .btn-close {
+ display: none;
+ }
+ }
}
.close-bezier {
diff --git a/frontend/resources/styles/main-default.scss b/frontend/resources/styles/main-default.scss
index e3409d409b..122715b6a8 100644
--- a/frontend/resources/styles/main-default.scss
+++ b/frontend/resources/styles/main-default.scss
@@ -42,7 +42,6 @@
//#################################################
@import "main/partials/login";
-@import "main/partials/messages";
@import "main/partials/texts";
@import "main/partials/viewer";
@import "main/partials/viewer-header";
diff --git a/frontend/resources/styles/main/partials/messages.scss b/frontend/resources/styles/main/partials/messages.scss
deleted file mode 100644
index a4bcc00ec1..0000000000
--- a/frontend/resources/styles/main/partials/messages.scss
+++ /dev/null
@@ -1,74 +0,0 @@
-// Messages
-
-.message {
- position: fixed;
- top: 0;
- left: 0px;
- width: 100%;
- height: 40px;
- z-index: 13;
-
- display: flex;
- justify-content: center;
- align-items: center;
-
- .close-button {
- position: absolute;
- right: 0px;
- top: 0px;
- width: 40px;
- height: 40px;
-
- display: flex;
- justify-content: center;
- align-items: center;
- cursor: pointer;
-
- svg {
- fill: $color-black;
- height: 18px;
- width: 18px;
- transform: rotate(45deg);
- }
-
- &:hover {
- opacity: .8;
- }
-
- }
-
- .message-content {
- color: $color-white;
-
- span {
- font-size: $fs18;
- max-width: 60%;
- }
- }
-
- &.error {
- background-color: $color-danger;
- border-color: $color-danger-dark;
- }
-
- &.success {
- background-color: $color-success;
- border-color: $color-success-dark;
- }
-
- &.info {
- background-color: $color-info;
- border-color: $color-info-dark;
- }
-
- &.quick {
- .close-button {
- display: none;
- }
- }
-
- &.hide-message {
- @include animation(0, .6s, fadeOutUp);
- }
-}
-
diff --git a/frontend/resources/styles/main/partials/user-settings.scss b/frontend/resources/styles/main/partials/user-settings.scss
index c06d0fc0b4..7b64072708 100644
--- a/frontend/resources/styles/main/partials/user-settings.scss
+++ b/frontend/resources/styles/main/partials/user-settings.scss
@@ -145,7 +145,9 @@
.profile-form {
flex-grow: 1;
+ flex-basis: 390px;
display: flex;
+
flex-direction: column;
.change-email {
diff --git a/frontend/src/uxbox/main/data/auth.cljs b/frontend/src/uxbox/main/data/auth.cljs
index 4f79190353..3047a3d815 100644
--- a/frontend/src/uxbox/main/data/auth.cljs
+++ b/frontend/src/uxbox/main/data/auth.cljs
@@ -57,7 +57,8 @@
params {:email email
:password password
:scope "webapp"}]
- (->> (rp/mutation :login params)
+ (->> (rx/timer 100)
+ (rx/mapcat #(rp/mutation :login params))
(rx/tap on-success)
(rx/catch (fn [err]
(on-error err)
diff --git a/frontend/src/uxbox/main/data/lightbox.cljs b/frontend/src/uxbox/main/data/lightbox.cljs
deleted file mode 100644
index 14ec440877..0000000000
--- a/frontend/src/uxbox/main/data/lightbox.cljs
+++ /dev/null
@@ -1,53 +0,0 @@
-;; This Source Code Form is subject to the terms of the Mozilla Public
-;; License, v. 2.0. If a copy of the MPL was not distributed with this
-;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
-;;
-;; Copyright (c) 2016 Andrey Antukh
-
-(ns uxbox.main.data.lightbox
- (:require [beicon.core :as rx]
- [lentes.core :as l]
- [potok.core :as ptk]
- [uxbox.main.store :as st]))
-
-;; --- Show Lightbox
-
-(defrecord ShowLightbox [name params]
- ptk/UpdateEvent
- (update [_ state]
- (let [data (merge {:name name} params)]
- (assoc state :lightbox data))))
-
-(defn show-lightbox
- ([name]
- (ShowLightbox. name nil))
- ([name params]
- (ShowLightbox. name params)))
-
-;; --- Hide Lightbox
-
-(defrecord HideLightbox []
- ptk/UpdateEvent
- (update [_ state]
- (dissoc state :lightbox)))
-
-;; TODO: revemo this alias
-(defn hide-lightbox
- []
- (HideLightbox.))
-
-(defn close-lightbox
- []
- (HideLightbox.))
-
-
-;; --- Direct Call Api
-
-(defn open!
- [& args]
- (st/emit! (apply show-lightbox args)))
-
-(defn close!
- {:deperecated true}
- [& args]
- (st/emit! (apply hide-lightbox args)))
diff --git a/frontend/src/uxbox/main/data/messages.cljs b/frontend/src/uxbox/main/data/messages.cljs
index 2b2f50c9d4..e92623e1f6 100644
--- a/frontend/src/uxbox/main/data/messages.cljs
+++ b/frontend/src/uxbox/main/data/messages.cljs
@@ -9,13 +9,13 @@
(ns uxbox.main.data.messages
(:require
+ [beicon.core :as rx]
[cljs.spec.alpha :as s]
[potok.core :as ptk]
- [beicon.core :as rx]
[uxbox.common.data :as d]
+ [uxbox.common.exceptions :as ex]
[uxbox.common.pages :as cp]
[uxbox.common.spec :as us]
- [uxbox.common.exceptions :as ex]
[uxbox.config :as cfg]))
(declare hide)
@@ -33,10 +33,11 @@
ptk/WatchEvent
(watch [_ state stream]
- (let [stoper (rx/filter (ptk/type? ::show) stream)]
- (->> (rx/of hide)
- (rx/delay (:timeout data))
- (rx/take-until stoper))))))
+ (when (:timeout data)
+ (let [stoper (rx/filter (ptk/type? ::show) stream)]
+ (->> (rx/of hide)
+ (rx/delay (:timeout data))
+ (rx/take-until stoper)))))))
(def hide
(ptk/reify ::hide
@@ -51,19 +52,29 @@
(defn error
- [message & {:keys [timeout] :or {timeout 3000}}]
- (show {:content message
- :type :error
- :timeout timeout}))
+ ([content] (error content {}))
+ ([content {:keys [timeout] :or {timeout 3000}}]
+ (show {:content content
+ :type :error
+ :timeout timeout})))
(defn info
- [message & {:keys [timeout] :or {timeout 3000}}]
- (show {:content message
- :type :info
- :timeout timeout}))
+ ([content] (info content {}))
+ ([content {:keys [timeout] :or {timeout 3000}}]
+ (show {:content content
+ :type :info
+ :timeout timeout})))
(defn success
- [message & {:keys [timeout] :or {timeout 3000}}]
- (show {:content message
- :type :info
- :timeout timeout}))
+ ([content] (success content {}))
+ ([content {:keys [timeout] :or {timeout 3000}}]
+ (show {:content content
+ :type :success
+ :timeout timeout})))
+
+(defn warn
+ ([content] (warn content {}))
+ ([content {:keys [timeout] :or {timeout 3000}}]
+ (show {:content content
+ :type :warning
+ :timeout timeout})))
diff --git a/frontend/src/uxbox/main/ui.cljs b/frontend/src/uxbox/main/ui.cljs
index b418982c22..84f30e87e7 100644
--- a/frontend/src/uxbox/main/ui.cljs
+++ b/frontend/src/uxbox/main/ui.cljs
@@ -13,20 +13,22 @@
[cuerdas.core :as str]
[potok.core :as ptk]
[rumext.alpha :as mf]
- [uxbox.main.ui.icons :as i]
[uxbox.common.data :as d]
[uxbox.common.exceptions :as ex]
+ [uxbox.common.uuid :as uuid]
[uxbox.main.data.auth :refer [logout]]
[uxbox.main.data.messages :as dm]
[uxbox.main.refs :as refs]
[uxbox.main.store :as st]
- [uxbox.main.ui.dashboard :refer [dashboard]]
- [uxbox.main.ui.static :refer [not-found-page not-authorized-page]]
[uxbox.main.ui.auth :refer [auth verify-token]]
+ [uxbox.main.ui.dashboard :refer [dashboard]]
+ [uxbox.main.ui.icons :as i]
+ [uxbox.main.ui.messages :as msgs]
[uxbox.main.ui.settings :as settings]
+ [uxbox.main.ui.static :refer [not-found-page not-authorized-page]]
[uxbox.main.ui.viewer :refer [viewer-page]]
[uxbox.main.ui.workspace :as workspace]
- [uxbox.util.i18n :refer [tr]]
+ [uxbox.util.i18n :as i18n :refer [tr t]]
[uxbox.util.timers :as ts]))
;; --- Routes
@@ -84,62 +86,63 @@
(mf/defc app-container
{::mf/wrap [#(mf/catch % {:fallback app-error})]}
[{:keys [route] :as props}]
- (case (get-in route [:data :name])
+ [:*
+ [:& msgs/notifications]
+ (case (get-in route [:data :name])
+ (:auth-login
+ :auth-register
+ :auth-goodbye
+ :auth-recovery-request
+ :auth-recovery)
+ [:& auth {:route route}]
- (:auth-login
- :auth-register
- :auth-goodbye
- :auth-recovery-request
- :auth-recovery)
- [:& auth {:route route}]
+ :auth-verify-token
+ [:& verify-token {:route route}]
- :auth-verify-token
- [:& verify-token {:route route}]
+ (:settings-profile
+ :settings-password
+ :settings-options)
+ [:& settings/settings {:route route}]
- (:settings-profile
- :settings-password
- :settings-options)
- [:& settings/settings {:route route}]
+ :debug-icons-preview
+ (when *assert*
+ [:& i/debug-icons-preview])
- :debug-icons-preview
- (when *assert*
- [:& i/debug-icons-preview])
+ (:dashboard-search
+ :dashboard-team
+ :dashboard-project
+ :dashboard-library-icons
+ :dashboard-library-icons-index
+ :dashboard-library-images
+ :dashboard-library-images-index
+ :dashboard-library-palettes
+ :dashboard-library-palettes-index)
+ [:& dashboard {:route route}]
- (:dashboard-search
- :dashboard-team
- :dashboard-project
- :dashboard-library-icons
- :dashboard-library-icons-index
- :dashboard-library-images
- :dashboard-library-images-index
- :dashboard-library-palettes
- :dashboard-library-palettes-index)
- [:& dashboard {:route route}]
+ :viewer
+ (let [index (d/parse-integer (get-in route [:params :query :index]))
+ token (get-in route [:params :query :token])
+ page-id (uuid (get-in route [:params :path :page-id]))]
+ [:& viewer-page {:page-id page-id
+ :index index
+ :token token}])
- :viewer
- (let [index (d/parse-integer (get-in route [:params :query :index]))
- token (get-in route [:params :query :token])
- page-id (uuid (get-in route [:params :path :page-id]))]
- [:& viewer-page {:page-id page-id
- :index index
- :token token}])
+ :workspace
+ (let [project-id (uuid (get-in route [:params :path :project-id]))
+ file-id (uuid (get-in route [:params :path :file-id]))
+ page-id (uuid (get-in route [:params :query :page-id]))]
+ [:& workspace/workspace {:project-id project-id
+ :file-id file-id
+ :page-id page-id
+ :key file-id}])
- :workspace
- (let [project-id (uuid (get-in route [:params :path :project-id]))
- file-id (uuid (get-in route [:params :path :file-id]))
- page-id (uuid (get-in route [:params :query :page-id]))]
- [:& workspace/workspace {:project-id project-id
- :file-id file-id
- :page-id page-id
- :key file-id}])
+ :not-authorized
+ [:& not-authorized-page]
- :not-authorized
- [:& not-authorized-page]
+ :not-found
+ [:& not-found-page]
- :not-found
- [:& not-found-page]
-
- nil))
+ nil)])
(mf/defc app
[]
diff --git a/frontend/src/uxbox/main/ui/auth.cljs b/frontend/src/uxbox/main/ui/auth.cljs
index f410a64ca8..e7d3f13d90 100644
--- a/frontend/src/uxbox/main/ui/auth.cljs
+++ b/frontend/src/uxbox/main/ui/auth.cljs
@@ -17,7 +17,6 @@
[uxbox.main.data.users :as du]
[uxbox.main.data.messages :as dm]
[uxbox.main.store :as st]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.auth.login :refer [login-page]]
[uxbox.main.ui.auth.recovery :refer [recovery-page]]
[uxbox.main.ui.auth.recovery-request :refer [recovery-request-page]]
@@ -37,21 +36,19 @@
[{:keys [route] :as props}]
(let [section (get-in route [:data :name])
locale (mf/deref i18n/locale)]
- [:*
- [:& messages]
- [:div.auth
- [:section.auth-sidebar
- [:a.logo {:href "/#/"} i/logo]
- [:span.tagline (t locale "auth.sidebar-tagline")]]
+ [:div.auth
+ [:section.auth-sidebar
+ [:a.logo {:href "/#/"} i/logo]
+ [:span.tagline (t locale "auth.sidebar-tagline")]]
- [:section.auth-content
- (case section
- :auth-register [:& register-page {:locale locale}]
- :auth-login [:& login-page {:locale locale}]
- :auth-goodbye [:& goodbye-page {:locale locale}]
- :auth-recovery-request [:& recovery-request-page {:locale locale}]
- :auth-recovery [:& recovery-page {:locale locale
- :params (:query-params route)}])]]]))
+ [:section.auth-content
+ (case section
+ :auth-register [:& register-page {:locale locale}]
+ :auth-login [:& login-page {:locale locale}]
+ :auth-goodbye [:& goodbye-page {:locale locale}]
+ :auth-recovery-request [:& recovery-request-page {:locale locale}]
+ :auth-recovery [:& recovery-page {:locale locale
+ :params (:query-params route)}])]]))
(defn- handle-email-verified
[data]
diff --git a/frontend/src/uxbox/main/ui/auth/login.cljs b/frontend/src/uxbox/main/ui/auth/login.cljs
index 882480656f..b238c72add 100644
--- a/frontend/src/uxbox/main/ui/auth/login.cljs
+++ b/frontend/src/uxbox/main/ui/auth/login.cljs
@@ -18,6 +18,7 @@
[uxbox.main.data.auth :as da]
[uxbox.main.repo :as rp]
[uxbox.main.store :as st]
+ [uxbox.main.ui.messages :as msgs]
[uxbox.main.data.messages :as dm]
[uxbox.main.ui.components.forms :refer [input submit-button form]]
[uxbox.util.object :as obj]
@@ -32,16 +33,6 @@
(s/def ::login-form
(s/keys :req-un [::email ::password]))
-(defn- on-error
- [form error]
- (st/emit! (dm/error (tr "errors.auth.unauthorized"))))
-
-(defn- on-submit
- [form event]
- (let [params (with-meta (:clean-data form)
- {:on-error (partial on-error form)})]
- (st/emit! (da/login params))))
-
(defn- login-with-google
[event]
(dom/prevent-default event)
@@ -51,23 +42,43 @@
(mf/defc login-form
[{:keys [locale] :as props}]
- [:& form {:on-submit on-submit
- :spec ::login-form
- :initial {}}
- [:& input
- {:name :email
- :type "text"
- :tab-index "2"
- :help-icon i/at
- :label (t locale "auth.email-label")}]
- [:& input
- {:type "password"
- :name :password
- :tab-index "3"
- :help-icon i/eye
- :label (t locale "auth.password-label")}]
- [:& submit-button
- {:label (t locale "auth.login-submit-label")}]])
+ (let [error? (mf/use-state false)
+
+ on-error
+ (fn [form event]
+ (reset! error? true))
+
+ on-submit
+ (fn [form event]
+ (reset! error? false)
+ (let [params (with-meta (:clean-data form)
+ {:on-error on-error})]
+ (st/emit! (da/login params))))]
+
+ [:*
+ (when @error?
+ [:& msgs/inline-banner
+ {:type :warning
+ :content (t locale "errors.auth.unauthorized")
+ :on-close #(reset! error? false)}])
+
+ [:& form {:on-submit on-submit
+ :spec ::login-form
+ :initial {}}
+ [:& input
+ {:name :email
+ :type "text"
+ :tab-index "2"
+ :help-icon i/at
+ :label (t locale "auth.email-label")}]
+ [:& input
+ {:type "password"
+ :name :password
+ :tab-index "3"
+ :help-icon i/eye
+ :label (t locale "auth.password-label")}]
+ [:& submit-button
+ {:label (t locale "auth.login-submit-label")}]]]))
(mf/defc login-page
[{:keys [locale] :as props}]
diff --git a/frontend/src/uxbox/main/ui/auth/recovery.cljs b/frontend/src/uxbox/main/ui/auth/recovery.cljs
index a021e5e8cd..a345a79732 100644
--- a/frontend/src/uxbox/main/ui/auth/recovery.cljs
+++ b/frontend/src/uxbox/main/ui/auth/recovery.cljs
@@ -18,7 +18,6 @@
[uxbox.main.data.messages :as dm]
[uxbox.main.store :as st]
[uxbox.main.ui.components.forms :refer [input submit-button form]]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.navigation :as nav]
[uxbox.util.dom :as dom]
[uxbox.util.forms :as fm]
diff --git a/frontend/src/uxbox/main/ui/auth/recovery_request.cljs b/frontend/src/uxbox/main/ui/auth/recovery_request.cljs
index f7b8b0803a..0a00b57c03 100644
--- a/frontend/src/uxbox/main/ui/auth/recovery_request.cljs
+++ b/frontend/src/uxbox/main/ui/auth/recovery_request.cljs
@@ -11,7 +11,6 @@
(:require
[cljs.spec.alpha :as s]
[cuerdas.core :as str]
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.main.ui.icons :as i]
[uxbox.common.spec :as us]
@@ -19,7 +18,6 @@
[uxbox.main.data.messages :as dm]
[uxbox.main.store :as st]
[uxbox.main.ui.components.forms :refer [input submit-button form]]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.navigation :as nav]
[uxbox.util.dom :as dom]
[uxbox.util.forms :as fm]
diff --git a/frontend/src/uxbox/main/ui/auth/register.cljs b/frontend/src/uxbox/main/ui/auth/register.cljs
index d516503144..d6d282e225 100644
--- a/frontend/src/uxbox/main/ui/auth/register.cljs
+++ b/frontend/src/uxbox/main/ui/auth/register.cljs
@@ -11,16 +11,15 @@
(:require
[cljs.spec.alpha :as s]
[cuerdas.core :as str]
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.config :as cfg]
[uxbox.main.ui.icons :as i]
[uxbox.main.data.auth :as uda]
[uxbox.main.store :as st]
[uxbox.main.data.auth :as da]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.components.forms :refer [input submit-button form]]
[uxbox.main.ui.navigation :as nav]
+ [uxbox.main.ui.messages :as msgs]
[uxbox.util.dom :as dom]
[uxbox.util.forms :as fm]
[uxbox.util.i18n :refer [tr t]]
@@ -29,12 +28,9 @@
(mf/defc demo-warning
[_]
- [:div.featured-note.warning
- [:span
- [:strong "WARNING: "]
- "This is a " [:strong "demo"] " service, "
- [:strong "DO NOT USE"] " for real work, "
- " the projects will be periodicaly wiped."]])
+ [:& msgs/inline-banner
+ {:type :warning
+ :content (tr "auth.demo-warning")}])
(s/def ::fullname ::fm/not-empty-string)
(s/def ::password ::fm/not-empty-string)
diff --git a/frontend/src/uxbox/main/ui/dashboard.cljs b/frontend/src/uxbox/main/ui/dashboard.cljs
index 7d10462540..943858aec3 100644
--- a/frontend/src/uxbox/main/ui/dashboard.cljs
+++ b/frontend/src/uxbox/main/ui/dashboard.cljs
@@ -13,6 +13,7 @@
[rumext.alpha :as mf]
[uxbox.main.ui.icons :as i]
[uxbox.common.exceptions :as ex]
+ [uxbox.common.uuid :as uuid]
[uxbox.common.spec :as us]
[uxbox.main.refs :as refs]
[uxbox.main.ui.dashboard.sidebar :refer [sidebar]]
@@ -21,7 +22,7 @@
[uxbox.main.ui.dashboard.recent-files :refer [recent-files-page]]
[uxbox.main.ui.dashboard.library :refer [library-page]]
[uxbox.main.ui.dashboard.profile :refer [profile-section]]
- [uxbox.main.ui.messages :refer [messages]]))
+ [uxbox.util.i18n :as i18n :refer [t]]))
(defn ^boolean uuid-str?
[s]
@@ -53,6 +54,8 @@
(uuid-str? library-id)
(assoc :library-id (uuid library-id)))))
+(declare global-notifications)
+
(mf/defc dashboard
[{:keys [route] :as props}]
@@ -61,7 +64,7 @@
{:keys [search-term team-id project-id library-id library-section] :as params}
(parse-params route profile)]
[:*
- [:& messages]
+ [:& global-notifications {:profile profile}]
[:section.dashboard-layout
[:div.main-logo i/logo-icon]
[:& profile-section {:profile profile}]
@@ -91,3 +94,17 @@
:dashboard-project
[:& project-page {:team-id team-id
:project-id project-id}])]]]))
+
+
+(mf/defc global-notifications
+ [{:keys [profile] :as props}]
+ (let [locale (mf/deref i18n/locale)]
+ (when (and profile
+ (not= uuid/zero (:id profile))
+ (= (:pending-email profile)
+ (:email profile)))
+ [:section.banner.error.quick
+ [:div.content
+ [:div.icon i/msg-warning]
+ [:span (t locale "settings.notifications.email-not-verified" (:email profile))]]])))
+
diff --git a/frontend/src/uxbox/main/ui/dashboard/colors.cljs b/frontend/src/uxbox/main/ui/dashboard/colors.cljs
deleted file mode 100644
index 75f4f2dcb0..0000000000
--- a/frontend/src/uxbox/main/ui/dashboard/colors.cljs
+++ /dev/null
@@ -1,295 +0,0 @@
-;; This Source Code Form is subject to the terms of the Mozilla Public
-;; License, v. 2.0. If a copy of the MPL was not distributed with this
-;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
-;;
-;; Copyright (c) 2015-2017 Juan de la Cruz
-;; Copyright (c) 2015-2019 Andrey Antukh
-
-(ns uxbox.main.ui.dashboard.colors
- (:require
- [cuerdas.core :as str]
- [lentes.core :as l]
- [rumext.alpha :as mf]
- [uxbox.main.ui.icons :as i]
- [uxbox.main.data.colors :as dc]
- [uxbox.main.store :as st]
- [uxbox.main.ui.dashboard.common :as common]
- [uxbox.main.ui.colorpicker :refer [colorpicker]]
- [uxbox.main.ui.confirm :refer [confirm-dialog]]
- [uxbox.main.ui.keyboard :as k]
- [uxbox.main.ui.modal :as modal]
- [uxbox.util.color :refer [hex->rgb]]
- [uxbox.util.data :refer [seek]]
- [uxbox.util.dom :as dom]
- [uxbox.util.i18n :as t :refer [tr]]
- [uxbox.util.router :as rt]))
-
-;; ;; --- Refs
-;;
-;; (def collections-iref
-;; (-> (l/key :colors-collections)
-;; (l/derive st/state)))
-;;
-;; (def selected-colors-iref
-;; (-> (l/in [:dashboard :colors :selected])
-;; (l/derive st/state)))
-;;
-;; ;; --- Colors Modal (Component)
-;;
-;; (mf/defc color-modal
-;; [{:keys [on-submit value] :as props}]
-;; (let [local (mf/use-var value)]
-;; [:div.lightbox-body
-;; [:h3 (tr "ds.color-lightbox.title" )]
-;; [:form
-;; [:div.row-flex.center
-;; [:& colorpicker {:value (or @local "#00ccff")
-;; :on-change #(reset! local %)}]]
-;; [:input#project-btn.btn-primary
-;; {:value (tr "ds.color-lightbox.add")
-;; :on-click #(on-submit @local)
-;; :type "button"}]]]))
-;;
-;; ;; --- Page Title
-;;
-;;
-;; (mf/defc grid-header
-;; [{:keys [coll] :as props}]
-;; (letfn [(on-change [name]
-;; (st/emit! (dc/rename-collection (:id coll) name)))
-;;
-;; (delete []
-;; (st/emit!
-;; (dc/delete-collection (:id coll))
-;; (rt/nav :dashboard-colors nil {:type (:type coll)})))
-;;
-;; (on-delete []
-;; (modal/show! confirm-dialog {:on-accept delete}))]
-;; [:& common/grid-header {:value (:name coll)
-;; :on-change on-change
-;; :on-delete on-delete}]))
-;;
-;; ;; --- Nav
-;;
-;; (mf/defc nav-item
-;; [{:keys [coll selected?] :as props}]
-;; (let [local (mf/use-state {})
-;; {:keys [id type name]} coll
-;; colors (count (:colors coll))
-;; editable? (= type :own)]
-;; (letfn [(on-click [event]
-;; (let [type (or type :own)]
-;; (st/emit! (rt/nav :dashboard-colors nil {:type type :id id}))))
-;; (on-input-change [event]
-;; (let [value (dom/get-target event)
-;; value (dom/get-value value)]
-;; (swap! local assoc :name value)))
-;; (on-cancel [event]
-;; (swap! local dissoc :name)
-;; (swap! local dissoc :edit))
-;; (on-double-click [event]
-;; (when editable?
-;; (swap! local assoc :edit true)))
-;; (on-input-keyup [event]
-;; (when (k/enter? event)
-;; (let [value (dom/get-target event)
-;; value (dom/get-value value)]
-;; (st/emit! (dc/rename-collection id (str/trim (:name @local))))
-;; (swap! local assoc :edit false))))]
-;; [:li {:on-click on-click
-;; :on-double-click on-double-click
-;; :class-name (when selected? "current")}
-;; (if (:edit @local)
-;; [:div
-;; [:input.element-title
-;; {:value (if (:name @local) (:name @local) name)
-;; :on-change on-input-change
-;; :on-key-down on-input-keyup}]
-;; [:span.close {:on-click on-cancel} i/close]]
-;; [:span.element-title name])
-;; #_[:span.element-subtitle
-;; (tr "ds.num-elements" (t/c colors))]])))
-;;
-;; (mf/defc nav
-;; [{:keys [id type colls selected-coll] :as props}]
-;; (let [own? (= type :own)
-;; builtin? (= type :builtin)
-;; select-tab #(st/emit! (rt/nav :dashboard-colors nil {:type %}))]
-;; [:div.library-bar
-;; [:div.library-bar-inside
-;; [:ul.library-tabs
-;; [:li {:class-name (when own? "current")
-;; :on-click (partial select-tab :own)}
-;; (tr "ds.your-colors-title")]
-;; [:li {:class-name (when builtin? "current")
-;; :on-click (partial select-tab :builtin)}
-;; (tr "ds.store-colors-title")]]
-;; [:ul.library-elements
-;; (when own?
-;; [:li
-;; [:a.btn-primary {:on-click #(st/emit! (dc/create-collection))}
-;; (tr "ds.colors-collection.new")]])
-;; (for [item colls]
-;; (let [selected? (= (:id item) (:id selected-coll))]
-;; [:& nav-item {:coll item :selected? selected? :key (:id item)}]))]]]))
-;;
-;; ;; --- Grid
-;;
-;; (mf/defc grid-form
-;; [{:keys [id] :as props}]
-;; (letfn [(on-submit [val]
-;; (st/emit! (dc/add-color id val))
-;; (modal/hide!))
-;; (on-click [event]
-;; (modal/show! color-modal {:on-submit on-submit}))]
-;; [:div.grid-item.small-item.add-project {:on-click on-click}
-;; [:span (tr "ds.color-new")]]))
-;;
-;; (mf/defc grid-options-tooltip
-;; [{:keys [selected on-select title] :as props}]
-;; {:pre [(uuid? selected)
-;; (fn? on-select)
-;; (string? title)]}
-;; (let [colls (mf/deref collections-iref)
-;; colls (->> (vals colls)
-;; (filter #(= :own (:type %)))
-;; (remove #(= selected (:id %)))
-;; (sort-by :name colls))
-;; on-select (fn [event id]
-;; (dom/prevent-default event)
-;; (dom/stop-propagation event)
-;; (on-select id))]
-;; [:ul.move-list
-;; [:li.title title]
-;; (for [{:keys [id name] :as coll} colls]
-;; [:li {:key (str id)}
-;; [:a {:on-click #(on-select % id)} name]])]))
-;;
-;; (mf/defc grid-options
-;; [{:keys [id type coll selected] :as props}]
-;; (let [local (mf/use-state {})]
-;; (letfn [(delete [event]
-;; (st/emit! (dc/delete-colors id selected)))
-;; (on-delete [event]
-;; (modal/show! confirm-dialog {:on-accept delete}))
-;; (on-toggle-copy [event]
-;; (swap! local update :show-copy-tooltip not)
-;; (swap! local assoc :show-move-tooltip false))
-;; (on-toggle-move [event]
-;; (swap! local update :show-move-tooltip not)
-;; (swap! local assoc :show-copy-tooltip false))
-;; (on-copy [selected]
-;; (swap! local assoc
-;; :show-move-tooltip false
-;; :show-copy-tooltip false)
-;; (st/emit! (dc/copy-selected selected)))
-;; (on-move [selected]
-;; (swap! local assoc
-;; :show-move-tooltip false
-;; :show-copy-tooltip false)
-;; (st/emit! (dc/move-selected id selected)))]
-;;
-;; ;; MULTISELECT OPTIONS BAR
-;; [:div.multiselect-bar
-;; (if (or (= type :own) (nil? id))
-;; ;; if editable
-;; [:div.multiselect-nav
-;; [:span.move-item.tooltip.tooltip-top
-;; {:alt (tr "ds.multiselect-bar.copy")
-;; :on-click on-toggle-copy}
-;; (when (:show-copy-tooltip @local)
-;; [:& grid-options-tooltip {:selected id
-;; :title (tr "ds.multiselect-bar.copy-to-library")
-;; :on-select on-copy}])
-;; i/copy]
-;; [:span.move-item.tooltip.tooltip-top
-;; {:alt (tr "ds.multiselect-bar.move")
-;; :on-click on-toggle-move}
-;; (when (:show-move-tooltip @local)
-;; [:& grid-options-tooltip {:selected id
-;; :title (tr "ds.multiselect-bar.move-to-library")
-;; :on-select on-move}])
-;; i/move]
-;; [:span.delete.tooltip.tooltip-top
-;; {:alt (tr "ds.multiselect-bar.delete")
-;; :on-click on-delete}
-;; i/trash]]
-;;
-;; ;; if not editable
-;; [:div.multiselect-nav
-;; [:span.move-item.tooltip.tooltip-top
-;; {:alt (tr "ds.multiselect-bar.copy")
-;; :on-click on-toggle-copy}
-;; (when (:show-copy-tooltip @local)
-;; [:& grid-options-tooltip {:selected id
-;; :title (tr "ds.multiselect-bar.copy-to-library")
-;; :on-select on-copy}])
-;; i/organize]])])))
-;;
-;; (mf/defc grid-item
-;; [{:keys [color selected?] :as props}]
-;; (letfn [(toggle-selection [event]
-;; (st/emit! (dc/toggle-color-selection color)))]
-;; [:div.grid-item.small-item.project-th {:on-click toggle-selection}
-;; [:span.color-swatch {:style {:background-color color}}]
-;; [:div.input-checkbox.check-primary
-;; [:input {:type "checkbox"
-;; :id color
-;; :on-change toggle-selection
-;; :checked selected?}]
-;; [:label {:for color}]]
-;; [:span.color-data color]
-;; [:span.color-data (apply str "RGB " (interpose ", " (hex->rgb color)))]]))
-;;
-;; (mf/defc grid
-;; [{:keys [id type coll selected] :as props}]
-;; (let [{:keys [colors]} coll
-;; editable? (= :own type)
-;; colors (->> (remove nil? colors)
-;; (sort-by identity))]
-;; [:div.dashboard-grid-content
-;; [:div.dashboard-grid-row
-;; (when (and editable? id)
-;; [:& grid-form {:id id}])
-;; (for [color colors]
-;; (let [selected? (contains? selected color)]
-;; [:& grid-item {:color color :selected? selected? :key color}]))]]))
-;;
-;; (mf/defc content
-;; [{:keys [id type coll] :as props}]
-;; (let [selected (mf/deref selected-colors-iref)]
-;; [:section.dashboard-grid.library
-;; (when coll
-;; [:& grid-header {:coll coll}])
-;; [:& grid {:coll coll :id id :type type :selected selected}]
-;; (when (seq selected)
-;; [:& grid-options {:id id :type type
-;; :selected selected
-;; :coll coll}])]))
-;;
-;; ;; --- Colors Page
-;;
-;; (mf/defc colors-page
-;; [{:keys [id type] :as props}]
-;; (let [type (or type :own)
-;;
-;; colls (mf/deref collections-iref)
-;; colls (cond->> (vals colls)
-;; (= type :own) (filter #(= :own (:type %)))
-;; (= type :builtin) (filter #(= :builtin (:type %)))
-;; true (sort-by :created-at))
-;; selected-coll (if id
-;; (seek #(= id (:id %)) colls)
-;; (first colls))
-;; id (:id selected-coll)]
-;;
-;; (mf/use-effect #(st/emit! (dc/fetch-collections)))
-;;
-;; [:section.dashboard-content
-;; [:& nav {:type type
-;; :id id
-;; :colls colls}]
-;; [:& content {:type type
-;; :id id
-;; :coll selected-coll}]]))
-;;
diff --git a/frontend/src/uxbox/main/ui/dashboard/images.cljs b/frontend/src/uxbox/main/ui/dashboard/images.cljs
deleted file mode 100644
index b188291b72..0000000000
--- a/frontend/src/uxbox/main/ui/dashboard/images.cljs
+++ /dev/null
@@ -1,387 +0,0 @@
-;; This Source Code Form is subject to the terms of the Mozilla Public
-;; License, v. 2.0. If a copy of the MPL was not distributed with this
-;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
-;;
-;; This Source Code Form is "Incompatible With Secondary Licenses", as
-;; defined by the Mozilla Public License, v. 2.0.
-;;
-;; Copyright (c) 2015-2020 Andrey Antukh
-;; Copyright (c) 2015-2020 Juan de la Cruz
-
-(ns uxbox.main.ui.dashboard.images
- (:require
- [cljs.spec.alpha :as s]
- [cuerdas.core :as str]
- [lentes.core :as l]
- [rumext.alpha :as mf]
- [uxbox.main.ui.icons :as i]
- [uxbox.common.data :as d]
- [uxbox.common.spec :as us]
- [uxbox.main.data.images :as di]
- [uxbox.main.store :as st]
- [uxbox.main.ui.confirm :refer [confirm-dialog]]
- [uxbox.main.ui.dashboard.common :as common]
- [uxbox.main.ui.keyboard :as kbd]
- [uxbox.main.ui.modal :as modal]
- [uxbox.util.dom :as dom]
- [uxbox.util.i18n :as i18n :refer [t tr]]
- [uxbox.util.router :as rt]
- [uxbox.util.time :as dt]))
-
-;; ;; --- Page Title
-;;
-;; (mf/defc grid-header
-;; [{:keys [collection] :as props}]
-;; (let [{:keys [id type]} collection
-;; on-change #(st/emit! (di/rename-collection id %))
-;; on-deleted #(st/emit! (rt/nav :dashboard-images nil {:type type}))
-;; delete #(st/emit! (di/delete-collection id on-deleted))
-;; on-delete #(modal/show! confirm-dialog {:on-accept delete})]
-;; [:& common/grid-header {:value (:name collection)
-;; :on-change on-change
-;; :on-delete on-delete}]))
-;;
-;; ;; --- Nav
-;;
-;; (mf/defc nav-item
-;; [{:keys [coll selected?] :as props}]
-;; (let [local (mf/use-state {})
-;; {:keys [id type name num-images]} coll
-;; editable? (= type :own)
-;;
-;; on-click
-;; (fn [event]
-;; (let [type (or type :own)]
-;; (st/emit! (rt/nav :dashboard-images {} {:type type :id id}))))
-;;
-;; on-cancel-edition #(swap! local dissoc :edit)
-;; on-double-click #(when editable? (swap! local assoc :edit true))
-;;
-;; on-input-keyup
-;; (fn [event]
-;; (when (kbd/enter? event)
-;; (let [value (-> (dom/get-target event)
-;; (dom/get-value)
-;; (str/trim))]
-;; (st/emit! (di/rename-collection id value))
-;; (swap! local assoc :edit false))))]
-;;
-;; [:li {:on-click on-click
-;; :on-double-click on-double-click
-;; :class-name (when selected? "current")}
-;; (if (:edit @local)
-;; [:div
-;; [:input.element-title {:default-value name
-;; :on-key-down on-input-keyup}]
-;; [:span.close {:on-click on-cancel-edition} i/close]]
-;; [:span.element-title (if id name "Storage")])]))
-;;
-;; (mf/defc nav
-;; [{:keys [id type collections] :as props}]
-;; (let [locale (i18n/use-locale)
-;; own? (= type :own)
-;; builtin? (= type :builtin)
-;; create-collection #(st/emit! di/create-collection)
-;; select-own-tab #(st/emit! (rt/nav :dashboard-images nil {:type :own}))
-;; select-buitin-tab #(st/emit! (rt/nav :dashboard-images nil {:type :builtin}))]
-;; [:div.library-bar
-;; [:div.library-bar-inside
-;;
-;; ;; Tabs
-;; [:ul.library-tabs
-;; [:li {:class (when own? "current")
-;; :on-click select-own-tab}
-;; (t locale "ds.your-images-title")]
-;;
-;; [:li {:class (when builtin? "current")
-;; :on-click select-buitin-tab}
-;; (t locale "ds.store-images-title")]]
-;;
-;; ;; Collections List
-;; [:ul.library-elements
-;; (when own?
-;; [:li
-;; [:a.btn-primary {:on-click create-collection}
-;; (t locale "ds.images-collection.new")]])
-;;
-;; (for [item collections]
-;; [:& nav-item {:coll item
-;; :selected? (= (:id item) id)
-;; :key (:id item)}])]]]))
-;;
-;; ;; --- Grid
-;;
-;; ;; (mf/defc grid-options-tooltip
-;; ;; [{:keys [selected on-select title] :as props}]
-;; ;; {:pre [(uuid? selected)
-;; ;; (fn? on-select)
-;; ;; (string? title)]}
-;; ;; (let [colls (mf/deref collections-iref)
-;; ;; colls (->> (vals colls)
-;; ;; (filter #(= :own (:type %)))
-;; ;; (remove #(= selected (:id %)))
-;; ;; #_(sort-by :name colls))
-;; ;; on-select (fn [event id]
-;; ;; (dom/prevent-default event)
-;; ;; (dom/stop-propagation event)
-;; ;; (on-select id))]
-;; ;; [:ul.move-list
-;; ;; [:li.title title]
-;; ;; [:li
-;; ;; (when (not (nil? selected))
-;; ;; [:a {:href "#" :on-click #(on-select % nil)} "Storage"])]
-;; ;; (for [{:keys [id name] :as coll} colls]
-;; ;; [:li {:key (pr-str id)}
-;; ;; [:a {:on-click #(on-select % id)} name]])]))
-;;
-;; (mf/defc grid-options
-;; [{:keys [id type selected] :as props}]
-;; (let [local (mf/use-state {})
-;; delete #(st/emit! di/delete-selected)
-;; on-delete #(modal/show! confirm-dialog {:on-accept delete})
-;;
-;; ;; (on-toggle-copy [event]
-;; ;; (swap! local update :show-copy-tooltip not))
-;; ;; (on-toggle-move [event]
-;; ;; (swap! local update :show-move-tooltip not))
-;; ;; (on-copy [selected]
-;; ;; (swap! local assoc
-;; ;; :show-move-tooltip false
-;; ;; :show-copy-tooltip false)
-;; ;; (st/emit! (di/copy-selected selected)))
-;; ;; (on-move [selected]
-;; ;; (swap! local assoc
-;; ;; :show-move-tooltip false
-;; ;; :show-copy-tooltip false)
-;; ;; (st/emit! (di/move-selected selected)))
-;; ;; (on-rename [event]
-;; ;; (let [selected (first selected)]
-;; ;; (st/emit! (di/update-opts :edition selected))))
-;; ]
-;; ;; MULTISELECT OPTIONS BAR
-;; [:div.multiselect-bar
-;; (when (= type :own)
-;; ;; If editable
-;; [:div.multiselect-nav
-;; ;; [:span.move-item.tooltip.tooltip-top
-;; ;; {:alt (tr "ds.multiselect-bar.copy")
-;; ;; :on-click on-toggle-copy}
-;; ;; (when (:show-copy-tooltip @local)
-;; ;; [:& grid-options-tooltip {:selected id
-;; ;; :title (tr "ds.multiselect-bar.copy-to-library")
-;; ;; :on-select on-copy}])
-;; ;; i/copy]
-;; ;; [:span.move-item.tooltip.tooltip-top
-;; ;; {:alt (tr "ds.multiselect-bar.move")
-;; ;; :on-click on-toggle-move}
-;; ;; (when (:show-move-tooltip @local)
-;; ;; [:& grid-options-tooltip {:selected id
-;; ;; :title (tr "ds.multiselect-bar.move-to-library")
-;; ;; :on-select on-move}])
-;; ;; i/move]
-;; ;; (when (= 1 (count selected))
-;; ;; [:span.move-item.tooltip.tooltip-top {:alt (tr "ds.multiselect-bar.rename")
-;; ;; :on-click on-rename}
-;; ;; i/pencil])
-;; [:span.delete.tooltip.tooltip-top
-;; {:alt (tr "ds.multiselect-bar.delete")
-;; :on-click on-delete}
-;; i/trash]]
-;;
-;; ;; If not editable
-;; ;; [:div.multiselect-nav
-;; ;; [:span.move-item.tooltip.tooltip-top {:alt (tr "ds.multiselect-bar.copy")
-;; ;; :on-click on-toggle-copy}
-;; ;; (when (:show-copy-tooltip @local)
-;; ;; [:& grid-options-tooltip {:selected id
-;; ;; :title (tr "ds.multiselect-bar.copy-to-library")
-;; ;; :on-select on-copy}])
-;; ;; i/organize]]
-;; )]))
-;;
-;;
-;; ;; --- Grid Form
-;;
-;; (mf/defc grid-form
-;; [{:keys [id type uploading?] :as props}]
-;; (let [input (mf/use-ref nil)
-;; on-click #(dom/click (mf/ref-node input))
-;; on-select #(st/emit! (->> (dom/get-target %)
-;; (dom/get-files)
-;; (array-seq)
-;; (di/create-images id)))]
-;; [:div.grid-item.add-project {:on-click on-click}
-;; (if uploading?
-;; [:div i/loader-pencil]
-;; [:span (tr "ds.image-new")])
-;; [:input.upload-image-input
-;; {:style {:display "none"}
-;; :multiple true
-;; :ref input
-;; :value ""
-;; :accept "image/jpeg,image/png,image/webp"
-;; :type "file"
-;; :on-change on-select}]]))
-;;
-;; ;; --- Grid Item
-;;
-;; (mf/defc grid-item
-;; [{:keys [image selected? edition?] :as props}]
-;; (let [toggle-selection #(st/emit! (if selected?
-;; (di/deselect-image (:id image))
-;; (di/select-image (:id image))))
-;; on-blur
-;; (fn [event]
-;; (let [target (dom/get-target event)
-;; name (dom/get-value target)]
-;; (st/emit! (di/update-opts :edition false)
-;; (di/rename-image (:id image) name))))
-;;
-;; on-key-down
-;; (fn [event]
-;; (when (kbd/enter? event)
-;; (on-blur event)))
-;;
-;; on-edit
-;; (fn [event]
-;; (dom/stop-propagation event)
-;; (dom/prevent-default event)
-;; (st/emit! (di/update-opts :edition (:id image))))
-;;
-;; background (str "url('" (:thumb-uri image) "')")]
-;;
-;; [:div.grid-item.images-th
-;; [:div.grid-item-th {:style {:background-image background}}
-;; [:div.input-checkbox.check-primary
-;; [:input {:type "checkbox"
-;; :id (:id image)
-;; :on-change toggle-selection
-;; :checked selected?}]
-;; [:label {:for (:id image)}]]]
-;;
-;; [:div.item-info
-;; (if edition?
-;; [:input.element-name {:type "text"
-;; :auto-focus true
-;; :on-key-down on-key-down
-;; :on-blur on-blur
-;; :on-click on-edit
-;; :default-value (:name image)}]
-;; [:h3 {:on-double-click on-edit} (:name image)])
-;; [:span.date (tr "ds.uploaded-at" (dt/format (:created-at image) "dd/MM/yyyy"))]]]))
-;;
-;; ;; --- Grid
-;;
-;; ;; (defn- make-images-iref
-;; ;; [collection-id]
-;; ;; (letfn [(selector [state]
-;; ;; (->> (vals (:images state))
-;; ;; (filterv #(= (:collection-id %) collection-id))))]
-;; ;; (-> (l/lens selector)
-;; ;; (l/derive st/state))))
-;;
-;; (def images-iref
-;; (-> (comp (l/key :images) (l/lens vals))
-;; (l/derive st/state)))
-;;
-;; (mf/defc grid
-;; [{:keys [id type collection opts] :as props}]
-;; (let [editable? (= type :own)
-;; ;; images-iref (mf/use-memo {:fn #(make-images-iref id)
-;; ;; :deps (mf/deps id)})
-;; images (->> (mf/deref images-iref)
-;; (sort-by :created-at))]
-;; [:div.dashboard-grid-content
-;; [:div.dashboard-grid-row
-;; (when editable?
-;; [:& grid-form {:id id :type type :uploading? (:uploading opts)}])
-;; (for [item images]
-;; [:& grid-item {:image item
-;; :key (:id item)
-;; :selected? (contains? (:selected opts) (:id item))
-;; :edition? (= (:edition opts) (:id item))}])]]))
-;;
-;; ;; --- Menu
-;;
-;; ;; (mf/defc menu
-;; ;; [{:keys [opts coll] :as props}]
-;; ;; (let [ordering (:order opts :name)
-;; ;; filtering (:filter opts "")
-;; ;; icount (count (:images coll))]
-;; ;; (letfn [(on-term-change [event]
-;; ;; (let [term (-> (dom/get-target event)
-;; ;; (dom/get-value))]
-;; ;; (st/emit! (di/update-opts :filter term))))
-;; ;; (on-ordering-change [event]
-;; ;; (let [value (dom/event->value event)
-;; ;; value (read-string value)]
-;; ;; (st/emit! (di/update-opts :order value))))
-;; ;; (on-clear [event]
-;; ;; (st/emit! (di/update-opts :filter "")))]
-;; ;; [:section.dashboard-bar.library-gap
-;; ;; [:div.dashboard-info
-;;
-;; ;; ;; Counter
-;; ;; [:span.dashboard-images (tr "ds.num-images" (t/c icount))]
-;;
-;; ;; ;; Sorting
-;; ;; [:div
-;; ;; [:span (tr "ds.ordering")]
-;; ;; [:select.input-select {:on-change on-ordering-change
-;; ;; :value (pr-str ordering)}
-;; ;; (for [[key value] (seq +ordering-options+)]
-;; ;; [:option {:key key :value (pr-str key)} (tr value)])]]
-;;
-;; ;; ;; Search
-;; ;; [:form.dashboard-search
-;; ;; [:input.input-text {:key :images-search-box
-;; ;; :type "text"
-;; ;; :on-change on-term-change
-;; ;; :auto-focus true
-;; ;; :placeholder (tr "ds.search.placeholder")
-;; ;; :value filtering}]
-;; ;; [:div.clear-search {:on-click on-clear} i/close]]]])))
-;;
-;; (def opts-iref
-;; (-> (l/key :dashboard-images)
-;; (l/derive st/state)))
-;;
-;; (mf/defc content
-;; [{:keys [id type collection] :as props}]
-;; (let [{:keys [selected] :as opts} (mf/deref opts-iref)]
-;; [:section.dashboard-grid.library
-;; (when collection
-;; [:& grid-header {:collection collection}])
-;; (if collection
-;; [:& grid {:id id :type type :collection collection :opts opts}]
-;; [:span "EMPTY STATE TODO"])
-;; (when-not (empty? selected)
-;; [:& grid-options {:id id :type type :selected selected}])]))
-;;
-;; ;; --- Images Page
-;;
-;; (def collections-iref
-;; (-> (l/key :images-collections)
-;; (l/derive st/state)))
-;;
-;; (mf/defc images-page
-;; [{:keys [id type] :as props}]
-;; (let [collections (mf/deref collections-iref)
-;; collections (cond->> (vals collections)
-;; (= type :own) (filter #(= :own (:type %)))
-;; (= type :builtin) (filter #(= :builtin (:type %)))
-;; true (sort-by :created-at))
-;;
-;; collection (cond
-;; (uuid? id) (d/seek #(= id (:id %)) collections)
-;; :else (first collections))
-;; id (:id collection)]
-;;
-;; (mf/use-effect #(st/emit! di/fetch-collections))
-;; (mf/use-effect
-;; {:fn #(when id (st/emit! (di/initialize id)))
-;; :deps (mf/deps id)})
-;;
-;; [:section.dashboard-content
-;; [:& nav {:type type :id id :collections collections}]
-;; [:& content {:type type :id id :collection collection}]]))
diff --git a/frontend/src/uxbox/main/ui/dashboard/profile.cljs b/frontend/src/uxbox/main/ui/dashboard/profile.cljs
index 2932894c0a..897a948554 100644
--- a/frontend/src/uxbox/main/ui/dashboard/profile.cljs
+++ b/frontend/src/uxbox/main/ui/dashboard/profile.cljs
@@ -11,15 +11,14 @@
(ns uxbox.main.ui.dashboard.profile
(:require
[cuerdas.core :as str]
- [lentes.core :as l]
[rumext.alpha :as mf]
- [uxbox.main.ui.icons :as i]
[uxbox.main.data.auth :as da]
- [uxbox.main.store :as st]
[uxbox.main.refs :as refs]
+ [uxbox.main.store :as st]
+ [uxbox.main.ui.components.dropdown :refer [dropdown]]
+ [uxbox.main.ui.icons :as i]
[uxbox.main.ui.navigation :as nav]
[uxbox.util.dom :as dom]
- [uxbox.main.ui.components.dropdown :refer [dropdown]]
[uxbox.util.i18n :as i18n :refer [t]]
[uxbox.util.router :as rt]))
diff --git a/frontend/src/uxbox/main/ui/icons.cljs b/frontend/src/uxbox/main/ui/icons.cljs
index ca1e58fdaa..e2a12b1d99 100644
--- a/frontend/src/uxbox/main/ui/icons.cljs
+++ b/frontend/src/uxbox/main/ui/icons.cljs
@@ -67,6 +67,10 @@
(def mail (icon-xref :mail))
(def minus (icon-xref :minus))
(def move (icon-xref :move))
+(def msg-error (icon-xref :msg-error))
+(def msg-success (icon-xref :msg-success))
+(def msg-warning (icon-xref :msg-warning))
+(def msg-info (icon-xref :msg-info))
(def navigate (icon-xref :navigate))
(def options (icon-xref :options))
(def organize (icon-xref :organize))
diff --git a/frontend/src/uxbox/main/ui/messages.cljs b/frontend/src/uxbox/main/ui/messages.cljs
index df15ce75b3..a5b293a3b3 100644
--- a/frontend/src/uxbox/main/ui/messages.cljs
+++ b/frontend/src/uxbox/main/ui/messages.cljs
@@ -1,3 +1,12 @@
+;; This Source Code Form is subject to the terms of the Mozilla Public
+;; License, v. 2.0. If a copy of the MPL was not distributed with this
+;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
+;;
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
+
(ns uxbox.main.ui.messages
(:require
[rumext.alpha :as mf]
@@ -10,41 +19,56 @@
[uxbox.util.i18n :as i18n :refer [t]]
[uxbox.util.timers :as ts]))
-;; --- Main Component (entry point)
+(defn- type->icon
+ [type]
+ (case type
+ :warning i/msg-warning
+ :error i/msg-error
+ :success i/msg-success
+ :info i/msg-info))
-(declare notification)
-
-(mf/defc messages
- []
- (let [message (mf/deref refs/message)]
- (when message
- [:& notification {:type (:type message)
- :status (:status message)
- :content (:content message)}])))
-
-(mf/defc messages-widget
- []
- (let [message (mf/deref refs/message)
- message {:type :error
- :content "Hello world!"}]
-
- [:& notification {:type (:type message)
- :status (:status message)
- :content (:content message)}]))
-
-;; --- Notification Component
-
-(mf/defc notification
- [{:keys [type status content] :as props}]
- (let [on-close #(st/emit! dm/hide)
- klass (classnames
- :error (= type :error)
- :info (= type :info)
- :hide-message (= status :hide)
+(mf/defc notification-item
+ [{:keys [type status on-close quick? content] :as props}]
+ (let [klass (dom/classnames
+ :fixed true
:success (= type :success)
- :quick false)]
- [:div.message {:class klass}
- [:a.close-button {:on-click on-close} i/close]
- [:div.message-content
- [:span content]]]))
+ :error (= type :error)
+ :info (= type :info)
+ :warning (= type :warning)
+ :hide (= status :hide)
+ :quick quick?)]
+ [:section.banner {:class klass}
+ [:div.content
+ [:div.icon (type->icon type)]
+ [:span content]]
+ [:div.btn-close {:on-click on-close} i/close]]))
+
+(mf/defc notifications
+ []
+ (let [message (mf/deref refs/message)
+ on-close #(st/emit! dm/hide)]
+ (when message
+ [:& notification-item {:type (:type message)
+ :quick? (boolean (:timeout message))
+ :status (:status message)
+ :content (:content message)
+ :on-close on-close}])))
+
+(mf/defc inline-banner
+ {::mf/wrap [mf/memo]}
+ [{:keys [type on-close content children] :as props}]
+ [:div.inline-banner {:class (dom/classnames
+ :warning (= type :warning)
+ :error (= type :error)
+ :success (= type :success)
+ :info (= type :info)
+ :quick (not on-close))}
+ [:div.icon (type->icon type)]
+ [:div.content
+ [:div.main
+ [:span.text content]
+ [:div.btn-close {:on-click on-close} i/close]]
+ (when children
+ [:div.extra
+ children])]])
diff --git a/frontend/src/uxbox/main/ui/modal.cljs b/frontend/src/uxbox/main/ui/modal.cljs
index cecb9b61bb..95ecae63c6 100644
--- a/frontend/src/uxbox/main/ui/modal.cljs
+++ b/frontend/src/uxbox/main/ui/modal.cljs
@@ -1,7 +1,6 @@
(ns uxbox.main.ui.modal
(:require
[goog.events :as events]
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.main.store :as st]
[uxbox.main.ui.keyboard :as k]
diff --git a/frontend/src/uxbox/main/ui/settings.cljs b/frontend/src/uxbox/main/ui/settings.cljs
index 3d9bcf99ea..07865712d3 100644
--- a/frontend/src/uxbox/main/ui/settings.cljs
+++ b/frontend/src/uxbox/main/ui/settings.cljs
@@ -17,7 +17,6 @@
[uxbox.main.store :as st]
[uxbox.util.router :as rt]
[uxbox.main.ui.dashboard.profile :refer [profile-section]]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.settings.header :refer [header]]
[uxbox.main.ui.settings.password :refer [password-page]]
[uxbox.main.ui.settings.options :refer [options-page]]
@@ -28,7 +27,6 @@
(let [section (get-in route [:data :name])
profile (mf/deref refs/profile)]
[:main.settings-main
- [:& messages]
[:div.settings-content
[:& header {:section section :profile profile}]
(case section
diff --git a/frontend/src/uxbox/main/ui/settings/change_email.cljs b/frontend/src/uxbox/main/ui/settings/change_email.cljs
index 8a433abad9..fd92f116e2 100644
--- a/frontend/src/uxbox/main/ui/settings/change_email.cljs
+++ b/frontend/src/uxbox/main/ui/settings/change_email.cljs
@@ -11,18 +11,18 @@
(:require
[cljs.spec.alpha :as s]
[cuerdas.core :as str]
- [lentes.core :as l]
[rumext.alpha :as mf]
- [uxbox.main.ui.icons :as i]
[uxbox.main.data.auth :as da]
- [uxbox.main.data.users :as du]
- [uxbox.main.ui.components.forms :refer [input submit-button form]]
[uxbox.main.data.messages :as dm]
- [uxbox.main.store :as st]
+ [uxbox.main.data.users :as du]
[uxbox.main.refs :as refs]
+ [uxbox.main.store :as st]
+ [uxbox.main.ui.components.forms :refer [input submit-button form]]
+ [uxbox.main.ui.icons :as i]
+ [uxbox.main.ui.messages :as msgs]
+ [uxbox.main.ui.modal :as modal]
[uxbox.util.dom :as dom]
[uxbox.util.forms :as fm]
- [uxbox.main.ui.modal :as modal]
[uxbox.util.i18n :as i18n :refer [tr t]]))
(s/def ::email-1 ::fm/email)
@@ -36,9 +36,7 @@
(= (:code error) :uxbox.services.mutations.profile/email-already-exists)
(swap! form (fn [data]
(let [error {:message (tr "errors.email-already-exists")}]
- (-> data
- (assoc-in [:errors :email-1] error)
- (assoc-in [:errors :email-2] error)))))
+ (assoc-in data [:errors :email-1] error))))
:else
(let [msg (tr "errors.unexpected-error")]
@@ -55,11 +53,9 @@
[:section.modal-content.generic-form
[:h2 (t locale "settings.change-email-title")]
- [:span.featured-note
- [:span.text
- [:span "We’ll send you an email to your current email "]
- [:strong (:email profile)]
- [:span " to verify your identity."]]]
+ [:& msgs/inline-banner
+ {:type :info
+ :content (t locale "settings.change-email-info" (:email profile))}]
[:& form {:on-submit on-submit
:spec ::email-change-form
@@ -80,12 +76,10 @@
[:section.modal-content.generic-form.confirmation
[:h2 (t locale "settings.verification-sent-title")]
- [:span.featured-note
- [:span.icon i/trash]
- [:span.text
- [:span (str/format "We have sent you an email to “")]
- [:strong (:email profile)]
- [:span "” Please follow the instructions to verify the email."]]]
+
+ [:& msgs/inline-banner
+ {:type :info
+ :content (t locale "settings.change-email-info2" (:email profile))}]
[:button.btn-primary.btn-large
{:on-click #(modal/hide!)}
diff --git a/frontend/src/uxbox/main/ui/settings/header.cljs b/frontend/src/uxbox/main/ui/settings/header.cljs
index dfaa50a1f4..a8d042defe 100644
--- a/frontend/src/uxbox/main/ui/settings/header.cljs
+++ b/frontend/src/uxbox/main/ui/settings/header.cljs
@@ -9,7 +9,6 @@
(ns uxbox.main.ui.settings.header
(:require
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.main.ui.icons :as i]
[uxbox.main.data.auth :as da]
diff --git a/frontend/src/uxbox/main/ui/settings/profile.cljs b/frontend/src/uxbox/main/ui/settings/profile.cljs
index 146c4a646f..ae7bc60ed4 100644
--- a/frontend/src/uxbox/main/ui/settings/profile.cljs
+++ b/frontend/src/uxbox/main/ui/settings/profile.cljs
@@ -11,17 +11,17 @@
(:require
[cljs.spec.alpha :as s]
[cuerdas.core :as str]
- [lentes.core :as l]
[rumext.alpha :as mf]
- [uxbox.main.ui.icons :as i]
+ [uxbox.main.data.messages :as dm]
[uxbox.main.data.users :as udu]
+ [uxbox.main.refs :as refs]
+ [uxbox.main.store :as st]
[uxbox.main.ui.components.forms :refer [input submit-button form]]
+ [uxbox.main.ui.icons :as i]
+ [uxbox.main.ui.messages :as msgs]
+ [uxbox.main.ui.modal :as modal]
[uxbox.main.ui.settings.change-email :refer [change-email-modal]]
[uxbox.main.ui.settings.delete-account :refer [delete-account-modal]]
- [uxbox.main.ui.modal :as modal]
- [uxbox.main.data.messages :as dm]
- [uxbox.main.store :as st]
- [uxbox.main.refs :as refs]
[uxbox.util.dom :as dom]
[uxbox.util.forms :as fm]
[uxbox.util.i18n :as i18n :refer [tr t]]))
@@ -73,20 +73,17 @@
(t locale "settings.change-email-label")]]
(not= (:pending-email prof) (:email prof))
- [:span.featured-note
- [:span.icon i/trash]
- [:span.text
- [:span "There is a pending change of your email to "]
- [:strong (:pending-email prof)]
- [:span "."] [:br]
- [:a {:on-click #(st/emit! udu/cancel-email-change)}
- "Dismiss"]]]
+ [:& msgs/inline-banner
+ {:type :info
+ :content (t locale "settings.change-email-info3" (:pending-email prof))}
+ [:div.btn-secondary.btn-small
+ {:on-click #(st/emit! udu/cancel-email-change)}
+ (t locale "settings.cancel-email-change")]]
:else
- [:span.featured-note.warning
- [:span.text
- [:span "There is a pending email validation."]]])
-
+ [:& msgs/inline-banner
+ {:type :info
+ :content (t locale "settings.email-verification-pending")}])
[:& submit-button
{:label (t locale "settings.profile-submit-label")}]
diff --git a/frontend/src/uxbox/main/ui/viewer.cljs b/frontend/src/uxbox/main/ui/viewer.cljs
index 53368656dd..f444e41378 100644
--- a/frontend/src/uxbox/main/ui/viewer.cljs
+++ b/frontend/src/uxbox/main/ui/viewer.cljs
@@ -22,7 +22,6 @@
[uxbox.main.ui.components.dropdown :refer [dropdown]]
[uxbox.main.ui.hooks :as hooks]
[uxbox.main.ui.keyboard :as kbd]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.viewer.header :refer [header]]
[uxbox.main.ui.viewer.thumbnails :refer [thumbnails-panel]]
[uxbox.main.ui.viewer.shapes :refer [frame-svg]]
@@ -87,23 +86,21 @@
(mf/use-effect on-mount)
(hooks/use-shortcuts dv/shortcuts)
- [:*
- [:& messages]
- [:div.viewer-layout {:class (classnames :fullscreen fullscreen?)
- :ref container}
+ [:div.viewer-layout {:class (classnames :fullscreen fullscreen?)
+ :ref container}
- [:& header {:data data
- :toggle-fullscreen toggle-fullscreen
- :fullscreen? fullscreen?
- :local local
- :index index}]
- [:div.viewer-content {:on-click on-click}
- (when (:show-thumbnails local)
- [:& thumbnails-panel {:index index
- :data data}])
- [:& main-panel {:data data
- :local local
- :index index}]]]]))
+ [:& header {:data data
+ :toggle-fullscreen toggle-fullscreen
+ :fullscreen? fullscreen?
+ :local local
+ :index index}]
+ [:div.viewer-content {:on-click on-click}
+ (when (:show-thumbnails local)
+ [:& thumbnails-panel {:index index
+ :data data}])
+ [:& main-panel {:data data
+ :local local
+ :index index}]]]))
;; --- Component: Viewer Page
diff --git a/frontend/src/uxbox/main/ui/viewer/thumbnails.cljs b/frontend/src/uxbox/main/ui/viewer/thumbnails.cljs
index d4d6f0e7c3..4056a8c0f1 100644
--- a/frontend/src/uxbox/main/ui/viewer/thumbnails.cljs
+++ b/frontend/src/uxbox/main/ui/viewer/thumbnails.cljs
@@ -11,7 +11,6 @@
(:require
[goog.events :as events]
[goog.object :as gobj]
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.main.ui.icons :as i]
[uxbox.common.data :as d]
diff --git a/frontend/src/uxbox/main/ui/workspace.cljs b/frontend/src/uxbox/main/ui/workspace.cljs
index 5ca04a9138..18e04f3f2a 100644
--- a/frontend/src/uxbox/main/ui/workspace.cljs
+++ b/frontend/src/uxbox/main/ui/workspace.cljs
@@ -10,7 +10,6 @@
(ns uxbox.main.ui.workspace
(:require
[beicon.core :as rx]
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.main.ui.icons :as i]
[uxbox.main.constants :as c]
@@ -22,7 +21,6 @@
[uxbox.main.ui.confirm]
[uxbox.main.ui.keyboard :as kbd]
[uxbox.main.ui.hooks :as hooks]
- [uxbox.main.ui.messages :refer [messages]]
[uxbox.main.ui.workspace.viewport :refer [viewport coordinates]]
[uxbox.main.ui.workspace.colorpalette :refer [colorpalette]]
[uxbox.main.ui.workspace.context-menu :refer [context-menu]]
@@ -117,12 +115,11 @@
(let [file (mf/deref refs/workspace-file)
project (mf/deref refs/workspace-project)
layout (mf/deref refs/workspace-layout)]
- [:*
+ [:section
[:& header {:file file
:project project
:layout layout}]
- [:& messages]
[:& context-menu]
(if (and (and file project)
diff --git a/frontend/src/uxbox/main/ui/workspace/download.cljs b/frontend/src/uxbox/main/ui/workspace/download.cljs
deleted file mode 100644
index 745c12bdcc..0000000000
--- a/frontend/src/uxbox/main/ui/workspace/download.cljs
+++ /dev/null
@@ -1,141 +0,0 @@
-;; This Source Code Form is subject to the terms of the Mozilla Public
-;; License, v. 2.0. If a copy of the MPL was not distributed with this
-;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
-;;
-;; Copyright (c) 2016 Andrey Antukh
-;; Copyright (c) 2016 Juan de la Cruz
-
-(ns uxbox.main.ui.workspace.download
- #_(:require [cuerdas.core :as str]
- [beicon.core :as rx]
- [potok.core :as ptk]
- [lentes.core :as l]
- [uxbox.main.ui.icons :as i]
- [uxbox.main.store :as st]
- [uxbox.main.refs :as refs]
- [uxbox.main.data.lightbox :as udl]
- ;; [uxbox.main.exports :as exports]
- [uxbox.util.blob :as blob]
- [uxbox.util.data :refer (read-string)]
- [uxbox.util.time :as dt]
- [uxbox.util.dom :as dom]
- [uxbox.util.zip :as zip]))
-
-;; --- Refs
-
-;; (defn- resolve-pages
-;; [state]
-;; (let [project (get-in state [:workspace :project])]
-;; (->> (vals (:pages state))
-;; (filter #(= project (:project %)))
-;; (sort-by :created-at))))
-
-;; (def pages-ref
-;; (-> (l/lens resolve-pages)
-;; (l/derive st/state)))
-
-;; (def current-page-ref
-;; (-> (l/in [:workspace :page])
-;; (l/derive st/state)))
-
-;; ;; --- Download Lightbox (Component)
-
-;; (defn- download-page-svg
-;; [{:keys [name id] :as page}]
-;; (let [content (or #_(exports/render-page id) "")
-;; blob (blob/create content "image/svg+xml")
-;; uri (blob/create-uri blob)
-;; link (.createElement js/document "a")
-;; event (js/MouseEvent. "click")
-;; now (dt/now)]
-
-;; (.setAttribute link "href" uri)
-;; (.setAttribute link "download" (str (str/uslug name) "_"
-;; (dt/format now :unix)
-;; ".svg"))
-
-;; (.appendChild (.-body js/document) link)
-;; (.dispatchEvent link event)
-;; (blob/revoke-uri uri)
-;; (.removeChild (.-body js/document) link)))
-
-;; (defn- generate-files
-;; [pages]
-;; (reduce (fn [acc {:keys [id name]}]
-;; (let [content (or #_(exports/render-page id) "")]
-;; (conj acc [(str (str/uslug name) ".svg")
-;; (blob/create content "image/svg+xml")])))
-;; []
-;; pages))
-
-;; (defn- download-project-zip
-;; [{:keys [name] :as project} pages]
-;; (let [event (js/MouseEvent. "click")
-;; link (.createElement js/document "a")
-;; now (dt/now)
-;; stream (->> (rx/from (generate-files pages))
-;; (rx/reduce conj [])
-;; (rx/mapcat zip/build)
-;; (rx/map blob/create-uri)
-;; (rx/take 1))
-;; download (str (str/uslug name) "_" (dt/format now :unix) ".zip")]
-;; (rx/subscribe stream (fn [uri]
-;; (.setAttribute link "download" download)
-;; (.setAttribute link "href" uri)
-;; (.appendChild (.-body js/document) link)
-;; (.dispatchEvent link event)
-;; (blob/revoke-uri uri)
-;; (.removeChild (.-body js/document) link)))))
-
-;; (mx/defcs download-dialog
-;; {:mixins [mx/static mx/reactive]}
-;; [own]
-;; #_(let [project (mx/react refs/selected-project)
-;; pages (mx/react pages-ref)
-;; current (mx/react current-page-ref)]
-;; (letfn [(on-close [event]
-;; (dom/prevent-default event)
-;; (udl/close!))
-;; (download-page [event]
-;; (dom/prevent-default event)
-;; (let [id (-> (mx/ref-node own "page")
-;; (dom/get-value)
-;; (read-string))
-;; page (->> pages
-;; (filter #(= id (:id %)))
-;; (first))]
-;; (download-page-svg page)
-;; (udl/close!)))
-;; (download-zip [event]
-;; (dom/prevent-default event)
-;; (download-project-zip project pages)
-;; (udl/close!))
-;; (download-html [event]
-;; (dom/prevent-default event))]
-;; [:div.lightbox-body.export-dialog {}
-;; [:h3 {} "Download options"]
-;; [:div.row-flex {}
-;; [:div.content-col {}
-;; [:span.icon {} i/file-svg]
-;; [:span.title {} "Download page"]
-;; [:p.info {} "Download a single page of your project in SVG."]
-;; [:select.input-select {:ref "page" :default-value (pr-str current)}
-;; (for [{:keys [id name]} pages]
-;; [:option {:value (pr-str id) :key (pr-str id)} name])]
-;; [:a.btn-primary {:href "#" :on-click download-page} "Download page"]]
-;; [:div.content-col {}
-;; [:span.icon {} i/folder-zip]
-;; [:span.title {} "Download project"]
-;; [:p.info {} "Download all pages as svg in a zip file."]
-;; [:a.btn-primary {:href "#" :on-click download-zip} "Download project"]]
-;; ; [:div.content-col
-;; ; [:span.icon i/file-html]
-;; ; [:span.title "Download as HTML"]
-;; ; [:p.info "Download your project as HTML files."]
-;; ; [:a.btn-primary {:href "#" :on-click download-html} "Download HTML"]]
-;; ]
-;; [:a.close {:href "#" :on-click on-close} i/close]])))
-
-;; (defmethod lbx/render-lightbox :download
-;; [_]
-;; (download-dialog))
diff --git a/frontend/src/uxbox/main/ui/workspace/images.cljs b/frontend/src/uxbox/main/ui/workspace/images.cljs
index ea5f7a502c..832a4affe9 100644
--- a/frontend/src/uxbox/main/ui/workspace/images.cljs
+++ b/frontend/src/uxbox/main/ui/workspace/images.cljs
@@ -2,8 +2,10 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
-;; Copyright (c) 2015-2017 Juan de la Cruz
-;; Copyright (c) 2015-2019 Andrey Antukh
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.images
(:require
diff --git a/frontend/src/uxbox/main/ui/workspace/selection.cljs b/frontend/src/uxbox/main/ui/workspace/selection.cljs
index 902fc9f116..b0a41512cd 100644
--- a/frontend/src/uxbox/main/ui/workspace/selection.cljs
+++ b/frontend/src/uxbox/main/ui/workspace/selection.cljs
@@ -2,14 +2,15 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
-;; Copyright (c) 2015-2020 Juan de la Cruz
-;; Copyright (c) 2015-2020 Andrey Antukh
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.selection
"Selection handlers component."
(:require
[beicon.core :as rx]
- [lentes.core :as l]
[cuerdas.core :as str]
[potok.core :as ptk]
[rumext.alpha :as mf]
diff --git a/frontend/src/uxbox/main/ui/workspace/shapes/text.cljs b/frontend/src/uxbox/main/ui/workspace/shapes/text.cljs
index 492667af81..77b9890e83 100644
--- a/frontend/src/uxbox/main/ui/workspace/shapes/text.cljs
+++ b/frontend/src/uxbox/main/ui/workspace/shapes/text.cljs
@@ -2,14 +2,16 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
-;; Copyright (c) 2016-2019 Andrey Antukh
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.shapes.text
(:require
[cuerdas.core :as str]
[goog.events :as events]
[goog.object :as gobj]
- [lentes.core :as l]
[rumext.alpha :as mf]
[uxbox.common.data :as d]
[uxbox.main.data.workspace :as dw]
diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar.cljs
index 4245dddd5e..cfeef12750 100644
--- a/frontend/src/uxbox/main/ui/workspace/sidebar.cljs
+++ b/frontend/src/uxbox/main/ui/workspace/sidebar.cljs
@@ -5,15 +5,13 @@
;; This Source Code Form is "Incompatible With Secondary Licenses", as
;; defined by the Mozilla Public License, v. 2.0.
;;
-;; Copyright (c) 2015-2017 Andrey Antukh
-;; Copyright (c) 2015-2017 Juan de la Cruz
+;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.sidebar
(:require
[rumext.alpha :as mf]
[cuerdas.core :as str]
[uxbox.main.ui.workspace.sidebar.history :refer [history-toolbox]]
- [uxbox.main.ui.workspace.sidebar.icons :refer [icons-toolbox]]
[uxbox.main.ui.workspace.sidebar.layers :refer [layers-toolbox]]
[uxbox.main.ui.workspace.sidebar.options :refer [options-toolbox]]
[uxbox.main.ui.workspace.sidebar.sitemap :refer [sitemap-toolbox]]
@@ -45,6 +43,4 @@
[:aside#settings-bar.settings-bar
[:div.settings-bar-inside
(when (contains? layout :element-options)
- [:& options-toolbox {:page page}])
- (when (contains? layout :icons)
- [:& icons-toolbox])]])
+ [:& options-toolbox {:page page}])]])
diff --git a/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs b/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs
index 94873ea8d3..23004be0ab 100644
--- a/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs
+++ b/frontend/src/uxbox/main/ui/workspace/sidebar/icons.cljs
@@ -2,20 +2,21 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
-;; Copyright (c) 2015-2016 Andrey Antukh
-;; Copyright (c) 2015-2016 Juan de la Cruz
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.main.ui.workspace.sidebar.icons
(:require
- [lentes.core :as l]
+ #_[uxbox.main.ui.dashboard.icons :as icons]
[rumext.alpha :as mf]
[uxbox.common.data :as d]
- [uxbox.main.ui.icons :as i]
[uxbox.main.data.icons :as di]
[uxbox.main.data.workspace :as dw]
[uxbox.main.refs :as refs]
[uxbox.main.store :as st]
- #_[uxbox.main.ui.dashboard.icons :as icons]
+ [uxbox.main.ui.icons :as i]
[uxbox.main.ui.shapes.icon :as icon]
[uxbox.util.data :refer [read-string]]
[uxbox.util.dom :as dom]
diff --git a/frontend/src/uxbox/util/forms.cljs b/frontend/src/uxbox/util/forms.cljs
index 5cf7227585..d5de8b6022 100644
--- a/frontend/src/uxbox/util/forms.cljs
+++ b/frontend/src/uxbox/util/forms.cljs
@@ -2,7 +2,10 @@
;; License, v. 2.0. If a copy of the MPL was not distributed with this
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
;;
-;; Copyright (c) 2015-2017 Andrey Antukh
+;; This Source Code Form is "Incompatible With Secondary Licenses", as
+;; defined by the Mozilla Public License, v. 2.0.
+;;
+;; Copyright (c) 2020 UXBOX Labs SL
(ns uxbox.util.forms
(:refer-clojure :exclude [uuid])
@@ -10,7 +13,6 @@
[beicon.core :as rx]
[cljs.spec.alpha :as s]
[cuerdas.core :as str]
- [lentes.core :as l]
[potok.core :as ptk]
[rumext.alpha :as mf]
[uxbox.common.spec :as us]
diff --git a/frontend/src/uxbox/util/lens.cljs b/frontend/src/uxbox/util/lens.cljs
deleted file mode 100644
index a52efabfbc..0000000000
--- a/frontend/src/uxbox/util/lens.cljs
+++ /dev/null
@@ -1,16 +0,0 @@
-;; This Source Code Form is subject to the terms of the Mozilla Public
-;; License, v. 2.0. If a copy of the MPL was not distributed with this
-;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
-;;
-;; Copyright (c) 2015-2016 Andrey Antukh
-;; Copyright (c) 2015-2016 Juan de la Cruz
-
-(ns uxbox.util.lens
- (:refer-clojure :exclude [merge])
- (:require [lentes.core :as l]))
-
-(defn merge
- [data]
- (l/lens
- (fn [s] (cljs.core/merge s data))
- #(throw (ex-info "Not implemented" {}))))