diff --git a/.gitignore b/.gitignore index d5482f52de..e00a660c4d 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,8 @@ components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/dist/ components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/package-lock.json components/application-mgt/org.wso2.carbon.device.application.mgt.store.ui/react-app/tmp/ +components/device-mgt/io.entgra.device.mgt.ui/react-app/node_modules/ +components/device-mgt/io.entgra.device.mgt.ui/react-app/dist/ +components/device-mgt/io.entgra.device.mgt.ui/react-app/package-lock.json +components/device-mgt/io.entgra.device.mgt.ui/react-app/tmp/ diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandler.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandler.java index 8bad3de1a8..06d344a514 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandler.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandler.java @@ -55,7 +55,7 @@ public class AuthenticationHandler extends AbstractHandler { private static final String X_JWT_ASSERTION = "X-JWT-Assertion"; private static final String JWTTOKEN = "JWTToken"; private static final String AUTHORIZATION = "Authorization"; - private static final String BEARER = "Bearer "; + private static final String BEARER = "Basic "; private static final String CONTENT_TYPE = "Content-Type"; private IOTServerConfiguration iotServerConfiguration; @@ -95,7 +95,7 @@ public class AuthenticationHandler extends AbstractHandler { log.debug("Verify Cert:\n" + mdmSignature); } URI certVerifyUrl = new URI(iotServerConfiguration.getVerificationEndpoint() + "ios"); - Map certVerifyHeaders = this.setHeaders(this.restInvoker); + Map certVerifyHeaders = this.setHeaders(); Certificate certificate = new Certificate(); certificate.setPem(mdmSignature); @@ -127,7 +127,7 @@ public class AuthenticationHandler extends AbstractHandler { String deviceType = this.getDeviceType(messageContext.getTo().getAddress().trim()); URI certVerifyUrl = new URI(iotServerConfiguration.getVerificationEndpoint() + deviceType); - Map certVerifyHeaders = this.setHeaders(this.restInvoker); + Map certVerifyHeaders = this.setHeaders(); Certificate certificate = new Certificate(); certificate.setPem(subjectDN); certificate.setTenantId(tenantId); @@ -157,7 +157,7 @@ public class AuthenticationHandler extends AbstractHandler { } String deviceType = this.getDeviceType(messageContext.getTo().getAddress().trim()); URI certVerifyUrl = new URI(iotServerConfiguration.getVerificationEndpoint() + deviceType); - Map certVerifyHeaders = this.setHeaders(this.restInvoker); + Map certVerifyHeaders = this.setHeaders(); Certificate certificate = new Certificate(); certificate.setPem(encodedPem); @@ -184,9 +184,6 @@ public class AuthenticationHandler extends AbstractHandler { } catch (URISyntaxException e) { log.error("Error while processing certificate.", e); return false; - } catch (APIMCertificateMGTException e) { - log.error("Error while processing certificate.", e); - return false; } catch (CertificateException e) { log.error("Certificate issue occurred when generating converting PEM to x509Certificate", e); return false; @@ -212,9 +209,9 @@ public class AuthenticationHandler extends AbstractHandler { return null; } - private Map setHeaders(RESTInvoker restInvoker) throws APIMCertificateMGTException { + private Map setHeaders() { Map map = new HashMap<>(); - String accessToken = Utils.getAccessToken(iotServerConfiguration, restInvoker); + String accessToken = Utils.getBase64EncodedToken(iotServerConfiguration); map.put(AUTHORIZATION, BEARER + accessToken); map.put(CONTENT_TYPE, "application/json"); return map; diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java index f149868e76..5be2c18705 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java @@ -135,38 +135,14 @@ public class Utils { } /** - * This class get the access token from the key manager. + * This method is used to get the base64 encoded token. * * @param iotServerConfiguration Instance of the IoTsererConfiguration. * @return Access token will be returned. - * @throws APIMCertificateMGTException */ - public static String getAccessToken(IOTServerConfiguration iotServerConfiguration, RESTInvoker restInvoker) - throws APIMCertificateMGTException { - try { - if (clientId == null || clientSecret == null) { - getClientSecretes(iotServerConfiguration, restInvoker); - } - URI tokenUrl = new URI(iotServerConfiguration.getOauthTokenEndpoint()); - String tokenContent = "grant_type=password&username=" + iotServerConfiguration.getUsername() + "&password=" + - iotServerConfiguration.getPassword() + "&scope=activity-view"; - String tokenBasicAuth = "Basic " + Base64.encode((clientId + ":" + clientSecret).getBytes()); - Map tokenHeaders = new HashMap<>(); - tokenHeaders.put("Authorization", tokenBasicAuth); - tokenHeaders.put("Content-Type", "application/x-www-form-urlencoded"); - - RESTResponse response = restInvoker.invokePOST(tokenUrl, tokenHeaders, tokenContent); - if (log.isDebugEnabled()) { - log.debug("Token response:" + response.getContent()); - } - JSONObject jsonResponse = new JSONObject(response.getContent()); - return jsonResponse.getString("access_token"); - - } catch (URISyntaxException | IOException e) { - throw new APIMCertificateMGTException("Error occurred while trying to call oauth token endpoint", e); - } catch (JSONException e) { - throw new APIMCertificateMGTException("Error occurred while converting the json to object", e); - } + public static String getBase64EncodedToken(IOTServerConfiguration iotServerConfiguration) { + return Base64.encode((iotServerConfiguration.getUsername() + ":" + iotServerConfiguration.getPassword()). + getBytes()); } /** diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/test/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandlerTest.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/test/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandlerTest.java index b3b8cdac78..23e6b251fc 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/test/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandlerTest.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/test/java/org/wso2/carbon/apimgt/handlers/AuthenticationHandlerTest.java @@ -92,8 +92,6 @@ public class AuthenticationHandlerTest extends BaseAPIHandlerTest { HashMap transportHeaders = new HashMap<>(); transportHeaders.put(AuthConstants.MDM_SIGNATURE, "some cert"); setMockClient(); - this.mockClient.setResponse(getDCRResponse()); - this.mockClient.setResponse(getAccessTokenReponse()); this.mockClient.setResponse(getValidationResponse()); boolean response = this.handler.handleRequest(createSynapseMessageContext("", this.synapseConfiguration, transportHeaders, "https://test.com/testservice/device-mgt/testdevice")); @@ -107,7 +105,6 @@ public class AuthenticationHandlerTest extends BaseAPIHandlerTest { HashMap transportHeaders = new HashMap<>(); transportHeaders.put(AuthConstants.PROXY_MUTUAL_AUTH_HEADER, "Test Header"); setMockClient(); - this.mockClient.setResponse(getAccessTokenReponse()); this.mockClient.setResponse(getValidationResponse()); boolean response = this.handler.handleRequest(createSynapseMessageContext("", this.synapseConfiguration, transportHeaders, "https://test.com/testservice/device-mgt/testdevice")); @@ -121,7 +118,6 @@ public class AuthenticationHandlerTest extends BaseAPIHandlerTest { HashMap transportHeaders = new HashMap<>(); transportHeaders.put(AuthConstants.MUTUAL_AUTH_HEADER, "Test Header"); setMockClient(); - this.mockClient.setResponse(getAccessTokenReponse()); this.mockClient.setResponse(getValidationResponse()); MessageContext messageContext = createSynapseMessageContext("", this.synapseConfiguration, transportHeaders, "https://test.com/testservice/device-mgt/testdevice"); @@ -141,7 +137,6 @@ public class AuthenticationHandlerTest extends BaseAPIHandlerTest { HashMap transportHeaders = new HashMap<>(); transportHeaders.put(AuthConstants.ENCODED_PEM, "encoded pem"); setMockClient(); - this.mockClient.setResponse(getAccessTokenReponse()); this.mockClient.setResponse(getValidationResponse()); MessageContext messageContext = createSynapseMessageContext("", this.synapseConfiguration, transportHeaders, "https://test.com/testservice/device-mgt/testdevice"); @@ -156,7 +151,6 @@ public class AuthenticationHandlerTest extends BaseAPIHandlerTest { HashMap transportHeaders = new HashMap<>(); transportHeaders.put(AuthConstants.ENCODED_PEM, "encoded pem"); setMockClient(); - this.mockClient.setResponse(getAccessTokenReponse()); this.mockClient.setResponse(getInvalidResponse()); MessageContext messageContext = createSynapseMessageContext("", this.synapseConfiguration, transportHeaders, "https://test.com/testservice/device-mgt/testdevice"); @@ -185,7 +179,6 @@ public class AuthenticationHandlerTest extends BaseAPIHandlerTest { HashMap transportHeaders = new HashMap<>(); transportHeaders.put(AuthConstants.ENCODED_PEM, "encoded pem"); setMockClient(); - this.mockClient.setResponse(getAccessTokenReponse()); this.mockClient.setResponse(null); MessageContext messageContext = createSynapseMessageContext("", this.synapseConfiguration, transportHeaders, "https://test.com/testservice/device-mgt/testdevice"); diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/app/Test Android App b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/app/Test Android App deleted file mode 100644 index 10dfe26209..0000000000 Binary files a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/app/Test Android App and /dev/null differ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/banner/My First Banner b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/banner/My First Banner deleted file mode 100644 index e8c57421c2..0000000000 Binary files a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/banner/My First Banner and /dev/null differ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/icon/My First Icon b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/icon/My First Icon deleted file mode 100644 index df25ec4e45..0000000000 Binary files a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/icon/My First Icon and /dev/null differ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot1/shot1 b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot1/shot1 deleted file mode 100644 index df25ec4e45..0000000000 Binary files a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot1/shot1 and /dev/null differ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot2/shot3 b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot2/shot3 deleted file mode 100644 index df25ec4e45..0000000000 Binary files a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot2/shot3 and /dev/null differ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot3/shot2 b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot3/shot2 deleted file mode 100644 index df25ec4e45..0000000000 Binary files a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/repository/resources/apps/d46b34e7ba08f0d45056e77b9c70f528/screenshot3/shot2 and /dev/null differ diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java index cc6938c934..5eb638a61d 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/main/java/org/wso2/carbon/device/application/mgt/core/dao/impl/subscription/GenericSubscriptionDAOImpl.java @@ -147,9 +147,8 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc log.error(msg); throw new ApplicationManagementDAOException(msg, e); } catch (SQLException e) { - String msg = "Error occurred when obtaining database connection for updating the device subscriptions of " - + "application. Updated by: " + updateBy + " and updating action triggered from " - + actionTriggeredFrom; + String msg = "Error occurred while executing SQL to update the device subscriptions of application. " + + "Updated by: " + updateBy + " and updating action triggered from " + actionTriggeredFrom; log.error(msg); throw new ApplicationManagementDAOException(msg, e); } @@ -356,7 +355,7 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc log.error(msg); throw new ApplicationManagementDAOException(msg, e); } catch (SQLException e) { - String msg = "Error occurred while getting device subscription data for application ID: " + appReleaseId; + String msg = "Error occurred while while running SQL to get device subscription data for application ID: " + appReleaseId; log.error(msg); throw new ApplicationManagementDAOException(msg, e); } @@ -618,12 +617,12 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc stmt.executeBatch(); } } catch (DBConnectionException e) { - String msg = "Error occurred while obtaining the DB connection to update the user subscriptions of " - + "application."; + String msg = "Error occurred while obtaining the DB connection to update the user/role/group subscriptions " + + "of application."; log.error(msg); throw new ApplicationManagementDAOException(msg, e); } catch (SQLException e) { - String msg = "Error occurred when obtaining database connection for updating the user subscriptions of " + String msg = "Error occurred while processing SQL to update the user/role/group subscriptions of " + "application."; log.error(msg); throw new ApplicationManagementDAOException(msg, e); @@ -691,8 +690,8 @@ public class GenericSubscriptionDAOImpl extends AbstractDAOImpl implements Subsc log.error(msg); throw new ApplicationManagementDAOException(msg, e); } catch (SQLException e) { - String msg = "Error occurred when obtaining database connection for updating the subscription status of the " - + "device subscription."; + String msg = "Error occurred when processing SQL to update the subscription status of the device " + + "subscription."; log.error(msg); throw new ApplicationManagementDAOException(msg, e); } diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/carbon-home/repository/conf/application-mgt.xml b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/carbon-home/repository/conf/application-mgt.xml index 203e987a3c..ba772ea2e1 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/carbon-home/repository/conf/application-mgt.xml +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.core/src/test/resources/carbon-home/repository/conf/application-mgt.xml @@ -37,7 +37,7 @@ org.wso2.carbon.device.application.mgt.core.impl.ApplicationStorageManagerImpl - repository/resources/apps/ + /tmp/apps/ 6 diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ReviewManagementPublisherAdminAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ReviewManagementPublisherAdminAPI.java index 1b649af7c5..f751d98a22 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ReviewManagementPublisherAdminAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.publisher.api/src/main/java/org/wso2/carbon/device/application/mgt/publisher/api/services/admin/ReviewManagementPublisherAdminAPI.java @@ -30,14 +30,8 @@ import org.wso2.carbon.apimgt.annotations.api.Scope; import org.wso2.carbon.apimgt.annotations.api.Scopes; import org.wso2.carbon.device.application.mgt.common.ErrorResponse; import org.wso2.carbon.device.application.mgt.common.PaginationResult; -import org.wso2.carbon.device.application.mgt.common.response.Review; -import org.wso2.carbon.device.application.mgt.common.wrapper.ReviewWrapper; -import javax.validation.Valid; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; import javax.ws.rs.GET; -import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; @@ -69,13 +63,13 @@ tags = { scopes = { @Scope( name = "Update a Review", - description = "Update a Review of applications.", + description = "Update a Review of application.", key = "perm:admin:app:review:update", permissions = {"/app-mgt/publisher/admin/review/update"} ), @Scope( name = "Get Review Details", - description = "Get review details of applications.", + description = "Get review details of application.", key = "perm:admin:app:review:view", permissions = {"/app-mgt/publisher/admin/review/view"} ) diff --git a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java index 60781d3881..2a163a5fb0 100644 --- a/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java +++ b/components/application-mgt/org.wso2.carbon.device.application.mgt.store.api/src/main/java/org/wso2/carbon/device/application/mgt/store/api/services/ApplicationManagementAPI.java @@ -49,11 +49,11 @@ import javax.ws.rs.core.Response; @SwaggerDefinition( info = @Info( version = "1.0.0", - title = "ApplicationDTO Storage Management Service", + title = "Application Storage Management Service", extensions = { @Extension(properties = { @ExtensionProperty(name = "name", value = "ApplicationStorageManagementService"), - @ExtensionProperty(name = "context", value = "/api/application-mgt-store/v1.0/store-applications"), + @ExtensionProperty(name = "context", value = "/api/application-mgt-store/v1.0/applications"), }) } ), @@ -65,7 +65,7 @@ import javax.ws.rs.core.Response; @Scopes( scopes = { @Scope( - name = "Get ApplicationDTO Details", + name = "Get Application Details", description = "Get application details", key = "perm:app:store:view", permissions = {"/app-mgt/store/application/view"} @@ -73,8 +73,8 @@ import javax.ws.rs.core.Response; } ) @Path("/applications") -@Api(value = "ApplicationDTO Management", description = "This API carries all app store management related operations " + - "such as get all the applications etc.") +@Api(value = "Application Management", description = "This API carries all app store management related operations such" + + " as get all the applications etc.") @Produces(MediaType.APPLICATION_JSON) public interface ApplicationManagementAPI { @@ -89,7 +89,7 @@ public interface ApplicationManagementAPI { httpMethod = "GET", value = "get all applications", notes = "This will get all applications", - tags = "ApplicationDTO Management", + tags = "Application Management", extensions = { @Extension(properties = { @ExtensionProperty(name = SCOPE, value = "perm:app:store:view") @@ -129,7 +129,7 @@ public interface ApplicationManagementAPI { httpMethod = "GET", value = "get the application of requesting application type", notes = "This will get the application identified by the application type and name, if exists", - tags = "ApplicationDTO Management", + tags = "Application Management", extensions = { @Extension(properties = { @ExtensionProperty(name = SCOPE, value = "perm:app:store:view") @@ -144,7 +144,7 @@ public interface ApplicationManagementAPI { response = ApplicationDTO.class), @ApiResponse( code = 404, - message = "ApplicationDTO not found"), + message = "Application not found"), @ApiResponse( code = 500, message = "Internal Server Error. \n Error occurred while getting relevant application.", diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/src/main/webapp/WEB-INF/web.xml b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/src/main/webapp/WEB-INF/web.xml index 6fd45f33b3..9722ee843e 100644 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/src/main/webapp/WEB-INF/web.xml +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.api/src/main/webapp/WEB-INF/web.xml @@ -37,6 +37,10 @@ doAuthentication true + + basicAuth + true + diff --git a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java index 71ce11b6b1..b25837154f 100755 --- a/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java +++ b/components/certificate-mgt/org.wso2.carbon.certificate.mgt.core/src/main/java/org/wso2/carbon/certificate/mgt/core/impl/CertificateGenerator.java @@ -324,9 +324,14 @@ public class CertificateGenerator { KeyStoreReader keyStoreReader = new KeyStoreReader(); if (distinguishedName != null && !distinguishedName.isEmpty()) { if (distinguishedName.contains("/CN=")) { - String[] dnSplits = distinguishedName.split("/CN="); - String commonNameExtracted = dnSplits[dnSplits.length - 1]; - lookUpCertificate = keyStoreReader.getCertificateBySerial(commonNameExtracted); + String[] dnSplits = distinguishedName.split("/"); + for (String dnPart : dnSplits) { + if (dnPart.contains("CN=")) { + String commonNameExtracted = dnPart.replace("CN=", ""); + lookUpCertificate = keyStoreReader.getCertificateBySerial(commonNameExtracted); + break; + } + } } else { LdapName ldapName; try { @@ -711,4 +716,4 @@ public class CertificateGenerator { return generateCertificateFromCSR(privateKeyCA, certificationRequest, certCA.getIssuerX500Principal().getName()); } -} \ No newline at end of file +} diff --git a/components/device-mgt/io.entgra.device.mgt.ui/pom.xml b/components/device-mgt/io.entgra.device.mgt.ui/pom.xml new file mode 100644 index 0000000000..c57e30dc4d --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/pom.xml @@ -0,0 +1,124 @@ + + + + 4.0.0 + + + org.wso2.carbon.devicemgt + application-mgt + 3.2.9-SNAPSHOT + + io.entgra.device.mgt.ui + 3.2.9-SNAPSHOT + war + WSO2 Carbon - Device Management UI Component + http://wso2.org + This Component contains Device Management UI + + + + + + + maven-war-plugin + + WEB-INF/lib/*cxf*.jar + entgra + + + ${npm.output.directory}/dist + + + ${npm.output.directory}/public + public + + + + + + com.github.eirslett + frontend-maven-plugin + ${frontend.mave.version} + + ${npm.working.dir} + + ${npm.install.dir} + + + + install node and npm + + install-node-and-npm + + generate-resources + + ${node.version} + ${npm.version} + + + + npm install + + npm + + + + install + + + + prod + + npm + + + run-script ${npm.build.command} + + generate-resources + + + + + + + + platform-windows + + + windows + + + + + npm.cmd + + + + + false + npm + build_prod + ./react-app + ./react-app/tmp + UTF-8 + react-app + + diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/babel.config.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/babel.config.js new file mode 100644 index 0000000000..9da1223d92 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/babel.config.js @@ -0,0 +1,11 @@ +module.exports = function (api) { + api.cache(true); + const presets = [ "@babel/preset-env", + "@babel/preset-react" ]; + const plugins = ["@babel/plugin-proposal-class-properties"]; + + return { + presets, + plugins + }; +}; \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/package.json b/components/device-mgt/io.entgra.device.mgt.ui/react-app/package.json new file mode 100644 index 0000000000..77dc59124d --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/package.json @@ -0,0 +1,86 @@ +{ + "name": "store", + "version": "1.0.0", + "description": "WSO2 IoT Server App Store", + "main": "App.js", + "proxy": "http://localhost:3001", + "repository": { + "type": "git", + "url": "git://github.com/wso2/carbon-devicemgt" + }, + "license": "Apache License 2.0", + "dependencies": { + "acorn": "^6.2.0", + "antd": "^3.20.1", + "axios": "^0.18.1", + "d3": "^5.9.7", + "dagre": "^0.8.4", + "javascript-time-ago": "^2.0.1", + "keymirror": "^0.1.1", + "lodash.debounce": "^4.0.8", + "rc-viewer": "0.0.9", + "react-d3-graph": "^2.1.0", + "react-highlight-words": "^0.16.0", + "react-image-viewer-zoom": "^1.0.36", + "react-infinite-scroller": "^1.2.4", + "react-router": "^5.0.1", + "react-router-config": "^5.0.1", + "react-router-dom": "^5.0.1", + "react-scripts": "2.1.8", + "react-star-ratings": "^2.3.0", + "react-twemoji": "^0.2.3", + "react-virtualized": "^9.21.1", + "reqwest": "^2.0.5", + "storm-react-diagrams": "^5.2.1" + }, + "devDependencies": { + "@babel/core": "^7.5.4", + "@babel/plugin-proposal-class-properties": "^7.5.0", + "@babel/preset-env": "^7.5.4", + "@babel/preset-react": "^7.0.0", + "@babel/register": "^7.4.4", + "babel-loader": "^8.0.6", + "body-parser": "^1.19.0", + "chai": "^4.1.2", + "css-loader": "^0.28.11", + "express": "^4.17.1", + "express-pino-logger": "^4.0.0", + "file-loader": "^2.0.0", + "html-loader": "^0.5.5", + "html-webpack-plugin": "^3.2.0", + "img-loader": "^3.0.1", + "json-loader": "^0.5.7", + "less": "^3.9.0", + "less-loader": "^4.1.0", + "mini-css-extract-plugin": "^0.5.0", + "mocha": "^5.2.0", + "mock-local-storage": "^1.0.5", + "node-env-run": "^3.0.2", + "node-sass": "^4.12.0", + "nodemon": "^1.19.1", + "npm-run-all": "^4.1.5", + "pino-colada": "^1.4.5", + "postcss-loader": "^3.0.0", + "react": "^16.8.6", + "react-dom": "^16.8.6", + "react-intl": "^2.9.0", + "sass-loader": "^6.0.7", + "style-loader": "^0.18.2", + "url-loader": "^1.1.2", + "webpack": "^4.35.3", + "webpack-cli": "^3.3.5", + "webpack-dev-server": "^3.7.2" + }, + "scripts": { + "start": "webpack-dev-server --mode development --open", + "dev": "webpack --mode development", + "build": "webpack --mode production", + "watch": "webpack --watch --mode development", + "test": "react-scripts test --env=jsdom", + "eject": "react-scripts eject", + "build_prod": "NODE_ENV=production NODE_OPTIONS=--max_old_space_size=4096 webpack -p --display errors-only --hide-modules", + "build_dev": "NODE_ENV=development webpack -d --watch ", + "server": "node-env-run server --exec nodemon | pino-colada", + "dev2": "run-p server start" + } +} diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/config.json b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/config.json new file mode 100644 index 0000000000..0d1b5d86f4 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/config.json @@ -0,0 +1,43 @@ +{ + "theme": { + "type": "default", + "value": "lightBaseTheme", + "logo" : "https://entgra.io/assets/images/svg/logo.svg", + "primaryColor": "rgb(24, 144, 255)" + }, + "serverConfig": { + "invokerUri": "/ui-request-handler/invoke/application-mgt-store/v1.0", + "invoker": { + "uri": "/store-ui-request-handler/invoke", + "publisher": "/application-mgt-publisher/v1.0", + "store": "/application-mgt-store/v1.0", + "admin" : "", + "deviceMgt" : "/device-mgt/v1.0" + }, + "loginUri": "/store-ui-request-handler/login", + "logoutUri": "/store-ui-request-handler/logout", + "platform": "store" + }, + "defaultPlatformIcons": { + "default": { + "icon": "global", + "color": "#535c68", + "theme": "outlined" + }, + "android": { + "icon": "android", + "color": "#7db343", + "theme": "filled" + }, + "ios": { + "icon": "apple", + "color": "#535c68", + "theme": "filled" + }, + "windows": { + "icon": "windows", + "color": "#008cc4", + "theme": "filled" + } + } +} diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/icons.json b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/icons.json new file mode 100644 index 0000000000..0bd52ef51e --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/icons.json @@ -0,0 +1,306 @@ +{ + "airplay": "", + "api": "", + "apn": "", + "vpn": "", + "apple": "", + "windows": "", + "android": "", + "wifi": "", + "application": "", + "configarations": "", + "battery": "", + "notification": "", + "blank-document": "", + "bookmark": "", + "bpel": "", + "bpmn": "", + "compare": "", + "bug": "", + "calendar": "", + "camera": "", + "contract": "", + "add": "", + "minus": "", + "check": "", + "cancel": "", + "checklist": "", + "circle": "", + "clear": "", + "expand": "", + "clock": "", + "cloud": "", + "circle-outline": "", + "contact": "", + "copy": "", + "dashboard": "", + "database": "", + "delete": "", + "deploy": "", + "display": "", + "dial-up": "", + "document": "", + "ellipsis": "", + "dss": "", + "ebook": "", + "edit": "", + "endpoint": "", + "folder": "", + "faq": "", + "error": "", + "export": "", + "factory-reset": "", + "file-browse": "", + "filter": "", + "message": "", + "forum": "", + "gadget": "", + "grid": "", + "hdd": "", + "home": "", + "hour-glass": "", + "import": "", + "incoming-call": "", + "info": "", + "invitation": "", + "jaggery": "", + "java": "", + "javaee": "", + "javascript": "", + "java-spring": "", + "jaxrs": "", + "jquery": "", + "key": "", + "laptop": "", + "ldap": "", + "lifecycle": "", + "sort-up": "", + "list": "", + "list-sort": "", + "lock": "", + "mail": "", + "map-location": "", + "menu": "", + "mobile": "", + "computer": "", + "ms-document": "", + "mute": "", + "nodejs": "", + "success": "", + "paste": "", + "pdf": "", + "pie-chart": "", + "chat": "", + "publish": "", + "redo": "", + "register": "", + "download": "", + "resource": "", + "rest-api": "", + "rest-service": "", + "sort-down": "", + "rules": "", + "save": "", + "scep": "", + "schema": "", + "search": "", + "security": "", + "send": "", + "sequence": "", + "server": "", + "service": "", + "service-provider": "", + "settings": "", + "share": "", + "sign-in": "", + "soap": "", + "sort": "", + "star": "", + "statistics": "", + "store": "", + "subscribe": "", + "fan": "", + "swagger": "", + "tag": "", + "task": "", + "text": "", + "policy": "", + "security-policy": "", + "throttling-policy": "", + "light": "", + "tiles": "", + "uncheck": "", + "undo": "", + "up": "", + "down": "", + "left": "", + "right": "", + "up-arrow": "", + "down-arrow": "", + "left-arrow": "", + "right-arrow": "", + "upload": "", + "uri": "", + "usb-drive": "", + "user": "", + "bar-chart": "", + "view": "", + "refresh": "", + "warning": "", + "ringing": "", + "block": "", + "web-app": "", + "globe": "", + "web-clip": "", + "proxy": "", + "web-service": "", + "website": "", + "xml": "", + "html": "\t\t\t\t", + "war": "", + "xacml": "", + "wsdl": "", + "wadl": "", + "xq": "", + "xsd": "", + "xslt": "", + "zoom-in": "", + "zoom-out": "", + "wso2-logo": "", + "wso2": "", + "hardware": "", + "raspberry": "", + "arduino": "", + "organization": "", + "public": "", + "unmute": "", + "group": "", + "question": "", + "square": "", + "square-outline": "", + "sync": "", + "loader": "", + "ungroup": "", + "enterprise": "", + "grip": "", + "sign-out": "", + "retweet": "", + "loader2": "", + "loader3": "", + "loader4": "", + "loader5": "", + "alert": "", + "layout": "", + "pages": "", + "build": "", + "alarm": "", + "heart": "", + "table": "", + "carbon": "", + "depend": "", + "jaxws": "", + "own": "", + "php": "", + "use": "", + "deprecate": "", + "prototype": "", + "retire": "", + "micro-services": "", + "activate": "", + "disabled": "", + "hide": "", + "facebook": "", + "github": "", + "google": "", + "google-docs": "", + "google-sheets": "", + "google-slides": "", + "google-plus": "", + "google-drive": "", + "instagram": "", + "linkedin": "", + "pinterest": "", + "skype": "", + "twitter": "", + "youtube": "", + "slash": "", + "analytics-extensions": "", + "esb-connector": "", + "extensions": "", + "is-connector": "", + "annotation": "", + "dgm-fork": "", + "dgm-header": "", + "dgm-if-else": "", + "dgm-lifeline": "", + "dgm-logger": "\t", + "dgm-try-catch": "", + "invoke": "", + "variable": "", + "worker": "", + "code": "", + "cut": "", + "type-converter": "", + "dgm-connector": "", + "dgm-constant-definition": "", + "dgm-resource": "", + "dgm-service": "", + "dgm-type-convertor": "", + "dgm-type": "", + "format": "", + "function": "", + "rename": "", + "package": "", + "action-invoke": "", + "assign": "", + "connector": "", + "constant": "", + "logical": "", + "try-catch": "", + "devices": "", + "http": "", + "main-function": "", + "dgm-while": "", + "run": "", + "action": "", + "image": "", + "folder-open": "", + "docker": "", + "polygon": "", + "code-view": "", + "design-view": "", + "comment": "", + "dgm-action": "", + "dgm-action-invoke": "", + "function-invoke": "", + "reply": "", + "return": "", + "struct": "", + "dgm-import": "", + "start": "", + "stepin": "", + "stepout": "", + "stepover": "", + "stop": "", + "console": "", + "resume": "", + "iterate": "", + "fork-join": "", + "break": "", + "throw": "", + "worker-invoke": "", + "worker-reply": "", + "shortcut": "", + "theme": "", + "pending": "", + "ballerina": "", + "ballerina-service": "", + "abort": "", + "transaction": "", + "android-logcat": "", + "android-sense": "", + "geo-fence-inbound": "", + "geo-fence-outbound": "", + "shell": "", + "speed-alert": "" +} \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/manifest.json b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/manifest.json new file mode 100644 index 0000000000..60f712111e --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/conf/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "App Store", + "name": "WSO2 IoT App Store", + "icons": [ + { + "src": "images/favicon.png", + "sizes": "16x16", + "type": "image/png" + } + ], + "start_url": "./index.html", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/css/font-wso2.css b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/css/font-wso2.css new file mode 100644 index 0000000000..abb8cc1eb0 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/css/font-wso2.css @@ -0,0 +1,1506 @@ +/*! +~ Copyright (c) 2017 WSO2 Inc. (http://wso2.com) All Rights Reserved. +~ +~ Licensed under the Apache License, Version 2.0 (the "License"); +~ you may not use this file except in compliance with the License. +~ You may obtain a copy of the License at +~ +~ http://www.apache.org/licenses/LICENSE-2.0 +~ +~ Unless required by applicable law or agreed to in writing, software +~ distributed under the License is distributed on an "AS IS" BASIS, +~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~ See the License for the specific language governing permissions and +~ limitations under the License. +*/ + + +@font-face { + font-family:"font-wso2"; + src:local("font-wso2"), url("../fonts/font-wso2.eot?6563fa91278f239ef8c827d90a165223"); + src:local("font-wso2"), + url("../fonts/font-wso2.eot?#iefix") format("embedded-opentype"), + url("../fonts/font-wso2.woff2?6563fa91278f239ef8c827d90a165223") format("woff2"), + url("../fonts/font-wso2.woff?6563fa91278f239ef8c827d90a165223") format("woff"), + url("../fonts/font-wso2.ttf?6563fa91278f239ef8c827d90a165223") format("truetype"), + url("../fonts/font-wso2.svg?6563fa91278f239ef8c827d90a165223#font-wso2") format("svg"); + font-weight:normal; + font-style:normal; +} + +.fw, [class^="fw-"], [class*=" fw-"] { + font: normal normal normal 14px/1 font-wso2; + display: inline-block; + font-weight: normal; + font-style: normal; + font-size: inherit; + font-variant: normal; + speak: none; + text-decoration: inherit; + + /* Better Font Rendering =========== */ + text-transform: none; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + + +/* ======================================================================== + * font options + * ======================================================================== */ + +.fw-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fw-2x { + font-size: 2em; +} +.fw-3x { + font-size: 3em; +} +.fw-4x { + font-size: 4em; +} +.fw-5x { + font-size: 5em; +} +.fw-fw { + width: 1.28571429em; + text-align: center; +} +.fw-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fw-ul > li { + position: relative; +} +.fw-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fw-li.fw-lg { + left: -1.85714286em; +} +.fw-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fw-background { + background: #888; + border-radius: .3em; + padding: .4em .50em .45em; +} +.fw-pull-left { + float: left; +} +.fw-pull-right { + float: right; +} +.fw.fw-pull-left { + margin-right: .3em; +} +.fw.fw-pull-right { + margin-left: .3em; +} +.fw-spin { + -webkit-animation: fw-spin 2s infinite linear; + animation: fw-spin 2s infinite linear; +} +@-webkit-keyframes fw-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fw-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fw-pulse { + -webkit-animation: fw-pulse 2s ease-out infinite; + animation: fw-pulse 2s ease-out infinite; +} +@-webkit-keyframes fw-pulse { + 0%, 30% { + opacity: 0.3; + } + 40% { + opacity: 1; + } + 100% { + opacity: 0.3; + } +} +@keyframes fw-pulse { + 0%, 30% { + opacity: 0.3; + } + 40% { + opacity: 1; + } + 100% { + opacity: 0.3; + } +} +.fw-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fw-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fw-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fw-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fw-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fw-rotate-90, +:root .fw-rotate-180, +:root .fw-rotate-270, +:root .fw-flip-horizontal, +:root .fw-flip-vertical { + filter: none; +} +.fw-stack, +.fw-helper { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 1.85em; + vertical-align: middle; +} +.fw-stack-1x, +.fw-stack-2x, +.fw-helper:before, +.fw-helper:after { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fw-stack-1x, +.fw-helper:before { + line-height: inherit; +} +.fw-stack-2x, +.fw-helper:after { + font-size: 1.9em; +} +.fw-helper-slash:before { + font-size: 1.4em; +} +.fw-helper-circle:before, +.fw-helper-square:before { + z-index: 1; +} +.fw-helper-circle-outline:after { + content: "\e61f"; +} +.fw-helper-circle:after { + content: "\e61a"; +} +.fw-helper-square-outline:after { + content: "\e6b2"; +} +.fw-helper-square:after { + content: "\e6b1"; +} +.fw-helper-slash:after { + content: "\e6e1"; +} +.fw-stack > .fw-stack { + position: absolute; + font-size: 0.5em; +} +.fw-stack > .fw-stack.fw-move-top { + top: -0.2em; +} +.fw-stack > .fw-stack.fw-move-bottom { + bottom: -0.2em; +} +.fw-stack > .fw.stack.fw-move-left { + left: -0.5em; +} +.fw-stack > .fw-stack.fw-move-right { + right: -0.5em; +} +.fw-inverse:before, +.fw-helper-inverse:after, +.fw-number { + color: #ffffff; +} +.fw-shadow:before, +.fw-helper-shadow:after { + text-shadow: #ffffff 1px 1px 0; +} +.fw-stroke:before, +.fw-helper-stroke:after { + text-shadow: -2px -2px 0 #ffffff, + 2px -2px 0 #ffffff, + -2px 2px 0 #ffffff, + 2px 2px 0 #ffffff; +} +.fw-number { + line-height: 2em; + font-family: Arial, Helvetica, sans-serif; +} + + +/* ======================================================================== + * font icons + * ======================================================================== */ + +.fw-abort:before { + content:"\e72a"; +} + +.fw-action-invoke:before { + content:"\e6fe"; +} + +.fw-action:before { + content:"\e709"; +} + +.fw-activate:before { + content:"\e6cf"; +} + +.fw-add:before { + content:"\e615"; +} + +.fw-airplay:before { + content:"\e600"; +} + +.fw-alarm:before { + content:"\e6c2"; +} + +.fw-alert:before { + content:"\e6be"; +} + +.fw-analytics-extensions:before { + content:"\e6e2"; +} + +.fw-android-logcat:before { + content:"\e72c"; +} + +.fw-android-sense:before { + content:"\e72d"; +} + +.fw-android:before { + content:"\e606"; +} + +.fw-annotation:before { + content:"\e6e6"; +} + +.fw-api:before { + content:"\e601"; +} + +.fw-apn:before { + content:"\e602"; +} + +.fw-apple:before { + content:"\e604"; +} + +.fw-application:before { + content:"\e608"; +} + +.fw-arduino:before { + content:"\e6ab"; +} + +.fw-assign:before { + content:"\e6ff"; +} + +.fw-ballerina-service:before { + content:"\e729"; +} + +.fw-ballerina:before { + content:"\e728"; +} + +.fw-bar-chart:before { + content:"\e690"; +} + +.fw-battery:before { + content:"\e60a"; +} + +.fw-blank-document:before { + content:"\e60c"; +} + +.fw-block:before { + content:"\e695"; +} + +.fw-bookmark:before { + content:"\e60d"; +} + +.fw-bpel:before { + content:"\e60e"; +} + +.fw-bpmn:before { + content:"\e60f"; +} + +.fw-break:before { + content:"\e721"; +} + +.fw-bug:before { + content:"\e611"; +} + +.fw-build:before { + content:"\e6c1"; +} + +.fw-calendar:before { + content:"\e612"; +} + +.fw-camera:before { + content:"\e613"; +} + +.fw-cancel:before { + content:"\e618"; +} + +.fw-carbon:before { + content:"\e6c5"; +} + +.fw-chat:before { + content:"\e65b"; +} + +.fw-check:before { + content:"\e617"; +} + +.fw-checklist:before { + content:"\e619"; +} + +.fw-circle-outline:before { + content:"\e61f"; +} + +.fw-circle:before { + content:"\e61a"; +} + +.fw-clear:before { + content:"\e61b"; +} + +.fw-clock:before { + content:"\e61d"; +} + +.fw-cloud:before { + content:"\e61e"; +} + +.fw-code-view:before { + content:"\e70e"; +} + +.fw-code:before { + content:"\e6f1"; +} + +.fw-comment:before { + content:"\e710"; +} + +.fw-compare:before { + content:"\e610"; +} + +.fw-computer:before { + content:"\e653"; +} + +.fw-configarations:before { + content:"\e609"; +} + +.fw-connector:before { + content:"\e700"; +} + +.fw-console:before { + content:"\e71d"; +} + +.fw-constant:before { + content:"\e701"; +} + +.fw-contact:before { + content:"\e620"; +} + +.fw-contract:before { + content:"\e614"; +} + +.fw-copy:before { + content:"\e621"; +} + +.fw-cut:before { + content:"\e6f2"; +} + +.fw-dashboard:before { + content:"\e622"; +} + +.fw-database:before { + content:"\e623"; +} + +.fw-delete:before { + content:"\e624"; +} + +.fw-depend:before { + content:"\e6c6"; +} + +.fw-deploy:before { + content:"\e625"; +} + +.fw-deprecate:before { + content:"\e6cb"; +} + +.fw-design-view:before { + content:"\e70f"; +} + +.fw-devices:before { + content:"\e704"; +} + +.fw-dgm-action-invoke:before { + content:"\e712"; +} + +.fw-dgm-action:before { + content:"\e711"; +} + +.fw-dgm-connector:before { + content:"\e6f4"; +} + +.fw-dgm-constant-definition:before { + content:"\e6f5"; +} + +.fw-dgm-fork:before { + content:"\e6e7"; +} + +.fw-dgm-header:before { + content:"\e6e8"; +} + +.fw-dgm-if-else:before { + content:"\e6e9"; +} + +.fw-dgm-import:before { + content:"\e717"; +} + +.fw-dgm-lifeline:before { + content:"\e6ea"; +} + +.fw-dgm-logger:before { + content:"\e6eb"; +} + +.fw-dgm-resource:before { + content:"\e6f6"; +} + +.fw-dgm-service:before { + content:"\e6f7"; +} + +.fw-dgm-try-catch:before { + content:"\e6ec"; +} + +.fw-dgm-type-convertor:before { + content:"\e6f8"; +} + +.fw-dgm-type:before { + content:"\e6f9"; +} + +.fw-dgm-while:before { + content:"\e707"; +} + +.fw-dial-up:before { + content:"\e627"; +} + +.fw-disabled:before { + content:"\e6d1"; +} + +.fw-display:before { + content:"\e626"; +} + +.fw-docker:before { + content:"\e70c"; +} + +.fw-document:before { + content:"\e628"; +} + +.fw-down-arrow:before { + content:"\e689"; +} + +.fw-down:before { + content:"\e685"; +} + +.fw-download:before { + content:"\e65f"; +} + +.fw-dss:before { + content:"\e62a"; +} + +.fw-ebook:before { + content:"\e62b"; +} + +.fw-edit:before { + content:"\e62c"; +} + +.fw-ellipsis:before { + content:"\e629"; +} + +.fw-endpoint:before { + content:"\e62d"; +} + +.fw-enterprise:before { + content:"\e6b6"; +} + +.fw-error:before { + content:"\e630"; +} + +.fw-esb-connector:before { + content:"\e6e3"; +} + +.fw-expand:before { + content:"\e61c"; +} + +.fw-export:before { + content:"\e631"; +} + +.fw-extensions:before { + content:"\e6e4"; +} + +.fw-facebook:before { + content:"\e6d3"; +} + +.fw-factory-reset:before { + content:"\e632"; +} + +.fw-fan:before { + content:"\e678"; +} + +.fw-faq:before { + content:"\e62f"; +} + +.fw-file-browse:before { + content:"\e633"; +} + +.fw-filter:before { + content:"\e634"; +} + +.fw-folder-open:before { + content:"\e70b"; +} + +.fw-folder:before { + content:"\e62e"; +} + +.fw-fork-join:before { + content:"\e720"; +} + +.fw-format:before { + content:"\e6fa"; +} + +.fw-forum:before { + content:"\e636"; +} + +.fw-function-invoke:before { + content:"\e713"; +} + +.fw-function:before { + content:"\e6fb"; +} + +.fw-gadget:before { + content:"\e637"; +} + +.fw-geo-fence-inbound:before { + content:"\e72e"; +} + +.fw-geo-fence-outbound:before { + content:"\e72f"; +} + +.fw-github:before { + content:"\e6d4"; +} + +.fw-globe:before { + content:"\e697"; +} + +.fw-google-docs:before { + content:"\e6d6"; +} + +.fw-google-drive:before { + content:"\e6da"; +} + +.fw-google-plus:before { + content:"\e6d9"; +} + +.fw-google-sheets:before { + content:"\e6d7"; +} + +.fw-google-slides:before { + content:"\e6d8"; +} + +.fw-google:before { + content:"\e6d5"; +} + +.fw-grid:before { + content:"\e638"; +} + +.fw-grip:before { + content:"\e6b7"; +} + +.fw-group:before { + content:"\e6af"; +} + +.fw-hardware:before { + content:"\e6a9"; +} + +.fw-hdd:before { + content:"\e639"; +} + +.fw-heart:before { + content:"\e6c3"; +} + +.fw-hide:before { + content:"\e6d2"; +} + +.fw-home:before { + content:"\e63a"; +} + +.fw-hour-glass:before { + content:"\e63b"; +} + +.fw-html:before { + content:"\e69d"; +} + +.fw-http:before { + content:"\e705"; +} + +.fw-image:before { + content:"\e70a"; +} + +.fw-import:before { + content:"\e63c"; +} + +.fw-incoming-call:before { + content:"\e63d"; +} + +.fw-info:before { + content:"\e63e"; +} + +.fw-instagram:before { + content:"\e6db"; +} + +.fw-invitation:before { + content:"\e63f"; +} + +.fw-invoke:before { + content:"\e6ed"; +} + +.fw-is-connector:before { + content:"\e6e5"; +} + +.fw-iterate:before { + content:"\e71f"; +} + +.fw-jaggery:before { + content:"\e640"; +} + +.fw-java-spring:before { + content:"\e644"; +} + +.fw-java:before { + content:"\e641"; +} + +.fw-javaee:before { + content:"\e642"; +} + +.fw-javascript:before { + content:"\e643"; +} + +.fw-jaxrs:before { + content:"\e645"; +} + +.fw-jaxws:before { + content:"\e6c7"; +} + +.fw-jquery:before { + content:"\e646"; +} + +.fw-key:before { + content:"\e647"; +} + +.fw-laptop:before { + content:"\e648"; +} + +.fw-layout:before { + content:"\e6bf"; +} + +.fw-ldap:before { + content:"\e649"; +} + +.fw-left-arrow:before { + content:"\e68a"; +} + +.fw-left:before { + content:"\e686"; +} + +.fw-lifecycle:before { + content:"\e64a"; +} + +.fw-light:before { + content:"\e680"; +} + +.fw-linkedin:before { + content:"\e6dc"; +} + +.fw-list-sort:before { + content:"\e64d"; +} + +.fw-list:before { + content:"\e64c"; +} + +.fw-loader:before { + content:"\e6b4"; +} + +.fw-loader2:before { + content:"\e6ba"; +} + +.fw-loader3:before { + content:"\e6bb"; +} + +.fw-loader4:before { + content:"\e6bc"; +} + +.fw-loader5:before { + content:"\e6bd"; +} + +.fw-lock:before { + content:"\e64e"; +} + +.fw-logical:before { + content:"\e702"; +} + +.fw-mail:before { + content:"\e64f"; +} + +.fw-main-function:before { + content:"\e706"; +} + +.fw-map-location:before { + content:"\e650"; +} + +.fw-menu:before { + content:"\e651"; +} + +.fw-message:before { + content:"\e635"; +} + +.fw-micro-services:before { + content:"\e6ce"; +} + +.fw-minus:before, .fw-hyphen:before, .fw-dash:before { + content:"\e616"; +} + +.fw-mobile:before { + content:"\e652"; +} + +.fw-ms-document:before { + content:"\e654"; +} + +.fw-mute:before { + content:"\e655"; +} + +.fw-nodejs:before { + content:"\e656"; +} + +.fw-notification:before { + content:"\e60b"; +} + +.fw-organization:before { + content:"\e6ac"; +} + +.fw-own:before { + content:"\e6c8"; +} + +.fw-package:before { + content:"\e6fd"; +} + +.fw-pages:before { + content:"\e6c0"; +} + +.fw-paste:before { + content:"\e658"; +} + +.fw-pdf:before { + content:"\e659"; +} + +.fw-pending:before { + content:"\e727"; +} + +.fw-php:before { + content:"\e6c9"; +} + +.fw-pie-chart:before { + content:"\e65a"; +} + +.fw-pinterest:before { + content:"\e6dd"; +} + +.fw-policy:before { + content:"\e67d"; +} + +.fw-polygon:before { + content:"\e70d"; +} + +.fw-prototype:before { + content:"\e6cc"; +} + +.fw-proxy:before { + content:"\e699"; +} + +.fw-public:before { + content:"\e6ad"; +} + +.fw-publish:before { + content:"\e65c"; +} + +.fw-question:before { + content:"\e6b0"; +} + +.fw-raspberry:before { + content:"\e6aa"; +} + +.fw-redo:before { + content:"\e65d"; +} + +.fw-refresh:before { + content:"\e692"; +} + +.fw-register:before { + content:"\e65e"; +} + +.fw-rename:before { + content:"\e6fc"; +} + +.fw-reply:before { + content:"\e714"; +} + +.fw-resource:before { + content:"\e660"; +} + +.fw-rest-api:before { + content:"\e661"; +} + +.fw-rest-service:before { + content:"\e662"; +} + +.fw-resume:before { + content:"\e71e"; +} + +.fw-retire:before { + content:"\e6cd"; +} + +.fw-return:before { + content:"\e715"; +} + +.fw-retweet:before { + content:"\e6b9"; +} + +.fw-right-arrow:before { + content:"\e68b"; +} + +.fw-right:before { + content:"\e687"; +} + +.fw-ringing:before { + content:"\e694"; +} + +.fw-rules:before { + content:"\e664"; +} + +.fw-run:before { + content:"\e708"; +} + +.fw-save:before { + content:"\e665"; +} + +.fw-scep:before { + content:"\e666"; +} + +.fw-schema:before { + content:"\e667"; +} + +.fw-search:before { + content:"\e668"; +} + +.fw-security-policy:before { + content:"\e67e"; +} + +.fw-security:before { + content:"\e669"; +} + +.fw-send:before, .fw-paper-rocket:before { + content:"\e66a"; +} + +.fw-sequence:before { + content:"\e66b"; +} + +.fw-server:before { + content:"\e66c"; +} + +.fw-service-provider:before { + content:"\e66e"; +} + +.fw-service:before, .fw-cogwheels:before, .fw-gears:before, .fw-sprockets:before { + content:"\e66d"; +} + +.fw-settings:before, .fw-cogwheel:before, .fw-gear:before, .fw-sprocket:before { + content:"\e66f"; +} + +.fw-share:before { + content:"\e670"; +} + +.fw-shell:before { + content:"\e730"; +} + +.fw-shortcut:before { + content:"\e725"; +} + +.fw-sign-in:before { + content:"\e671"; +} + +.fw-sign-out:before { + content:"\e6b8"; +} + +.fw-skype:before { + content:"\e6de"; +} + +.fw-slash:before { + content:"\e6e1"; +} + +.fw-soap:before { + content:"\e672"; +} + +.fw-sort-down:before { + content:"\e663"; +} + +.fw-sort-up:before { + content:"\e64b"; +} + +.fw-sort:before { + content:"\e673"; +} + +.fw-speed-alert:before { + content:"\e731"; +} + +.fw-square-outline:before { + content:"\e6b2"; +} + +.fw-square:before { + content:"\e6b1"; +} + +.fw-star:before { + content:"\e674"; +} + +.fw-start:before { + content:"\e718"; +} + +.fw-statistics:before { + content:"\e675"; +} + +.fw-stepin:before { + content:"\e719"; +} + +.fw-stepout:before { + content:"\e71a"; +} + +.fw-stepover:before { + content:"\e71b"; +} + +.fw-stop:before { + content:"\e71c"; +} + +.fw-store:before, .fw-cart:before { + content:"\e676"; +} + +.fw-struct:before { + content:"\e716"; +} + +.fw-subscribe:before { + content:"\e677"; +} + +.fw-success:before { + content:"\e657"; +} + +.fw-swagger:before { + content:"\e679"; +} + +.fw-sync:before { + content:"\e6b3"; +} + +.fw-table:before { + content:"\e6c4"; +} + +.fw-tag:before { + content:"\e67a"; +} + +.fw-task:before { + content:"\e67b"; +} + +.fw-text:before { + content:"\e67c"; +} + +.fw-theme:before { + content:"\e726"; +} + +.fw-throttling-policy:before { + content:"\e67f"; +} + +.fw-throw:before { + content:"\e722"; +} + +.fw-tiles:before { + content:"\e681"; +} + +.fw-transaction:before { + content:"\e72b"; +} + +.fw-try-catch:before { + content:"\e703"; +} + +.fw-twitter:before { + content:"\e6df"; +} + +.fw-type-converter:before { + content:"\e6f3"; +} + +.fw-uncheck:before { + content:"\e682"; +} + +.fw-undo:before { + content:"\e683"; +} + +.fw-ungroup:before { + content:"\e6b5"; +} + +.fw-unmute:before { + content:"\e6ae"; +} + +.fw-up-arrow:before { + content:"\e688"; +} + +.fw-up:before { + content:"\e684"; +} + +.fw-upload:before { + content:"\e68c"; +} + +.fw-uri:before { + content:"\e68d"; +} + +.fw-usb-drive:before { + content:"\e68e"; +} + +.fw-use:before { + content:"\e6ca"; +} + +.fw-user:before { + content:"\e68f"; +} + +.fw-variable:before { + content:"\e6ee"; +} + +.fw-view:before { + content:"\e691"; +} + +.fw-vpn:before { + content:"\e603"; +} + +.fw-wadl:before { + content:"\e6a1"; +} + +.fw-war:before { + content:"\e69e"; +} + +.fw-warning:before { + content:"\e693"; +} + +.fw-web-app:before { + content:"\e696"; +} + +.fw-web-clip:before { + content:"\e698"; +} + +.fw-web-service:before { + content:"\e69a"; +} + +.fw-website:before { + content:"\e69b"; +} + +.fw-wifi:before { + content:"\e607"; +} + +.fw-windows:before { + content:"\e605"; +} + +.fw-worker-invoke:before { + content:"\e723"; +} + +.fw-worker-reply:before { + content:"\e724"; +} + +.fw-worker:before { + content:"\e6ef"; +} + +.fw-wsdl:before { + content:"\e6a0"; +} + +.fw-wso2-logo:before { + content:"\e6a7"; +} + +.fw-wso2:before { + content:"\e6a8"; +} + +.fw-xacml:before { + content:"\e69f"; +} + +.fw-xml:before { + content:"\e69c"; +} + +.fw-xq:before { + content:"\e6a2"; +} + +.fw-xsd:before { + content:"\e6a3"; +} + +.fw-xslt:before { + content:"\e6a4"; +} + +.fw-youtube:before { + content:"\e6e0"; +} + +.fw-zoom-in:before { + content:"\e6a5"; +} + +.fw-zoom-out:before { + content:"\e6a6"; +} + diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/css/font-wso2.min.css b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/css/font-wso2.min.css new file mode 100644 index 0000000000..6d229b71da --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/css/font-wso2.min.css @@ -0,0 +1,15 @@ +/*! +~ Copyright (c) WSO2 Inc. (http://wso2.com) All Rights Reserved. +~ +~ Licensed under the Apache License, Version 2.0 (the "License"); +~ you may not use this file except in compliance with the License. +~ You may obtain a copy of the License at +~ +~ http://www.apache.org/licenses/LICENSE-2.0 +~ +~ Unless required by applicable law or agreed to in writing, software +~ distributed under the License is distributed on an "AS IS" BASIS, +~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~ See the License for the specific language governing permissions and +~ limitations under the License. +*/.fw-fw,.fw-li{text-align:center}@font-face{font-family:font-wso2;src:local("font-wso2"),url(../fonts/font-wso2.eot?6563fa91278f239ef8c827d90a165223);src:local("font-wso2"),url(../fonts/font-wso2.eot?#iefix) format("embedded-opentype"),url(../fonts/font-wso2.woff2?6563fa91278f239ef8c827d90a165223) format("woff2"),url(../fonts/font-wso2.woff?6563fa91278f239ef8c827d90a165223) format("woff"),url(../fonts/font-wso2.ttf?6563fa91278f239ef8c827d90a165223) format("truetype"),url(../fonts/font-wso2.svg?6563fa91278f239ef8c827d90a165223#font-wso2) format("svg");font-weight:400;font-style:normal}.fw,[class*=" fw-"],[class^=fw-]{font:normal normal normal 14px/1 font-wso2;display:inline-block;font-weight:400;font-style:normal;font-size:inherit;font-variant:normal;speak:none;text-decoration:inherit;text-transform:none;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fw-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fw-2x{font-size:2em}.fw-3x{font-size:3em}.fw-4x{font-size:4em}.fw-5x{font-size:5em}.fw-fw{width:1.28571429em}.fw-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fw-ul>li{position:relative}.fw-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em}.fw-li.fw-lg{left:-1.85714286em}.fw-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fw-background{background:#888;border-radius:.3em;padding:.4em .5em .45em}.fw-pull-left{float:left}.fw-pull-right{float:right}.fw.fw-pull-left{margin-right:.3em}.fw.fw-pull-right{margin-left:.3em}.fw-spin{-webkit-animation:fw-spin 2s infinite linear;animation:fw-spin 2s infinite linear}@-webkit-keyframes fw-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fw-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fw-pulse{-webkit-animation:fw-pulse 2s ease-out infinite;animation:fw-pulse 2s ease-out infinite}@-webkit-keyframes fw-pulse{0%,100%,30%{opacity:.3}40%{opacity:1}}@keyframes fw-pulse{0%,100%,30%{opacity:.3}40%{opacity:1}}.fw-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fw-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fw-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fw-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1,1);-ms-transform:scale(-1,1);transform:scale(-1,1)}.fw-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1,-1);-ms-transform:scale(1,-1);transform:scale(1,-1)}:root .fw-flip-horizontal,:root .fw-flip-vertical,:root .fw-rotate-180,:root .fw-rotate-270,:root .fw-rotate-90{filter:none}.fw-helper,.fw-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:1.85em;vertical-align:middle}.fw-helper:after,.fw-helper:before,.fw-stack-1x,.fw-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fw-helper:before,.fw-stack-1x{line-height:inherit}.fw-helper:after,.fw-stack-2x{font-size:1.9em}.fw-helper-slash:before{font-size:1.4em}.fw-helper-circle:before,.fw-helper-square:before{z-index:1}.fw-helper-circle-outline:after{content:"\e61f"}.fw-helper-circle:after{content:"\e61a"}.fw-helper-square-outline:after{content:"\e6b2"}.fw-helper-square:after{content:"\e6b1"}.fw-helper-slash:after{content:"\e6e1"}.fw-stack>.fw-stack{position:absolute;font-size:.5em}.fw-stack>.fw-stack.fw-move-top{top:-.2em}.fw-stack>.fw-stack.fw-move-bottom{bottom:-.2em}.fw-stack>.fw.stack.fw-move-left{left:-.5em}.fw-stack>.fw-stack.fw-move-right{right:-.5em}.fw-helper-inverse:after,.fw-inverse:before,.fw-number{color:#fff}.fw-helper-shadow:after,.fw-shadow:before{text-shadow:#fff 1px 1px 0}.fw-helper-stroke:after,.fw-stroke:before{text-shadow:-2px -2px 0 #fff,2px -2px 0 #fff,-2px 2px 0 #fff,2px 2px 0 #fff}.fw-number{line-height:2em;font-family:Arial,Helvetica,sans-serif}.fw-abort:before{content:"\e72a"}.fw-action-invoke:before{content:"\e6fe"}.fw-action:before{content:"\e709"}.fw-activate:before{content:"\e6cf"}.fw-add:before{content:"\e615"}.fw-airplay:before{content:"\e600"}.fw-alarm:before{content:"\e6c2"}.fw-alert:before{content:"\e6be"}.fw-analytics-extensions:before{content:"\e6e2"}.fw-android-logcat:before{content:"\e72c"}.fw-android-sense:before{content:"\e72d"}.fw-android:before{content:"\e606"}.fw-annotation:before{content:"\e6e6"}.fw-api:before{content:"\e601"}.fw-apn:before{content:"\e602"}.fw-apple:before{content:"\e604"}.fw-application:before{content:"\e608"}.fw-arduino:before{content:"\e6ab"}.fw-assign:before{content:"\e6ff"}.fw-ballerina-service:before{content:"\e729"}.fw-ballerina:before{content:"\e728"}.fw-bar-chart:before{content:"\e690"}.fw-battery:before{content:"\e60a"}.fw-blank-document:before{content:"\e60c"}.fw-block:before{content:"\e695"}.fw-bookmark:before{content:"\e60d"}.fw-bpel:before{content:"\e60e"}.fw-bpmn:before{content:"\e60f"}.fw-break:before{content:"\e721"}.fw-bug:before{content:"\e611"}.fw-build:before{content:"\e6c1"}.fw-calendar:before{content:"\e612"}.fw-camera:before{content:"\e613"}.fw-cancel:before{content:"\e618"}.fw-carbon:before{content:"\e6c5"}.fw-chat:before{content:"\e65b"}.fw-check:before{content:"\e617"}.fw-checklist:before{content:"\e619"}.fw-circle-outline:before{content:"\e61f"}.fw-circle:before{content:"\e61a"}.fw-clear:before{content:"\e61b"}.fw-clock:before{content:"\e61d"}.fw-cloud:before{content:"\e61e"}.fw-code-view:before{content:"\e70e"}.fw-code:before{content:"\e6f1"}.fw-comment:before{content:"\e710"}.fw-compare:before{content:"\e610"}.fw-computer:before{content:"\e653"}.fw-configarations:before{content:"\e609"}.fw-connector:before{content:"\e700"}.fw-console:before{content:"\e71d"}.fw-constant:before{content:"\e701"}.fw-contact:before{content:"\e620"}.fw-contract:before{content:"\e614"}.fw-copy:before{content:"\e621"}.fw-cut:before{content:"\e6f2"}.fw-dashboard:before{content:"\e622"}.fw-database:before{content:"\e623"}.fw-delete:before{content:"\e624"}.fw-depend:before{content:"\e6c6"}.fw-deploy:before{content:"\e625"}.fw-deprecate:before{content:"\e6cb"}.fw-design-view:before{content:"\e70f"}.fw-devices:before{content:"\e704"}.fw-dgm-action-invoke:before{content:"\e712"}.fw-dgm-action:before{content:"\e711"}.fw-dgm-connector:before{content:"\e6f4"}.fw-dgm-constant-definition:before{content:"\e6f5"}.fw-dgm-fork:before{content:"\e6e7"}.fw-dgm-header:before{content:"\e6e8"}.fw-dgm-if-else:before{content:"\e6e9"}.fw-dgm-import:before{content:"\e717"}.fw-dgm-lifeline:before{content:"\e6ea"}.fw-dgm-logger:before{content:"\e6eb"}.fw-dgm-resource:before{content:"\e6f6"}.fw-dgm-service:before{content:"\e6f7"}.fw-dgm-try-catch:before{content:"\e6ec"}.fw-dgm-type-convertor:before{content:"\e6f8"}.fw-dgm-type:before{content:"\e6f9"}.fw-dgm-while:before{content:"\e707"}.fw-dial-up:before{content:"\e627"}.fw-disabled:before{content:"\e6d1"}.fw-display:before{content:"\e626"}.fw-docker:before{content:"\e70c"}.fw-document:before{content:"\e628"}.fw-down-arrow:before{content:"\e689"}.fw-down:before{content:"\e685"}.fw-download:before{content:"\e65f"}.fw-dss:before{content:"\e62a"}.fw-ebook:before{content:"\e62b"}.fw-edit:before{content:"\e62c"}.fw-ellipsis:before{content:"\e629"}.fw-endpoint:before{content:"\e62d"}.fw-enterprise:before{content:"\e6b6"}.fw-error:before{content:"\e630"}.fw-esb-connector:before{content:"\e6e3"}.fw-expand:before{content:"\e61c"}.fw-export:before{content:"\e631"}.fw-extensions:before{content:"\e6e4"}.fw-facebook:before{content:"\e6d3"}.fw-factory-reset:before{content:"\e632"}.fw-fan:before{content:"\e678"}.fw-faq:before{content:"\e62f"}.fw-file-browse:before{content:"\e633"}.fw-filter:before{content:"\e634"}.fw-folder-open:before{content:"\e70b"}.fw-folder:before{content:"\e62e"}.fw-fork-join:before{content:"\e720"}.fw-format:before{content:"\e6fa"}.fw-forum:before{content:"\e636"}.fw-function-invoke:before{content:"\e713"}.fw-function:before{content:"\e6fb"}.fw-gadget:before{content:"\e637"}.fw-geo-fence-inbound:before{content:"\e72e"}.fw-geo-fence-outbound:before{content:"\e72f"}.fw-github:before{content:"\e6d4"}.fw-globe:before{content:"\e697"}.fw-google-docs:before{content:"\e6d6"}.fw-google-drive:before{content:"\e6da"}.fw-google-plus:before{content:"\e6d9"}.fw-google-sheets:before{content:"\e6d7"}.fw-google-slides:before{content:"\e6d8"}.fw-google:before{content:"\e6d5"}.fw-grid:before{content:"\e638"}.fw-grip:before{content:"\e6b7"}.fw-group:before{content:"\e6af"}.fw-hardware:before{content:"\e6a9"}.fw-hdd:before{content:"\e639"}.fw-heart:before{content:"\e6c3"}.fw-hide:before{content:"\e6d2"}.fw-home:before{content:"\e63a"}.fw-hour-glass:before{content:"\e63b"}.fw-html:before{content:"\e69d"}.fw-http:before{content:"\e705"}.fw-image:before{content:"\e70a"}.fw-import:before{content:"\e63c"}.fw-incoming-call:before{content:"\e63d"}.fw-info:before{content:"\e63e"}.fw-instagram:before{content:"\e6db"}.fw-invitation:before{content:"\e63f"}.fw-invoke:before{content:"\e6ed"}.fw-is-connector:before{content:"\e6e5"}.fw-iterate:before{content:"\e71f"}.fw-jaggery:before{content:"\e640"}.fw-java-spring:before{content:"\e644"}.fw-java:before{content:"\e641"}.fw-javaee:before{content:"\e642"}.fw-javascript:before{content:"\e643"}.fw-jaxrs:before{content:"\e645"}.fw-jaxws:before{content:"\e6c7"}.fw-jquery:before{content:"\e646"}.fw-key:before{content:"\e647"}.fw-laptop:before{content:"\e648"}.fw-layout:before{content:"\e6bf"}.fw-ldap:before{content:"\e649"}.fw-left-arrow:before{content:"\e68a"}.fw-left:before{content:"\e686"}.fw-lifecycle:before{content:"\e64a"}.fw-light:before{content:"\e680"}.fw-linkedin:before{content:"\e6dc"}.fw-list-sort:before{content:"\e64d"}.fw-list:before{content:"\e64c"}.fw-loader:before{content:"\e6b4"}.fw-loader2:before{content:"\e6ba"}.fw-loader3:before{content:"\e6bb"}.fw-loader4:before{content:"\e6bc"}.fw-loader5:before{content:"\e6bd"}.fw-lock:before{content:"\e64e"}.fw-logical:before{content:"\e702"}.fw-mail:before{content:"\e64f"}.fw-main-function:before{content:"\e706"}.fw-map-location:before{content:"\e650"}.fw-menu:before{content:"\e651"}.fw-message:before{content:"\e635"}.fw-micro-services:before{content:"\e6ce"}.fw-dash:before,.fw-hyphen:before,.fw-minus:before{content:"\e616"}.fw-mobile:before{content:"\e652"}.fw-ms-document:before{content:"\e654"}.fw-mute:before{content:"\e655"}.fw-nodejs:before{content:"\e656"}.fw-notification:before{content:"\e60b"}.fw-organization:before{content:"\e6ac"}.fw-own:before{content:"\e6c8"}.fw-package:before{content:"\e6fd"}.fw-pages:before{content:"\e6c0"}.fw-paste:before{content:"\e658"}.fw-pdf:before{content:"\e659"}.fw-pending:before{content:"\e727"}.fw-php:before{content:"\e6c9"}.fw-pie-chart:before{content:"\e65a"}.fw-pinterest:before{content:"\e6dd"}.fw-policy:before{content:"\e67d"}.fw-polygon:before{content:"\e70d"}.fw-prototype:before{content:"\e6cc"}.fw-proxy:before{content:"\e699"}.fw-public:before{content:"\e6ad"}.fw-publish:before{content:"\e65c"}.fw-question:before{content:"\e6b0"}.fw-raspberry:before{content:"\e6aa"}.fw-redo:before{content:"\e65d"}.fw-refresh:before{content:"\e692"}.fw-register:before{content:"\e65e"}.fw-rename:before{content:"\e6fc"}.fw-reply:before{content:"\e714"}.fw-resource:before{content:"\e660"}.fw-rest-api:before{content:"\e661"}.fw-rest-service:before{content:"\e662"}.fw-resume:before{content:"\e71e"}.fw-retire:before{content:"\e6cd"}.fw-return:before{content:"\e715"}.fw-retweet:before{content:"\e6b9"}.fw-right-arrow:before{content:"\e68b"}.fw-right:before{content:"\e687"}.fw-ringing:before{content:"\e694"}.fw-rules:before{content:"\e664"}.fw-run:before{content:"\e708"}.fw-save:before{content:"\e665"}.fw-scep:before{content:"\e666"}.fw-schema:before{content:"\e667"}.fw-search:before{content:"\e668"}.fw-security-policy:before{content:"\e67e"}.fw-security:before{content:"\e669"}.fw-paper-rocket:before,.fw-send:before{content:"\e66a"}.fw-sequence:before{content:"\e66b"}.fw-server:before{content:"\e66c"}.fw-service-provider:before{content:"\e66e"}.fw-cogwheels:before,.fw-gears:before,.fw-service:before,.fw-sprockets:before{content:"\e66d"}.fw-cogwheel:before,.fw-gear:before,.fw-settings:before,.fw-sprocket:before{content:"\e66f"}.fw-share:before{content:"\e670"}.fw-shell:before{content:"\e730"}.fw-shortcut:before{content:"\e725"}.fw-sign-in:before{content:"\e671"}.fw-sign-out:before{content:"\e6b8"}.fw-skype:before{content:"\e6de"}.fw-slash:before{content:"\e6e1"}.fw-soap:before{content:"\e672"}.fw-sort-down:before{content:"\e663"}.fw-sort-up:before{content:"\e64b"}.fw-sort:before{content:"\e673"}.fw-speed-alert:before{content:"\e731"}.fw-square-outline:before{content:"\e6b2"}.fw-square:before{content:"\e6b1"}.fw-star:before{content:"\e674"}.fw-start:before{content:"\e718"}.fw-statistics:before{content:"\e675"}.fw-stepin:before{content:"\e719"}.fw-stepout:before{content:"\e71a"}.fw-stepover:before{content:"\e71b"}.fw-stop:before{content:"\e71c"}.fw-cart:before,.fw-store:before{content:"\e676"}.fw-struct:before{content:"\e716"}.fw-subscribe:before{content:"\e677"}.fw-success:before{content:"\e657"}.fw-swagger:before{content:"\e679"}.fw-sync:before{content:"\e6b3"}.fw-table:before{content:"\e6c4"}.fw-tag:before{content:"\e67a"}.fw-task:before{content:"\e67b"}.fw-text:before{content:"\e67c"}.fw-theme:before{content:"\e726"}.fw-throttling-policy:before{content:"\e67f"}.fw-throw:before{content:"\e722"}.fw-tiles:before{content:"\e681"}.fw-transaction:before{content:"\e72b"}.fw-try-catch:before{content:"\e703"}.fw-twitter:before{content:"\e6df"}.fw-type-converter:before{content:"\e6f3"}.fw-uncheck:before{content:"\e682"}.fw-undo:before{content:"\e683"}.fw-ungroup:before{content:"\e6b5"}.fw-unmute:before{content:"\e6ae"}.fw-up-arrow:before{content:"\e688"}.fw-up:before{content:"\e684"}.fw-upload:before{content:"\e68c"}.fw-uri:before{content:"\e68d"}.fw-usb-drive:before{content:"\e68e"}.fw-use:before{content:"\e6ca"}.fw-user:before{content:"\e68f"}.fw-variable:before{content:"\e6ee"}.fw-view:before{content:"\e691"}.fw-vpn:before{content:"\e603"}.fw-wadl:before{content:"\e6a1"}.fw-war:before{content:"\e69e"}.fw-warning:before{content:"\e693"}.fw-web-app:before{content:"\e696"}.fw-web-clip:before{content:"\e698"}.fw-web-service:before{content:"\e69a"}.fw-website:before{content:"\e69b"}.fw-wifi:before{content:"\e607"}.fw-windows:before{content:"\e605"}.fw-worker-invoke:before{content:"\e723"}.fw-worker-reply:before{content:"\e724"}.fw-worker:before{content:"\e6ef"}.fw-wsdl:before{content:"\e6a0"}.fw-wso2-logo:before{content:"\e6a7"}.fw-wso2:before{content:"\e6a8"}.fw-xacml:before{content:"\e69f"}.fw-xml:before{content:"\e69c"}.fw-xq:before{content:"\e6a2"}.fw-xsd:before{content:"\e6a3"}.fw-xslt:before{content:"\e6a4"}.fw-youtube:before{content:"\e6e0"}.fw-zoom-in:before{content:"\e6a5"}.fw-zoom-out:before{content:"\e6a6"} \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.ttf b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.ttf new file mode 100644 index 0000000000..aa00de0ef9 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.ttf differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.woff b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.woff new file mode 100644 index 0000000000..ced7907e94 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.woff differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.woff2 b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.woff2 new file mode 100644 index 0000000000..723a32343b Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Medium.woff2 differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.ttf b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.ttf new file mode 100644 index 0000000000..3e6e2e7613 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.ttf differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.woff b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.woff new file mode 100644 index 0000000000..e401bcf528 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.woff differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.woff2 b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.woff2 new file mode 100644 index 0000000000..5bd7bd6500 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/Roboto-Regular.woff2 differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.svg b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.svg new file mode 100644 index 0000000000..91614ea75e --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.svg @@ -0,0 +1,2326 @@ + + + + + +Created by FontForge 20161004 at Wed Jun 21 08:31:03 2017 + By dimal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.ttf b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.ttf new file mode 100644 index 0000000000..27735b2820 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.ttf differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.woff b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.woff new file mode 100644 index 0000000000..80fd5a7fc2 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.woff differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.woff2 b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.woff2 new file mode 100644 index 0000000000..6087330889 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/fonts/font-wso2.woff2 differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar-2.png b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar-2.png new file mode 100644 index 0000000000..9467f5eb76 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar-2.png differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar-3.png b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar-3.png new file mode 100644 index 0000000000..f1d980e55c Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar-3.png differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar.png b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar.png new file mode 100644 index 0000000000..5fab5dee57 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/avatar.png differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/favicon.png b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/favicon.png new file mode 100644 index 0000000000..a1deab3581 Binary files /dev/null and b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/favicon.png differ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/logo.svg b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/logo.svg new file mode 100644 index 0000000000..05742db887 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/images/logo.svg @@ -0,0 +1,798 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/locales/en.json b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/locales/en.json new file mode 100644 index 0000000000..5be6f63bd4 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/locales/en.json @@ -0,0 +1,67 @@ +{ + "Title" : "Title", + "Description" : "Description", + "ShortDescription" : "Short Description", + "Category" : "Category", + "Visibility" : "Visibility", + "Devices" : "Devices", + "Roles" : "Roles", + "Groups" : "Groups", + "Tags" : "Tags", + "Platform" : "Platform", + "Platforms" : "Platforms", + "Applications": "Applications", + "No.Platform" : "No Platforms", + "Screenshots" : "Screenshots", + "Icon" : "Icon", + "Info" : "Info", + "Banner" : "Banner", + "Create.Application" : "Create Application", + "Back" : "Back", + "Cancel" : "Cancel", + "Finish" : "Finish", + "Continue" : "Continue", + "Name" : "Name", + "Application.Name" : "Application Name", + "General" : "General", + "App.Releases" : "Application Releases", + "Package.Manager" : "Package Manager", + "Save" : "Save", + "Create.Release" : "Create Release", + "Release.Channel" : "Release Channel", + "Release" : "Release", + "New.Release.For" : "New Release for", + "Upload.Package.File" : "Upload Package File", + "Upload" : "Upload", + "Select.from.package.library" : "Select from package library", + "Release.Name" : "Release Name", + "Release.Notes" : "Release Notes", + "Send.for.Review" : "Send for Review", + "Production.Releases" : "Production Releases", + "Beta.Releases" : "Beta Releases", + "Alpha.Releases" : "Alpha Releases", + "Version" : "Version", + "Status" : "Status", + "App.Publisher" : "Application Publisher", + "Search.Apps" : "Search for Applications", + "View.In.Store" : "View in Store", + "Last.Updated" : "Last updated on", + "Installs" : "Installs", + "General.Info" : "General Info", + "Select.Platform": "Select Platform", + "Add.Release" : "Add Release to Application", + "Share.With.Tenants" : "Share with Tenants", + "Disable" : "Disable", + "File.Based" : "File Based", + "Activate" : "Activate", + "Yes" : "Yes", + "No" : "No", + "No.Platform.Tags" : "No Platform Tags", + "Create.Platform" : "Create Platform", + "Optional": "Optional", + "Identifier": "Identifier", + "Next": "Next", + "Platform.Enable": "Enable Platform", + "Share.with.Tenants": "Share between all tenants", + "Platform.Properties": "Platform Properties" +} diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/scss/_mixin.scss b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/scss/_mixin.scss new file mode 100644 index 0000000000..5b40942bef --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/scss/_mixin.scss @@ -0,0 +1,1252 @@ +/*! +~ Copyright (c) 2017 WSO2 Inc. (http://wso2.com) All Rights Reserved. +~ +~ Licensed under the Apache License, Version 2.0 (the "License"); +~ you may not use this file except in compliance with the License. +~ You may obtain a copy of the License at +~ +~ http://www.apache.org/licenses/LICENSE-2.0 +~ +~ Unless required by applicable law or agreed to in writing, software +~ distributed under the License is distributed on an "AS IS" BASIS, +~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +~ See the License for the specific language governing permissions and +~ limitations under the License. +*/ + +%icon-base { + &:before { + font-family: "font-wso2"; + -webkit-font-smoothing: antialiased; + } + b { + // hide text + height: 0; + display: block; + text-indent: 100%; + white-space: nowrap; + overflow: hidden; + } +} + +@mixin font-wso2($icon) { + @extend %icon-base; + + + @if ($icon == "abort") { + content:"\e72a"; + } + + @else if ($icon == "action-invoke") { + content:"\e6fe"; + } + + @else if ($icon == "action") { + content:"\e709"; + } + + @else if ($icon == "activate") { + content:"\e6cf"; + } + + @else if ($icon == "add") { + content:"\e615"; + } + + @else if ($icon == "airplay") { + content:"\e600"; + } + + @else if ($icon == "alarm") { + content:"\e6c2"; + } + + @else if ($icon == "alert") { + content:"\e6be"; + } + + @else if ($icon == "analytics-extensions") { + content:"\e6e2"; + } + + @else if ($icon == "android-logcat") { + content:"\e72c"; + } + + @else if ($icon == "android-sense") { + content:"\e72d"; + } + + @else if ($icon == "android") { + content:"\e606"; + } + + @else if ($icon == "annotation") { + content:"\e6e6"; + } + + @else if ($icon == "api") { + content:"\e601"; + } + + @else if ($icon == "apn") { + content:"\e602"; + } + + @else if ($icon == "apple") { + content:"\e604"; + } + + @else if ($icon == "application") { + content:"\e608"; + } + + @else if ($icon == "arduino") { + content:"\e6ab"; + } + + @else if ($icon == "assign") { + content:"\e6ff"; + } + + @else if ($icon == "ballerina-service") { + content:"\e729"; + } + + @else if ($icon == "ballerina") { + content:"\e728"; + } + + @else if ($icon == "bar-chart") { + content:"\e690"; + } + + @else if ($icon == "battery") { + content:"\e60a"; + } + + @else if ($icon == "blank-document") { + content:"\e60c"; + } + + @else if ($icon == "block") { + content:"\e695"; + } + + @else if ($icon == "bookmark") { + content:"\e60d"; + } + + @else if ($icon == "bpel") { + content:"\e60e"; + } + + @else if ($icon == "bpmn") { + content:"\e60f"; + } + + @else if ($icon == "break") { + content:"\e721"; + } + + @else if ($icon == "bug") { + content:"\e611"; + } + + @else if ($icon == "build") { + content:"\e6c1"; + } + + @else if ($icon == "calendar") { + content:"\e612"; + } + + @else if ($icon == "camera") { + content:"\e613"; + } + + @else if ($icon == "cancel") { + content:"\e618"; + } + + @else if ($icon == "carbon") { + content:"\e6c5"; + } + + @else if ($icon == "chat") { + content:"\e65b"; + } + + @else if ($icon == "check") { + content:"\e617"; + } + + @else if ($icon == "checklist") { + content:"\e619"; + } + + @else if ($icon == "circle-outline") { + content:"\e61f"; + } + + @else if ($icon == "circle") { + content:"\e61a"; + } + + @else if ($icon == "clear") { + content:"\e61b"; + } + + @else if ($icon == "clock") { + content:"\e61d"; + } + + @else if ($icon == "cloud") { + content:"\e61e"; + } + + @else if ($icon == "code-view") { + content:"\e70e"; + } + + @else if ($icon == "code") { + content:"\e6f1"; + } + + @else if ($icon == "comment") { + content:"\e710"; + } + + @else if ($icon == "compare") { + content:"\e610"; + } + + @else if ($icon == "computer") { + content:"\e653"; + } + + @else if ($icon == "configarations") { + content:"\e609"; + } + + @else if ($icon == "connector") { + content:"\e700"; + } + + @else if ($icon == "console") { + content:"\e71d"; + } + + @else if ($icon == "constant") { + content:"\e701"; + } + + @else if ($icon == "contact") { + content:"\e620"; + } + + @else if ($icon == "contract") { + content:"\e614"; + } + + @else if ($icon == "copy") { + content:"\e621"; + } + + @else if ($icon == "cut") { + content:"\e6f2"; + } + + @else if ($icon == "dashboard") { + content:"\e622"; + } + + @else if ($icon == "database") { + content:"\e623"; + } + + @else if ($icon == "delete") { + content:"\e624"; + } + + @else if ($icon == "depend") { + content:"\e6c6"; + } + + @else if ($icon == "deploy") { + content:"\e625"; + } + + @else if ($icon == "deprecate") { + content:"\e6cb"; + } + + @else if ($icon == "design-view") { + content:"\e70f"; + } + + @else if ($icon == "devices") { + content:"\e704"; + } + + @else if ($icon == "dgm-action-invoke") { + content:"\e712"; + } + + @else if ($icon == "dgm-action") { + content:"\e711"; + } + + @else if ($icon == "dgm-connector") { + content:"\e6f4"; + } + + @else if ($icon == "dgm-constant-definition") { + content:"\e6f5"; + } + + @else if ($icon == "dgm-fork") { + content:"\e6e7"; + } + + @else if ($icon == "dgm-header") { + content:"\e6e8"; + } + + @else if ($icon == "dgm-if-else") { + content:"\e6e9"; + } + + @else if ($icon == "dgm-import") { + content:"\e717"; + } + + @else if ($icon == "dgm-lifeline") { + content:"\e6ea"; + } + + @else if ($icon == "dgm-logger") { + content:"\e6eb"; + } + + @else if ($icon == "dgm-resource") { + content:"\e6f6"; + } + + @else if ($icon == "dgm-service") { + content:"\e6f7"; + } + + @else if ($icon == "dgm-try-catch") { + content:"\e6ec"; + } + + @else if ($icon == "dgm-type-convertor") { + content:"\e6f8"; + } + + @else if ($icon == "dgm-type") { + content:"\e6f9"; + } + + @else if ($icon == "dgm-while") { + content:"\e707"; + } + + @else if ($icon == "dial-up") { + content:"\e627"; + } + + @else if ($icon == "disabled") { + content:"\e6d1"; + } + + @else if ($icon == "display") { + content:"\e626"; + } + + @else if ($icon == "docker") { + content:"\e70c"; + } + + @else if ($icon == "document") { + content:"\e628"; + } + + @else if ($icon == "down-arrow") { + content:"\e689"; + } + + @else if ($icon == "down") { + content:"\e685"; + } + + @else if ($icon == "download") { + content:"\e65f"; + } + + @else if ($icon == "dss") { + content:"\e62a"; + } + + @else if ($icon == "ebook") { + content:"\e62b"; + } + + @else if ($icon == "edit") { + content:"\e62c"; + } + + @else if ($icon == "ellipsis") { + content:"\e629"; + } + + @else if ($icon == "endpoint") { + content:"\e62d"; + } + + @else if ($icon == "enterprise") { + content:"\e6b6"; + } + + @else if ($icon == "error") { + content:"\e630"; + } + + @else if ($icon == "esb-connector") { + content:"\e6e3"; + } + + @else if ($icon == "expand") { + content:"\e61c"; + } + + @else if ($icon == "export") { + content:"\e631"; + } + + @else if ($icon == "extensions") { + content:"\e6e4"; + } + + @else if ($icon == "facebook") { + content:"\e6d3"; + } + + @else if ($icon == "factory-reset") { + content:"\e632"; + } + + @else if ($icon == "fan") { + content:"\e678"; + } + + @else if ($icon == "faq") { + content:"\e62f"; + } + + @else if ($icon == "file-browse") { + content:"\e633"; + } + + @else if ($icon == "filter") { + content:"\e634"; + } + + @else if ($icon == "folder-open") { + content:"\e70b"; + } + + @else if ($icon == "folder") { + content:"\e62e"; + } + + @else if ($icon == "fork-join") { + content:"\e720"; + } + + @else if ($icon == "format") { + content:"\e6fa"; + } + + @else if ($icon == "forum") { + content:"\e636"; + } + + @else if ($icon == "function-invoke") { + content:"\e713"; + } + + @else if ($icon == "function") { + content:"\e6fb"; + } + + @else if ($icon == "gadget") { + content:"\e637"; + } + + @else if ($icon == "geo-fence-inbound") { + content:"\e72e"; + } + + @else if ($icon == "geo-fence-outbound") { + content:"\e72f"; + } + + @else if ($icon == "github") { + content:"\e6d4"; + } + + @else if ($icon == "globe") { + content:"\e697"; + } + + @else if ($icon == "google-docs") { + content:"\e6d6"; + } + + @else if ($icon == "google-drive") { + content:"\e6da"; + } + + @else if ($icon == "google-plus") { + content:"\e6d9"; + } + + @else if ($icon == "google-sheets") { + content:"\e6d7"; + } + + @else if ($icon == "google-slides") { + content:"\e6d8"; + } + + @else if ($icon == "google") { + content:"\e6d5"; + } + + @else if ($icon == "grid") { + content:"\e638"; + } + + @else if ($icon == "grip") { + content:"\e6b7"; + } + + @else if ($icon == "group") { + content:"\e6af"; + } + + @else if ($icon == "hardware") { + content:"\e6a9"; + } + + @else if ($icon == "hdd") { + content:"\e639"; + } + + @else if ($icon == "heart") { + content:"\e6c3"; + } + + @else if ($icon == "hide") { + content:"\e6d2"; + } + + @else if ($icon == "home") { + content:"\e63a"; + } + + @else if ($icon == "hour-glass") { + content:"\e63b"; + } + + @else if ($icon == "html") { + content:"\e69d"; + } + + @else if ($icon == "http") { + content:"\e705"; + } + + @else if ($icon == "image") { + content:"\e70a"; + } + + @else if ($icon == "import") { + content:"\e63c"; + } + + @else if ($icon == "incoming-call") { + content:"\e63d"; + } + + @else if ($icon == "info") { + content:"\e63e"; + } + + @else if ($icon == "instagram") { + content:"\e6db"; + } + + @else if ($icon == "invitation") { + content:"\e63f"; + } + + @else if ($icon == "invoke") { + content:"\e6ed"; + } + + @else if ($icon == "is-connector") { + content:"\e6e5"; + } + + @else if ($icon == "iterate") { + content:"\e71f"; + } + + @else if ($icon == "jaggery") { + content:"\e640"; + } + + @else if ($icon == "java-spring") { + content:"\e644"; + } + + @else if ($icon == "java") { + content:"\e641"; + } + + @else if ($icon == "javaee") { + content:"\e642"; + } + + @else if ($icon == "javascript") { + content:"\e643"; + } + + @else if ($icon == "jaxrs") { + content:"\e645"; + } + + @else if ($icon == "jaxws") { + content:"\e6c7"; + } + + @else if ($icon == "jquery") { + content:"\e646"; + } + + @else if ($icon == "key") { + content:"\e647"; + } + + @else if ($icon == "laptop") { + content:"\e648"; + } + + @else if ($icon == "layout") { + content:"\e6bf"; + } + + @else if ($icon == "ldap") { + content:"\e649"; + } + + @else if ($icon == "left-arrow") { + content:"\e68a"; + } + + @else if ($icon == "left") { + content:"\e686"; + } + + @else if ($icon == "lifecycle") { + content:"\e64a"; + } + + @else if ($icon == "light") { + content:"\e680"; + } + + @else if ($icon == "linkedin") { + content:"\e6dc"; + } + + @else if ($icon == "list-sort") { + content:"\e64d"; + } + + @else if ($icon == "list") { + content:"\e64c"; + } + + @else if ($icon == "loader") { + content:"\e6b4"; + } + + @else if ($icon == "loader2") { + content:"\e6ba"; + } + + @else if ($icon == "loader3") { + content:"\e6bb"; + } + + @else if ($icon == "loader4") { + content:"\e6bc"; + } + + @else if ($icon == "loader5") { + content:"\e6bd"; + } + + @else if ($icon == "lock") { + content:"\e64e"; + } + + @else if ($icon == "logical") { + content:"\e702"; + } + + @else if ($icon == "mail") { + content:"\e64f"; + } + + @else if ($icon == "main-function") { + content:"\e706"; + } + + @else if ($icon == "map-location") { + content:"\e650"; + } + + @else if ($icon == "menu") { + content:"\e651"; + } + + @else if ($icon == "message") { + content:"\e635"; + } + + @else if ($icon == "micro-services") { + content:"\e6ce"; + } + + @else if ($icon == "minus") { + content:"\e616"; + } + + @else if ($icon == "mobile") { + content:"\e652"; + } + + @else if ($icon == "ms-document") { + content:"\e654"; + } + + @else if ($icon == "mute") { + content:"\e655"; + } + + @else if ($icon == "nodejs") { + content:"\e656"; + } + + @else if ($icon == "notification") { + content:"\e60b"; + } + + @else if ($icon == "organization") { + content:"\e6ac"; + } + + @else if ($icon == "own") { + content:"\e6c8"; + } + + @else if ($icon == "package") { + content:"\e6fd"; + } + + @else if ($icon == "pages") { + content:"\e6c0"; + } + + @else if ($icon == "paste") { + content:"\e658"; + } + + @else if ($icon == "pdf") { + content:"\e659"; + } + + @else if ($icon == "pending") { + content:"\e727"; + } + + @else if ($icon == "php") { + content:"\e6c9"; + } + + @else if ($icon == "pie-chart") { + content:"\e65a"; + } + + @else if ($icon == "pinterest") { + content:"\e6dd"; + } + + @else if ($icon == "policy") { + content:"\e67d"; + } + + @else if ($icon == "polygon") { + content:"\e70d"; + } + + @else if ($icon == "prototype") { + content:"\e6cc"; + } + + @else if ($icon == "proxy") { + content:"\e699"; + } + + @else if ($icon == "public") { + content:"\e6ad"; + } + + @else if ($icon == "publish") { + content:"\e65c"; + } + + @else if ($icon == "question") { + content:"\e6b0"; + } + + @else if ($icon == "raspberry") { + content:"\e6aa"; + } + + @else if ($icon == "redo") { + content:"\e65d"; + } + + @else if ($icon == "refresh") { + content:"\e692"; + } + + @else if ($icon == "register") { + content:"\e65e"; + } + + @else if ($icon == "rename") { + content:"\e6fc"; + } + + @else if ($icon == "reply") { + content:"\e714"; + } + + @else if ($icon == "resource") { + content:"\e660"; + } + + @else if ($icon == "rest-api") { + content:"\e661"; + } + + @else if ($icon == "rest-service") { + content:"\e662"; + } + + @else if ($icon == "resume") { + content:"\e71e"; + } + + @else if ($icon == "retire") { + content:"\e6cd"; + } + + @else if ($icon == "return") { + content:"\e715"; + } + + @else if ($icon == "retweet") { + content:"\e6b9"; + } + + @else if ($icon == "right-arrow") { + content:"\e68b"; + } + + @else if ($icon == "right") { + content:"\e687"; + } + + @else if ($icon == "ringing") { + content:"\e694"; + } + + @else if ($icon == "rules") { + content:"\e664"; + } + + @else if ($icon == "run") { + content:"\e708"; + } + + @else if ($icon == "save") { + content:"\e665"; + } + + @else if ($icon == "scep") { + content:"\e666"; + } + + @else if ($icon == "schema") { + content:"\e667"; + } + + @else if ($icon == "search") { + content:"\e668"; + } + + @else if ($icon == "security-policy") { + content:"\e67e"; + } + + @else if ($icon == "security") { + content:"\e669"; + } + + @else if ($icon == "send") { + content:"\e66a"; + } + + @else if ($icon == "sequence") { + content:"\e66b"; + } + + @else if ($icon == "server") { + content:"\e66c"; + } + + @else if ($icon == "service-provider") { + content:"\e66e"; + } + + @else if ($icon == "service") { + content:"\e66d"; + } + + @else if ($icon == "settings") { + content:"\e66f"; + } + + @else if ($icon == "share") { + content:"\e670"; + } + + @else if ($icon == "shell") { + content:"\e730"; + } + + @else if ($icon == "shortcut") { + content:"\e725"; + } + + @else if ($icon == "sign-in") { + content:"\e671"; + } + + @else if ($icon == "sign-out") { + content:"\e6b8"; + } + + @else if ($icon == "skype") { + content:"\e6de"; + } + + @else if ($icon == "slash") { + content:"\e6e1"; + } + + @else if ($icon == "soap") { + content:"\e672"; + } + + @else if ($icon == "sort-down") { + content:"\e663"; + } + + @else if ($icon == "sort-up") { + content:"\e64b"; + } + + @else if ($icon == "sort") { + content:"\e673"; + } + + @else if ($icon == "speed-alert") { + content:"\e731"; + } + + @else if ($icon == "square-outline") { + content:"\e6b2"; + } + + @else if ($icon == "square") { + content:"\e6b1"; + } + + @else if ($icon == "star") { + content:"\e674"; + } + + @else if ($icon == "start") { + content:"\e718"; + } + + @else if ($icon == "statistics") { + content:"\e675"; + } + + @else if ($icon == "stepin") { + content:"\e719"; + } + + @else if ($icon == "stepout") { + content:"\e71a"; + } + + @else if ($icon == "stepover") { + content:"\e71b"; + } + + @else if ($icon == "stop") { + content:"\e71c"; + } + + @else if ($icon == "store") { + content:"\e676"; + } + + @else if ($icon == "struct") { + content:"\e716"; + } + + @else if ($icon == "subscribe") { + content:"\e677"; + } + + @else if ($icon == "success") { + content:"\e657"; + } + + @else if ($icon == "swagger") { + content:"\e679"; + } + + @else if ($icon == "sync") { + content:"\e6b3"; + } + + @else if ($icon == "table") { + content:"\e6c4"; + } + + @else if ($icon == "tag") { + content:"\e67a"; + } + + @else if ($icon == "task") { + content:"\e67b"; + } + + @else if ($icon == "text") { + content:"\e67c"; + } + + @else if ($icon == "theme") { + content:"\e726"; + } + + @else if ($icon == "throttling-policy") { + content:"\e67f"; + } + + @else if ($icon == "throw") { + content:"\e722"; + } + + @else if ($icon == "tiles") { + content:"\e681"; + } + + @else if ($icon == "transaction") { + content:"\e72b"; + } + + @else if ($icon == "try-catch") { + content:"\e703"; + } + + @else if ($icon == "twitter") { + content:"\e6df"; + } + + @else if ($icon == "type-converter") { + content:"\e6f3"; + } + + @else if ($icon == "uncheck") { + content:"\e682"; + } + + @else if ($icon == "undo") { + content:"\e683"; + } + + @else if ($icon == "ungroup") { + content:"\e6b5"; + } + + @else if ($icon == "unmute") { + content:"\e6ae"; + } + + @else if ($icon == "up-arrow") { + content:"\e688"; + } + + @else if ($icon == "up") { + content:"\e684"; + } + + @else if ($icon == "upload") { + content:"\e68c"; + } + + @else if ($icon == "uri") { + content:"\e68d"; + } + + @else if ($icon == "usb-drive") { + content:"\e68e"; + } + + @else if ($icon == "use") { + content:"\e6ca"; + } + + @else if ($icon == "user") { + content:"\e68f"; + } + + @else if ($icon == "variable") { + content:"\e6ee"; + } + + @else if ($icon == "view") { + content:"\e691"; + } + + @else if ($icon == "vpn") { + content:"\e603"; + } + + @else if ($icon == "wadl") { + content:"\e6a1"; + } + + @else if ($icon == "war") { + content:"\e69e"; + } + + @else if ($icon == "warning") { + content:"\e693"; + } + + @else if ($icon == "web-app") { + content:"\e696"; + } + + @else if ($icon == "web-clip") { + content:"\e698"; + } + + @else if ($icon == "web-service") { + content:"\e69a"; + } + + @else if ($icon == "website") { + content:"\e69b"; + } + + @else if ($icon == "wifi") { + content:"\e607"; + } + + @else if ($icon == "windows") { + content:"\e605"; + } + + @else if ($icon == "worker-invoke") { + content:"\e723"; + } + + @else if ($icon == "worker-reply") { + content:"\e724"; + } + + @else if ($icon == "worker") { + content:"\e6ef"; + } + + @else if ($icon == "wsdl") { + content:"\e6a0"; + } + + @else if ($icon == "wso2-logo") { + content:"\e6a7"; + } + + @else if ($icon == "wso2") { + content:"\e6a8"; + } + + @else if ($icon == "xacml") { + content:"\e69f"; + } + + @else if ($icon == "xml") { + content:"\e69c"; + } + + @else if ($icon == "xq") { + content:"\e6a2"; + } + + @else if ($icon == "xsd") { + content:"\e6a3"; + } + + @else if ($icon == "xslt") { + content:"\e6a4"; + } + + @else if ($icon == "youtube") { + content:"\e6e0"; + } + + @else if ($icon == "zoom-in") { + content:"\e6a5"; + } + + @else if ($icon == "zoom-out") { + content:"\e6a6"; + } + +} \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/themes/default/default-theme.css b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/themes/default/default-theme.css new file mode 100644 index 0000000000..d6e82a6745 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/public/themes/default/default-theme.css @@ -0,0 +1,903 @@ +/* + * Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +@font-face { + font-family: "Roboto-Medium"; + src: url('../../fonts/Roboto-Medium.woff'); + src: local("Roboto-Medium"), url("../../fonts/Roboto-Medium.ttf") format("ttf"); + src: local("Roboto-Medium"), url("../../fonts/Roboto-Medium.woff") format("woff"); + src: local("Roboto-Medium"), url("../../fonts/Roboto-Medium.woff2") format("woff2"); +} + +@font-face { + font-family: "Roboto-Regular"; + src: url("../../fonts/Roboto-Regular.woff"); + src: local("Roboto-Regular"), url("../../fonts/Roboto-Regular.ttf") format("ttf"); + src: local("Roboto-Regular"), url("../../fonts/Roboto-Regular.woff") format("woff"); + src: local("Roboto-Regular"), url("../../fonts/Roboto-Regular.woff2") format("woff2"); +} + +/*Colors*/ +.primary { + color: white; + background-color: #2196f3 !important; +} + +.primary-flat { + color: #2196F3 !important; +} + +.danger { + color: white; + background-color: #e91e63 !important; +} + +.danger-flat { + color: #e91e63 !important; +} + +.grey { + color: #b3b3b3 !important; +} + +/* ==================================================================== */ +/* Custom button styles based on material design specs. */ + +.custom-raised { + font-family: Roboto-Medium; + text-transform: uppercase !important; + font-size: 14px !important; + padding-left: 16px !important; + border-radius: 2px !important; + padding-right: 16px !important; + height: 36px !important; + border: none !important; +} + +.custom-raised:hover { + cursor: pointer; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08) !important; + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08) !important; + background-color: #1976D2 !important; +} + +.custom-raised:focus { + box-shadow: none !important; + -webkit-box-shadow: none !important; + background-color: #1976D2 !important; +} + +.custom-flat { + font-family: Roboto-Medium; + height: 36px !important; + border-radius: 2px !important; + margin-left: 8px !important; + margin-right: 8px !important; + padding-left: 8px !important; + padding-right: 8px !important; + background-color: transparent !important; + text-transform: uppercase; + outline: none !important; + border: none !important; +} + +.custom-flat:hover { + cursor: pointer; + background-color: rgba(0, 0, 0, 0.12) !important; +} + +.custom-flat:focus { + outline: none !important; + border: none !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + background-color: rgba(0, 0, 0, 0.40) !important; +} + +.circle-button { + border-radius: 100% !important; + height: 36px !important; + width: 36px; +} + +/* ==================================================================== */ + +/* Body Styling */ +body { + width: 100%; + font-family: "Roboto-Regular" !important; + font-size: 14px !important; + background-color: #e8e8e8 !important; +} + +.app-manager-title { + font-family: "Roboto-Medium"; + font-size: 20px; +} + +.app-manager-sub-title { + font-family: "Roboto-Regular"; + font-size: 18px; +} + +#app-mgt-footer { + clear: both; + position: relative; + height: 50px; + width: 100%; + color: white; + background-color: #334d88; +} + +/* Login page styles*/ +#userName { + border-radius: 0; +} + +#password { + border-radius: 0; +} + +.login-btn { + float: right; +} + +.login-header { + background-color: #3f50b5; + color: white; + height: 128px; + width: 100%; + margin: 0 !important; + padding: 20px; + box-shadow: -2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +#login-card { + width: 25%; + height: 50%; + margin: 10% auto; + font-family: Roboto-Regular; + font-size: 14px; + border-radius: 0; + background-color: #ffffff; + box-shadow: -2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.login-header-title { + font-family: Roboto-Medium; + font-size: 20px; + font-weight: 500; +} + +.login-header-logo { + height: 70px; + width: 150px; +} + +.login-form { + margin: 0 !important; + padding: 40px; +} + +/* Base layout container */ + +/* Base layout header content*/ +.header-content { + height: 128px !important; + width: 100% !important; + margin: 0 10px 0 0; + background-color: #3f50b5 !important; + position: fixed; /* Set the navbar to fixed position */ + top: 0; /* Position the navbar at the top of the page */ + z-index: 2; + box-shadow: -2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +/* Contains the header styles.*/ +.header { + padding: 24px 24px 10px 24px; + /*margin: 16px 16px 20px 16px;*/ + position: relative; +} + +#header-text { + color: #ffffff; + font-size: 20px; + font-family: Roboto-Medium; + top: 10px; + margin-left: 10px; +} + +/* The buttons in the header (User and Notification)*/ +.header-button-container { + display: flex; + justify-content: flex-end; +} + +.header-user-name { + font-family: Roboto-Medium; + font-size: 14px; + padding-top: 15px; + color: white; +} + +.header-image { + height: 43px; + width: 100px; + margin-right: 24px; +} + +#header-button { + border-radius: 50%; + background-color: transparent; + border: none; + height: 50px; + width: 50px; + margin-right: 10px; + position: relative; + outline: none; +} + +#header-button:hover { + background-color: #4353bd; + cursor: pointer; +} + +#header-button i { + position: absolute; + bottom: 19px; + left: 17px; +} + +.btn-header { + margin-top: 15px; + margin-right: 20px; + color: white; +} + +#sub-title { + font-family: Roboto-Regular; + font-size: 18px; + font-weight: 600; + padding-top: 5px; + padding-left: 18px; + color: RGBA(0, 0, 0, 1); +} + +/* Search box styles */ +.search-box { + display: flex; + float: right; +} + +.search-box i { + position: absolute; + top: 5px; + color: #BaBaBa; +} + +#search { + position: relative; + color: white; + background-color: transparent; + left: 15px; + top: 0px; + height: 25px; + outline: none; + border: none; + border-radius: 0%; +} + +/* Application Add button */ +#add-btn-container { + position: absolute; + top: 98px; +} + +.add-btn { + background-color: #ff5722; +} + +.add-btn:hover { + background-color: #E64A19; +} + +#sub-title-container { + height: 100px; + padding: 50px 0 20px 0; +} + +.application-container { + padding: 0 !important; + min-height: 100% !important; + margin-top: 128px !important; +} + +/* Holds the app pages. */ +.store-card { + height: auto; + background-color: white; + box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); + padding: 24px; +} + +.platform-link-placeholder { + color: #888888; + float: right; + padding-bottom: 10px; +} + +.platform-link-placeholder i { + margin-right: 4px; +} + +.application-list { + transition: margin-right .5s; +} + +#batch-content { + display: flex; + margin-top: 5px; +} + +.app-list-icon { + border-radius: 50%; + height: 50px; + width: 50px +} + +.app-table-row { + height: 62px; + cursor: pointer; + padding-top: 6px; + font-family: "Roboto-Regular"; + font-size: medium; +} + +.app-table-row:hover { + color: white; + background-color: #3f50b5; +} + +.app-list-table-header { + margin-top: 30px; + margin-bottom: 10px; + font-family: "Roboto-Medium"; + font-size: 15px; +} + +.app-view-image { + height: 100px; + width: 100px; + border-radius: 50%; +} + +#app-visibility-default { + display: none; +} + +#app-image-screenshot { + width: 300px; + height: 300px; +} + +#app-image-icon { + width: 300px; + height: 300px; +} + +#app-image-banner { + width: 400px; + height: 300px; +} + +#form-error { + color: red; +} + +.application-create-banner-dropzone { + width: 300px; + height: 150px; + border-radius: 5%; + position: relative; + border: dashed #888888 2px; +} + +.application-create-banner-dropzone i { + position: absolute; + top: 65px; + left: 145px; +} + +.application-create-screenshot-dropzone { + width: 150px; + height: 150px; + margin: 0 5px 0 5px; + border-radius: 10%; + position: relative; + border: dashed #888888 2px; +} + +.application-create-screenshot-dropzone i { + position: absolute; + top: 65px; + left: 65px; +} + +.application-create-icon-dropzone { + width: 150px; + height: 150px; + border-radius: 10%; + position: relative; + border: dashed #888888 2px; +} + +.application-create-icon-dropzone i { + position: absolute; + top: 65px; + left: 65px; +} + +#screenshot-container { + max-width: 600px; + display: flex; + overflow-x: auto; + height: 200px; +} + +#app-icon-container { + height: 300px; + overflow-x: auto; +} + +#modal-body-content { + max-height: 700px; + padding-left: 24px; + overflow-y: auto; +} + +.custom-footer { + justify-content: inherit !important; + margin: 0 !important; +} + +.footer-main-btn { + display: flex; + justify-content: flex-end; +} + +#img-btn-screenshot { + margin: 0 5px 0 5px; +} + +#app-create-modal { + max-width: 850px; + border-radius: 0% !important; +} + +.app-create-modal-header { + background-color: #4353bd; + color: white; + padding: 24px !important; +} + +.app-create-modal-content { + padding: 0 !important; +} + +#store { + border: none; + border-bottom: solid #BDBDBD 1px; + border-radius: 0px; + width: 200px; +} + +#version { + border: none; + border-bottom: solid #BDBDBD 1px; + border-radius: 0px; + width: 200px; +} + +#app-release-switch-content { + display: flex; +} + +#app-release-switch-label { + position: absolute; + float: left; +} + +#app-release-switch { + position: absolute; + right: 10px; +} + +.image-sub-title { + font-style: italic; + font-size: 12px; + color: #818181; +} + +/* Application View */ + +#application-view-content { + width: 100%; +} + +#application-view-row { + margin: 10px 10px 0 20px; +} + +#app-icon { + height: 100px; + width: 100px; + border: solid 1px black; + border-radius: 50%; +} + +.app-updated-date { + color: #888888; +} + +.app-install-count { + font-style: italic; +} + +.app-details-tbl { + outline: none; + border-color: #2196F3; +} + +.app-details-tbl tr { + margin: 20px 0 0 0; +} + +.app-details-tbl td { + margin-left: 10px; + max-width: 400px; +} + +/* Application Edit Base Layout */ + +#application-edit-header { + height: 40px; + width: 100%; + margin-top: 20px; + margin-bottom: 20px; + font-size: 25px; +} + +.application-header-text { + margin: 10px 0px 0px 10px; +} + +#save-btn-content { + float: right; + +} + +#app-save-btn { + border-radius: 0%; +} + +.save-btn { + margin: 5px 5px 5px 0px; + height: 70%; + width: 50%; + float: right; +} + +.save-btn:hover { + cursor: pointer; +} + +/*Tab styling*/ + +div.tab { + float: left; + border-right: 1px solid #d8d8d8; + height: 100%; +} + +/* Style the tab buttons */ + +div.tab button { + display: block; + background-color: inherit; + color: black; + padding: 15px 16px; + width: 100%; + border: none; + outline: none; + text-align: left; + cursor: pointer; + transition: 0.3s; +} + +/* Change background color of buttons on hover */ + +div.tab button:hover { + background-color: #ddd6d7; + cursor: pointer; +} + +/* Create an active/current "tab button" class */ + +div.tab button.active { + background-color: #1b3bcc; + color: white; +} + +#application-edit-main-container { + display: flex; +} + +#application-edit-outer-content { + height: auto; +} + +#app-edit-content { + height: 100%; + position: relative; +} + +.back-to-app { + position: absolute; + height: 50px; + width: 50px; + border-radius: 50%; +} + +.back-to-app i { + padding: 12px 10px 10px 12px; +} + +.back-to-app:hover { + cursor: pointer; + background-color: #dedede; + transition: .5s; +} + +/* Create Release and Release management */ + +.release-header { + margin-top: 20px; + margin-bottom: 20px; +} + +.release-create { + height: 150px; + margin-bottom: 20px; +} + +.release-detail-content { + width: 100%; + margin-top: 20%; + height: 300px; +} + +.form-btn { + float: right; + margin-bottom: 10px; +} + +.release-content { + height: 180px; + width: 95%; + border: dashed 1px #626262; + border-radius: 2%; + position: relative; + background-color: #e8e8e8; +} + +.release-content:after { + content: ""; + letter-spacing: 4px; +} + +.release { + margin: 30px 10px 20px 30px; +} + +.no-release-content { + position: absolute; + margin-top: 10px; + left: 40%; +} + +.button-add:hover { + cursor: pointer; +} + +.release-inner { + margin-top: 5%; +} + +/* Application Edit General Info */ + +.app-edit-general-info { + margin-top: 20px; + max-width: 100%; +} + +.save-info { + float: right; + margin-bottom: 10px; +} + +.app-view-field { + font-family: Roboto-Medium; + font-size: 14px; +} + +.app-view-text { + font-family: Roboto-Regular; + font-size: 14px; +} + +/* Platform Specific Styles. */ +#platform-listing { + margin: 10px; +} + +.create-platform i { + margin-right: 10px; +} + +#platform-list { + margin-top: 20px; + display: flex; + flex-flow: wrap; +} + +.platform-content { + margin: 10px; + padding-top: 16px; + box-shadow: 2px 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} + +.platform-content .row { + margin: 0; +} + +.platform-content .col { + padding: 0; +} + +.platform-content-basic { + padding: 0 16px 0 16px; + display: flex; +} + +.platform-content-more-outer { + +} + +.platform-content-more { + padding: 16px 16px 24px 16px; +} + +.platform-content-footer { + display: flex; + padding: 8px 8px 8px 8px; +} + +.platform-text-container { + padding: 8px 16px 0 16px; +} + +.circle-button { + float: right; +} + +.platform-icon-letter { + text-align: center; + text-transform: uppercase; + font-family: Roboto-Medium; + font-size: 70px; + color: white; + padding-top: 15px; +} + +.platform-icon-container { + height: 120px; + width: 120px; + background-color: #01579B; + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08) !important; + -webkit-box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.16), 0 0 0 1px rgba(0, 0, 0, 0.08) !important; +} + +.platform-property-container { + padding-top: 20px; + font-family: Roboto-Regular; + font-size: 14px; +} + +.platform-property-row { + align-items: center; +} + +.circle-btn-clear { + background-color: white !important; + color: rgba(0, 0, 0, 0.50) !important; +} + +.circle-btn-clear:hover { + background-color: white !important; + color: rgba(0, 0, 0, 0.38) !important; +} + +.circle-btn-clear:focus { + background-color: white !important; + color: rgba(0, 0, 0, 0.60) !important; +} + +.data-table-row-cell { + padding-top: 14px; +} + +.error-code { + text-align: center; + font-family: Roboto-Medium; + font-weight: 800; + font-size: 15em; + color: #BaBaBa; +} + +.error-code p { + +} + +.error-text { + text-align: center; + font-family: Roboto-Regular; + font-size: 14px; + font-weight: 500; + color: #9e9e9e; +} + +.circle-btn-add { + background-color: #bababa !important; + border-radius: 50% !important; + height: 30px !important; + width: 30px; + text-align: -webkit-center; + font-size: 18px; + padding: 6px !important; +} + +.circle-btn-add:hover { + background-color: #828282 !important; +} + +/** + If you need to change the color of active steps in stepper, + uncomment the following and set the background color and font color as needed. +*/ +/* +.stepper-active-index { + background-color: #0a6eff !important; + color: white !important; +} + +.stepper-passed-index { + background-color: #0a6eff !important; + color: green !important; +} +*/ diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.css b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.css new file mode 100644 index 0000000000..d393e9ad68 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.css @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.ant-upload.ant-upload-drag { + height: 170px; +} + +.release .release-icon{ + margin-right: 15px; +} + +.release .release-icon img{ + width: 100%; + border-radius: 28%; +} + +.release .release-title{ + margin-left: 15px; +} + +.release .release-screenshot img{ + width: 100%; + border-radius: 15px; + padding: 5px; +} + +.logo-image { + /*width: 120px;*/ + height: 31px; + margin: 0 5px 16px 24px; + float: left; +} + +.logo-image img{ + height: 35px; +} + +.main-container{ + background: #f0f2f5; + min-height: 780px +} + +.profile{ + float:right; + margin-right: 2%; +} + +@media only screen and (min-width: 768px) { + .main-container{ + padding: 24px; + } +} \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.js new file mode 100644 index 0000000000..5d8747417f --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.js @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import "antd/dist/antd.less"; +import RouteWithSubRoutes from "./components/RouteWithSubRoutes"; +import { + BrowserRouter as Router, + Redirect, Switch, +} from 'react-router-dom'; +import axios from "axios"; +import {Layout, Spin, Result} from "antd"; +import ConfigContext from "./context/ConfigContext"; + +const {Content} = Layout; +const loadingView = ( + + + + + +); + +const errorView = ( + +); + +class App extends React.Component { + + constructor(props) { + super(props); + this.state = { + loading: true, + error: false, + config: {} + } + } + + componentDidMount() { + axios.get( + window.location.origin + "/store/public/conf/config.json", + ).then(res => { + console.log(res); + this.setState({ + loading: false, + config: res.data + }) + }).catch((error) => { + this.setState({ + loading: false, + error: true + }) + }); + } + + render() { + const {loading, error} = this.state; + + const applicationView = ( + + +
+ + + {this.props.routes.map((route) => ( + + ))} + +
+
+
+ ); + + return ( +
+ {loading && loadingView} + {!loading && !error && applicationView} + {error && errorView} +
+ ); + } +} + +export default App; diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.test.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.test.js new file mode 100644 index 0000000000..0b509e08c1 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/App.test.js @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; + +it('renders without crashing', () => { + const div = document.createElement('div'); + ReactDOM.render(, div); + ReactDOM.unmountComponentAtNode(div); +}); diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/RouteWithSubRoutes.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/RouteWithSubRoutes.js new file mode 100644 index 0000000000..f57ec331b0 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/RouteWithSubRoutes.js @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from 'react'; +import {Route} from 'react-router-dom'; +class RouteWithSubRoutes extends React.Component{ + props; + constructor(props){ + super(props); + this.props = props; + } + render() { + return( + ( + + )}/> + ); + } + +} + +export default RouteWithSubRoutes; \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/AppCard.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/AppCard.js new file mode 100644 index 0000000000..d18aa40bbf --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/AppCard.js @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import {Card, Typography, Col, Row} from 'antd'; +import React from "react"; +import {Link} from "react-router-dom"; +import "../../App.css"; +import StarRatings from 'react-star-ratings'; + +const {Meta} = Card; +const {Text} = Typography; + +class AppCard extends React.Component { + + constructor(props) { + super(props); + this.handleReleasesClick = this.handleReleasesClick.bind(this); + } + + handleReleasesClick() { + this.props.openReleasesModal(this.props.app); + } + + render() { + const app = this.props.app; + const release = this.props.app.applicationReleases[0]; + + const description = ( +
+ + + + icon + {/**/} + + + {app.name}
+ {app.deviceType}
+ + +
+ +
+ ); + + return ( + + + + ); + } +} + +export default AppCard; \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/AppList.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/AppList.js new file mode 100644 index 0000000000..e6e459e3dc --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/AppList.js @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import AppCard from "./AppCard"; +import {Col, message, notification, Row, Result, Skeleton} from "antd"; +import axios from "axios"; +import {withConfigContext} from "../../context/ConfigContext"; + +class AppList extends React.Component { + constructor(props) { + super(props); + this.state = { + apps: [], + loading: true + } + } + + componentDidMount() { + const {deviceType} = this.props; + this.props.changeSelectedMenuItem(deviceType); + this.fetchData(deviceType); + } + + + componentDidUpdate(prevProps, prevState) { + if (prevProps.deviceType !== this.props.deviceType) { + const {deviceType} = this.props; + this.props.changeSelectedMenuItem(deviceType); + this.fetchData(deviceType); + } + } + + fetchData = (deviceType) => { + const config = this.props.context; + const payload = {}; + if (deviceType === "web-clip") { + payload.appType = "WEB_CLIP"; + } else { + payload.deviceType = deviceType; + } + this.setState({ + loading: true + }); + //send request to the invoker + axios.post( + window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.store + "/applications/", + payload, + ).then(res => { + if (res.status === 200) { + //todo remove this property check after backend improvement + let apps = (res.data.data.hasOwnProperty("applications")) ? res.data.data.applications : []; + this.setState({ + apps: apps, + loading: false + }) + } + + }).catch((error) => { + console.log(error.response); + if (error.hasOwnProperty("response") && error.response.status === 401) { + //todo display a popup with error + message.error('You are not logged in'); + window.location.href = window.location.origin+ '/store/login'; + } else { + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while trying to load apps.", + }); + } + + this.setState({loading: false}); + }); + }; + + render() { + const {apps,loading} = this.state; + + return ( + + + {apps.length === 0 && ( + Back Home} + /> + )} + {apps.map(app => ( + + + + ))} + + + ); + } +} + +export default withConfigContext(AppList); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/DetailedRating.css b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/DetailedRating.css new file mode 100644 index 0000000000..28a761eb7b --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/DetailedRating.css @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +.d-rating .numeric-data{ + box-sizing: border-box; + display: inline-block; + padding: 20px 0 20px 0; + vertical-align: top; + text-align: center; + width: 30%; +} + +.d-rating .bar-containers{ + box-sizing: border-box; + display: inline-block; + padding: 20px 20px 20px 30px; + vertical-align: top; + width: 70%; +} + +.d-rating .bar-containers .bar-container{ + color: #737373; + font-weight: 400; + height: 20px; + margin-bottom: 4px; + position: relative; + width: 100%; +} + +.d-rating .bar-containers .bar-container .number{ + font-size: 11px; + left: -16px; + letter-spacing: 1px; + position: absolute; +} + +.d-rating .bar-containers .bar-container .bar{ + transition: width .25s ease; + display: inline-block; + height: 100%; + opacity: .8; + border-radius: 5px; +} + +.bar-container .rate-5{ + background: #57bb8a; +} + +.bar-container .rate-4{ + background: #9ace6a; +} + +.bar-container .rate-3{ + background: #ffcf02; +} + +.bar-container .rate-2{ + background: #ff9f02; +} + +.bar-container .rate-1{ + background: #ff6f31; +} + +.d-rating .numeric-data .rate{ + color: #333; + font-size: 64px; + font-weight: 100; + line-height: 64px; + padding-bottom: 6px; +} + +.d-rating .numeric-data .people-count{ + padding-top: 6px; +} \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/DetailedRating.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/DetailedRating.js new file mode 100644 index 0000000000..0536e966cf --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/DetailedRating.js @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Row, Typography, Icon} from "antd"; +import StarRatings from "react-star-ratings"; +import "./DetailedRating.css"; +import axios from "axios"; +import {withConfigContext} from "../../../context/ConfigContext"; + +const { Text } = Typography; + + +class DetailedRating extends React.Component{ + + constructor(props){ + super(props); + this.state={ + detailedRating: null + } + } + + componentDidMount() { + const {type,uuid} = this.props; + this.getData(type,uuid); + } + + componentDidUpdate(prevProps, prevState) { + if (prevProps.uuid !== this.props.uuid) { + const {type,uuid} = this.props; + this.getData(type,uuid); + } + } + + + getData = (type, uuid)=>{ + const config = this.props.context; + + return axios.get( + window.location.origin+ config.serverConfig.invoker.uri +config.serverConfig.invoker.store+"/reviews/"+uuid+"/"+type+"-rating", + ).then(res => { + if (res.status === 200) { + let detailedRating = res.data.data; + this.setState({ + detailedRating + }) + } + + }).catch(function (error) { + if (error.response.status === 401) { + window.location.href = window.location.origin+'/store/login'; + } + }); + }; + + render() { + const detailedRating = this.state.detailedRating; + + if(detailedRating ==null){ + return null; + } + + const totalCount = detailedRating.noOfUsers; + const ratingVariety = detailedRating.ratingVariety; + + const ratingArray = []; + + for (let [key, value] of Object.entries(ratingVariety)) { + ratingArray.push(value); + } + + const maximumRating = Math.max(...ratingArray); + + const ratingBarPercentages = [0,0,0,0,0]; + + if(maximumRating>0){ + for(let i = 0; i<5; i++){ + ratingBarPercentages[i] = (ratingVariety[(i+1).toString()])/maximumRating*100; + } + } + + return ( + +
+
{detailedRating.ratingValue.toFixed(1)}
+ +
+ {totalCount} total +
+
+
+ 5 + +
+
+ 4 + +
+
+ 3 + +
+
+ 2 + +
+
+ 1 + +
+
+
+ ); + } +} + + +export default withConfigContext(DetailedRating); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/ReleaseView.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/ReleaseView.js new file mode 100644 index 0000000000..6d55b45361 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/ReleaseView.js @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Divider, Row, Col, Typography, Button, Rate, notification} from "antd"; +import "../../../App.css"; +import ImgViewer from "../../apps/release/images/ImgViewer"; +import StarRatings from "react-star-ratings"; +import DetailedRating from "./DetailedRating"; +import Reviews from "./review/Reviews"; +import axios from "axios"; +import AppInstallModal from "./install/AppInstallModal"; +import CurrentUsersReview from "./review/CurrentUsersReview"; +import {withConfigContext} from "../../../context/ConfigContext"; + +const {Title, Text, Paragraph} = Typography; + +class ReleaseView extends React.Component { + constructor(props) { + super(props); + this.state = { + loading: false, + appInstallModalVisible: false + } + } + + installApp = (type, payload) => { + const config = this.props.context; + const release = this.props.app.applicationReleases[0]; + const {uuid} = release; + + this.setState({ + loading: true, + }); + const url = window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.store + "/subscription/" + uuid + "/" + type + "/install"; + axios.post( + url, + payload, + { + headers: {'X-Platform': config.serverConfig.platform} + } + ).then(res => { + if (res.status === 200) { + this.setState({ + loading: false, + appInstallModalVisible: false + }); + notification["success"]({ + message: 'Done!', + description: + 'App installed triggered.', + }); + } else { + this.setState({ + loading: false + }); + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while installing app", + }); + } + + }).catch((error) => { + if (error.response.status === 401) { + window.location.href = window.location.origin+ '/store/login'; + } else { + this.setState({ + loading: false, + visible: false + }); + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while installing the app.", + }); + } + }); + }; + + showAppInstallModal = () => { + this.setState({ + appInstallModalVisible: true + }); + }; + + closeAppInstallModal = () => { + this.setState({ + appInstallModalVisible: false + }); + }; + + render() { + const {app,deviceType} = this.props; + const release = app.applicationReleases[0]; + return ( +
+ +
+ + + icon + + + {app.name} + Version : {release.version}

+ + + +
+ + + +
+ +
+ + + + + + + {release.description} + + + + + REVIEWS + + + + + + +
+
+ ); + } +} + +export default withConfigContext(ReleaseView); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/images/ImgViewer.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/images/ImgViewer.js new file mode 100644 index 0000000000..17a136aac6 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/images/ImgViewer.js @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React, {Component} from 'react'; +import RcViewer from 'rc-viewer'; +import {Col} from "antd"; + +class ImgViewer extends Component { + render() { + const options = { + title: false, + toolbar: { + zoomIn: 0, + zoomOut: 0, + oneToOne: 0, + reset: 0, + prev: 1, + play: { + show: 0 + }, + next: 1, + rotateLeft: 0, + rotateRight: 0, + flipHorizontal: 0, + flipVertical: 0 + }, + rotatable: false, + transition: false, + movable : false + }; + return ( +
+ + {this.props.images.map((screenshotUrl) => { + return ( + + + + ) + })} + +
+ ); + + } +} + +export default ImgViewer; \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/AppInstallModal.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/AppInstallModal.js new file mode 100644 index 0000000000..1b4d9c8c2e --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/AppInstallModal.js @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Modal, Tabs} from "antd"; +import UserInstall from "./UserInstall"; +import GroupInstall from "./GroupInstall"; +import RoleInstall from "./RoleInstall"; +import DeviceInstall from "./DeviceInstall"; + +const { TabPane } = Tabs; + +class AppInstallModal extends React.Component{ + state={ + data:[] + }; + render() { + const {deviceType} = this.props; + return ( +
+ + + + + + + + + + + + + + + + +
+ ); + } +} + +export default AppInstallModal; \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/DeviceInstall.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/DeviceInstall.js new file mode 100644 index 0000000000..34dfefd362 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/DeviceInstall.js @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import axios from "axios"; +import {Button, message, notification, Table, Typography} from "antd"; +import TimeAgo from 'javascript-time-ago' + +// Load locale-specific relative date/time formatting rules. +import en from 'javascript-time-ago/locale/en' +import {withConfigContext} from "../../../../context/ConfigContext"; + +const {Text} = Typography; +const columns = [ + { + title: 'Device', + dataIndex: 'name', + fixed: 'left', + width: 100, + }, + { + title: 'Modal', + dataIndex: 'deviceInfo', + key: 'modal', + render: deviceInfo => `${deviceInfo.vendor} ${deviceInfo.deviceModel}` + // todo add filtering options + }, + { + title: 'Owner', + dataIndex: 'enrolmentInfo', + key: 'owner', + render: enrolmentInfo => enrolmentInfo.owner + // todo add filtering options + }, + { + title: 'Last Updated', + dataIndex: 'enrolmentInfo', + key: 'dateOfLastUpdate', + render: (data) => { + return (getTimeAgo(data.dateOfLastUpdate)); + } + // todo add filtering options + }, + { + title: 'Status', + dataIndex: 'enrolmentInfo', + key: 'status', + render: enrolmentInfo => enrolmentInfo.status + // todo add filtering options + }, + { + title: 'Ownership', + dataIndex: 'enrolmentInfo', + key: 'ownership', + render: enrolmentInfo => enrolmentInfo.ownership + // todo add filtering options + }, + { + title: 'OS Version', + dataIndex: 'deviceInfo', + key: 'osVersion', + render: deviceInfo => deviceInfo.osVersion + // todo add filtering options + }, + { + title: 'IMEI', + dataIndex: 'properties', + key: 'imei', + render: properties => { + let imei = "not-found"; + for (let i = 0; i < properties.length; i++) { + if (properties[i].name === "IMEI") { + imei = properties[i].value; + } + } + return imei; + } + // todo add filtering options + }, +]; + +const getTimeAgo = (time) => { + const timeAgo = new TimeAgo('en-US'); + return timeAgo.format(time); +}; + + +class DeviceInstall extends React.Component { + constructor(props) { + super(props); + TimeAgo.addLocale(en); + this.state = { + data: [], + pagination: {}, + loading: false, + selectedRows: [] + }; + } + + rowSelection = { + onChange: (selectedRowKeys, selectedRows) => { + // console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows); + this.setState({ + selectedRows: selectedRows + }) + }, + getCheckboxProps: record => ({ + disabled: record.name === 'Disabled User', // Column configuration not to be checked + name: record.name, + }), + }; + + componentDidMount() { + this.fetch(); + } + + //fetch data from api + fetch = (params = {}) => { + const config = this.props.context; + this.setState({loading: true}); + const {deviceType} = this.props; + // get current page + const currentPage = (params.hasOwnProperty("page")) ? params.page : 1; + + const extraParams = { + offset: 10 * (currentPage - 1), //calculate the offset + limit: 10, + status: "ACTIVE", + requireDeviceInfo: true, + type: deviceType + }; + + // note: encode with '%26' not '&' + const encodedExtraParams = Object.keys(extraParams).map(key => key + '=' + extraParams[key]).join('&'); + + //send request to the invoker + axios.get( + window.location.origin + config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt + + "/devices?" + encodedExtraParams, + ).then(res => { + if (res.status === 200) { + const pagination = {...this.state.pagination}; + this.setState({ + loading: false, + data: res.data.data.devices, + pagination, + }); + + } + + }).catch((error) => { + console.log(error); + if (error.hasOwnProperty("status") && error.response.status === 401) { + //todo display a popop with error + message.error('You are not logged in'); + window.location.href = window.location.origin + '/store/login'; + } else { + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while trying to load devices.", + }); + } + + this.setState({loading: false}); + }); + }; + + handleTableChange = (pagination, filters, sorter) => { + const pager = {...this.state.pagination}; + pager.current = pagination.current; + this.setState({ + pagination: pager, + }); + this.fetch({ + results: pagination.pageSize, + page: pagination.current, + sortField: sorter.field, + sortOrder: sorter.order, + ...filters, + }); + }; + + install = () => { + const {selectedRows} = this.state; + const payload = []; + selectedRows.map(device => { + payload.push({ + id: device.deviceIdentifier, + type: device.type + }); + }); + this.props.onInstall("devices", payload); + }; + + render() { + const {data, pagination, loading, selectedRows} = this.state; + return ( +
+ + Start installing the application for one or more users by entering the corresponding user name. + Select install to automatically start downloading the application for the respective user/users. + + record.deviceIdentifier} + dataSource={data} + pagination={{ + ...pagination, + size: "small", + // position: "top", + showTotal: (total, range) => `showing ${range[0]}-${range[1]} of ${total} devices` + // showQuickJumper: true + }} + loading={loading} + onChange={this.handleTableChange} + rowSelection={this.rowSelection} + scroll={{x: 1000}} + /> +
+ +
+ + ); + } +} + +export default withConfigContext(DeviceInstall); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/GroupInstall.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/GroupInstall.js new file mode 100644 index 0000000000..a8af7482c9 --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/GroupInstall.js @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Typography, Select, Spin, message, notification, Button} from "antd"; +import debounce from 'lodash.debounce'; +import axios from "axios"; +import {withConfigContext} from "../../../../context/ConfigContext"; + +const {Text} = Typography; +const {Option} = Select; + + +class GroupInstall extends React.Component { + + constructor(props) { + super(props); + this.lastFetchId = 0; + this.fetchUser = debounce(this.fetchUser, 800); + } + + state = { + data: [], + value: [], + fetching: false, + }; + + fetchUser = value => { + this.lastFetchId += 1; + const fetchId = this.lastFetchId; + const config = this.props.context; + this.setState({data: [], fetching: true}); + + axios.post( + window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt+"/groups?name=" + value, + + ).then(res => { + if (res.status === 200) { + if (fetchId !== this.lastFetchId) { + // for fetch callback order + return; + } + + const data = res.data.data.deviceGroups.map(group => ({ + text: group.name, + value: group.name, + })); + + this.setState({data, fetching: false}); + } + + }).catch((error) => { console.log(error); + if (error.hasOwnProperty("status") && error.response.status === 401) { + message.error('You are not logged in'); + window.location.href = window.location.origin+'/store/login'; + } else { + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while trying to load groups.", + }); + } + + this.setState({fetching: false}); + }); + }; + + handleChange = value => { + this.setState({ + value, + data: [], + fetching: false, + }); + }; + + install = () =>{ + const {value} = this.state; + const data = []; + value.map(val=>{ + data.push(val.key); + }); + this.props.onInstall("group",data); + }; + + render() { + + const {fetching, data, value} = this.state; + + return ( +
+ Start installing the application for one or more groups by entering the corresponding group name. Select install to automatically start downloading the application for the respective device group/ groups. +
+
+ +
+ +
+
+ ); + } +} + +export default withConfigContext(GroupInstall); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/RoleInstall.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/RoleInstall.js new file mode 100644 index 0000000000..877fd3a4cb --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/RoleInstall.js @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Typography, Select, Spin, message, notification, Button} from "antd"; +import debounce from 'lodash.debounce'; +import axios from "axios"; +import {withConfigContext} from "../../../../context/ConfigContext"; + +const {Text} = Typography; +const {Option} = Select; + + +class RoleInstall extends React.Component { + + constructor(props) { + super(props); + this.lastFetchId = 0; + this.fetchUser = debounce(this.fetchUser, 800); + } + + state = { + data: [], + value: [], + fetching: false, + }; + + fetchUser = value => { + const config = this.props.context; + this.lastFetchId += 1; + const fetchId = this.lastFetchId; + this.setState({data: [], fetching: true}); + + axios.get( + window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt+"/roles?filter=" + value, + + ).then(res => { + if (res.status === 200) { + if (fetchId !== this.lastFetchId) { + // for fetch callback order + return; + } + + const data = res.data.data.roles.map(role => ({ + text: role, + value: role, + })); + + this.setState({data, fetching: false}); + } + + }).catch((error) => { console.log(error); + if (error.hasOwnProperty("status") && error.response.status === 401) { + message.error('You are not logged in'); + window.location.href = window.location.origin+'/store/login'; + } else { + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while trying to load roles.", + }); + } + + this.setState({fetching: false}); + }); + }; + + handleChange = value => { + this.setState({ + value, + data: [], + fetching: false, + }); + }; + + install = () =>{ + const {value} = this.state; + const data = []; + value.map(val=>{ + data.push(val.key); + }); + this.props.onInstall("role",data); + }; + + render() { + + const {fetching, data, value} = this.state; + + return ( +
+ Start installing the application for one or more roles by entering the corresponding role name. Select install to automatically start downloading the application for the respective user role/roles. +
+
+ +
+ +
+
+ ); + } +} + +export default withConfigContext(RoleInstall); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/UserInstall.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/UserInstall.js new file mode 100644 index 0000000000..8e592d52cf --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/install/UserInstall.js @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Typography, Select, Spin, message, notification, Button} from "antd"; +import debounce from 'lodash.debounce'; +import axios from "axios"; +import {withConfigContext} from "../../../../context/ConfigContext"; + +const {Text} = Typography; +const {Option} = Select; + + +class UserInstall extends React.Component { + + constructor(props) { + super(props); + this.lastFetchId = 0; + this.fetchUser = debounce(this.fetchUser, 800); + } + + state = { + data: [], + value: [], + fetching: false, + }; + + fetchUser = value => { + const config = this.props.context; + this.lastFetchId += 1; + const fetchId = this.lastFetchId; + this.setState({data: [], fetching: true}); + + + //send request to the invoker + axios.get( + window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.deviceMgt+"/users/search?username=" + value, + + ).then(res => { + if (res.status === 200) { + if (fetchId !== this.lastFetchId) { + // for fetch callback order + return; + } + + const data = res.data.data.users.map(user => ({ + text: user.username, + value: user.username, + })); + + this.setState({data, fetching: false}); + } + + }).catch((error) => { + if (error.response.hasOwnProperty(status) && error.response.status === 401) { + message.error('You are not logged in'); + window.location.href = window.location.origin+ '/store/login'; + } else { + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "Error occurred while trying to load users.", + }); + } + + this.setState({fetching: false}); + }); + }; + + handleChange = value => { + this.setState({ + value, + data: [], + fetching: false, + }); + }; + + install = () => { + const {value} = this.state; + const data = []; + value.map(val => { + data.push(val.key); + }); + this.props.onInstall("user", data); + }; + + render() { + const {fetching, data, value} = this.state; + + return ( +
+ Start installing the application for one or more users by entering the corresponding user name. Select install to automatically start downloading the application for the respective user/users. +

Select users

+ +
+ +
+
+ ); + } +} + +export default withConfigContext(UserInstall); \ No newline at end of file diff --git a/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/review/AddReview.js b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/review/AddReview.js new file mode 100644 index 0000000000..ee2b8f65ff --- /dev/null +++ b/components/device-mgt/io.entgra.device.mgt.ui/react-app/src/components/apps/release/review/AddReview.js @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2019, Entgra (pvt) Ltd. (http://entgra.io) All Rights Reserved. + * + * Entgra (pvt) Ltd. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import React from "react"; +import {Drawer, Button, Icon, Row, Col, Typography, Divider, Input, Spin, notification} from 'antd'; +import StarRatings from "react-star-ratings"; +import axios from "axios"; +import {withConfigContext} from "../../../../context/ConfigContext"; + +const {Title} = Typography; +const {TextArea} = Input; + +class AddReview extends React.Component { + state = { + visible: false, + content: '', + rating: 0, + loading: false + }; + + showDrawer = () => { + this.setState({ + visible: true, + content: '', + rating: 0, + loading: false + }); + }; + + onClose = () => { + this.setState({ + visible: false, + + }); + }; + changeRating = (newRating, name) => { + this.setState({ + rating: newRating + }); + }; + + onChange = (e) => { + this.setState({content: e.target.value}) + }; + + onSubmit = () => { + const config = this.props.context; + const {content, rating} = this.state; + const {uuid} = this.props; + this.setState({ + loading: true + }); + + const payload = { + content: content, + rating: rating + }; + + axios.post( + window.location.origin+ config.serverConfig.invoker.uri + config.serverConfig.invoker.store + "/reviews/" + uuid, + payload, + ).then(res => { + if (res.status === 201) { + this.setState({ + loading: false, + visible: false + }); + notification["success"]({ + message: 'Done!', + description: + 'Your review has been posted successfully.', + }); + + setTimeout(() => { + window.location.href = uuid; + }, 2000) + } else { + this.setState({ + loading: false, + visible: false + }); + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "We are unable to add your review right now.", + }); + } + + }).catch((error) => { + if (error.response.status === 401) { + window.location.href = window.location.origin+ '/store/login'; + } else { + this.setState({ + loading: false, + visible: false + }); + notification["error"]({ + message: "There was a problem", + duration: 0, + description: + "We are unable to add your review right now.", + }); + } + }); + + + }; + + render() { + return ( +
+ + + + + +
+ + Add review + +