[DEV] super update de generisation back et front ==> nearly stable
This commit is contained in:
parent
e4883e6176
commit
f148a38c5d
@ -70,7 +70,7 @@ RUN apk add --no-cache wget
|
|||||||
ENV LANG=C.UTF-8
|
ENV LANG=C.UTF-8
|
||||||
|
|
||||||
COPY --from=buildBack /tmp/out/maven/*.jar /application/application.jar
|
COPY --from=buildBack /tmp/out/maven/*.jar /application/application.jar
|
||||||
COPY --from=buildFront /tmp/dist /application/karusic/
|
COPY --from=buildFront /tmp/dist /application/front/
|
||||||
|
|
||||||
WORKDIR /application/
|
WORKDIR /application/
|
||||||
|
|
||||||
|
12
back/pom.xml
12
back/pom.xml
@ -1,6 +1,6 @@
|
|||||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>kar</groupId>
|
<groupId>org.kar</groupId>
|
||||||
<artifactId>karusic</artifactId>
|
<artifactId>karusic</artifactId>
|
||||||
<version>0.1.0</version>
|
<version>0.1.0</version>
|
||||||
<properties>
|
<properties>
|
||||||
@ -11,12 +11,18 @@
|
|||||||
|
|
||||||
<maven.dependency.version>3.1.1</maven.dependency.version>
|
<maven.dependency.version>3.1.1</maven.dependency.version>
|
||||||
</properties>
|
</properties>
|
||||||
|
<repositories>
|
||||||
|
<repository>
|
||||||
|
<id>gitea</id>
|
||||||
|
<url>https://gitea.atria-soft.org/api/packages/kangaroo-and-rabbit/maven</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>kar</groupId>
|
<groupId>kangaroo-and-rabbit</groupId>
|
||||||
<artifactId>archidata</artifactId>
|
<artifactId>archidata</artifactId>
|
||||||
<version>0.1.0</version>
|
<version>0.1.3</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@ -11,7 +11,6 @@ import org.glassfish.jersey.media.multipart.MultiPartFeature;
|
|||||||
import org.glassfish.jersey.server.ResourceConfig;
|
import org.glassfish.jersey.server.ResourceConfig;
|
||||||
import org.kar.karusic.api.AlbumResource;
|
import org.kar.karusic.api.AlbumResource;
|
||||||
import org.kar.karusic.api.ArtistResource;
|
import org.kar.karusic.api.ArtistResource;
|
||||||
import org.kar.karusic.api.DataResource;
|
|
||||||
import org.kar.karusic.api.Front;
|
import org.kar.karusic.api.Front;
|
||||||
import org.kar.karusic.api.GenderResource;
|
import org.kar.karusic.api.GenderResource;
|
||||||
import org.kar.karusic.api.HealthCheck;
|
import org.kar.karusic.api.HealthCheck;
|
||||||
@ -21,6 +20,7 @@ import org.kar.karusic.api.UserResource;
|
|||||||
import org.kar.archidata.GlobalConfiguration;
|
import org.kar.archidata.GlobalConfiguration;
|
||||||
import org.kar.archidata.SqlWrapper;
|
import org.kar.archidata.SqlWrapper;
|
||||||
import org.kar.archidata.UpdateJwtPublicKey;
|
import org.kar.archidata.UpdateJwtPublicKey;
|
||||||
|
import org.kar.archidata.api.DataResource;
|
||||||
import org.kar.archidata.filter.AuthenticationFilter;
|
import org.kar.archidata.filter.AuthenticationFilter;
|
||||||
import org.kar.archidata.filter.CORSFilter;
|
import org.kar.archidata.filter.CORSFilter;
|
||||||
import org.kar.archidata.filter.OptionFilter;
|
import org.kar.archidata.filter.OptionFilter;
|
||||||
@ -38,32 +38,6 @@ public class WebLauncher {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
ConfigBaseVariable.bdDatabase = "karusic";
|
ConfigBaseVariable.bdDatabase = "karusic";
|
||||||
|
|
||||||
//
|
|
||||||
// if (false) {
|
|
||||||
// Track tmpTrack = new Track();
|
|
||||||
// tmpTrack.dataId = (long) 542;
|
|
||||||
// tmpTrack.genderId = (long) 15;
|
|
||||||
// tmpTrack.description = "my beautifull description";
|
|
||||||
// tmpTrack.name = "I am singging in the rain.";
|
|
||||||
// try {
|
|
||||||
// //Track tmpTrack2 = new SqlWrapper().insert(tmpTrack);
|
|
||||||
// //System.out.println("receive data = " + tmpTrack2);
|
|
||||||
//
|
|
||||||
// SqlWrapper.update(Track.class, 2, "{\"deleted\": true }");
|
|
||||||
// Object gettedValue = SqlWrapper.get(Track.class, 2);
|
|
||||||
// System.out.println("retreive data = " + gettedValue);
|
|
||||||
// List<Track> allValues = SqlWrapper.gets(Track.class, true);
|
|
||||||
// System.out.println("retreive data:");
|
|
||||||
// for (Object elem: allValues) {
|
|
||||||
// System.out.println(" - " + elem);
|
|
||||||
// }
|
|
||||||
// } catch (Exception e2) {
|
|
||||||
// // TODO Auto-generated catch block
|
|
||||||
// e2.printStackTrace();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// if (false) {
|
|
||||||
// generate the BDD:
|
// generate the BDD:
|
||||||
try {
|
try {
|
||||||
String out = "";
|
String out = "";
|
||||||
@ -78,18 +52,7 @@ public class WebLauncher {
|
|||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// if (false) {
|
|
||||||
// // generate the BDD:
|
|
||||||
// /*
|
|
||||||
// String out = new Artist().getQueryString();
|
|
||||||
// System.out.println("The query:");
|
|
||||||
// System.out.println(out);
|
|
||||||
// return;
|
|
||||||
// */
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
// Configure resources
|
// Configure resources
|
||||||
// ===================================================================
|
// ===================================================================
|
||||||
@ -155,5 +118,12 @@ public class WebLauncher {
|
|||||||
System.out.println("There was an error while starting Grizzly HTTP server.");
|
System.out.println("There was an error while starting Grizzly HTTP server.");
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
keyUpdater.kill();
|
||||||
|
try {
|
||||||
|
keyUpdater.join(4000, 0);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,8 +9,8 @@ public class WebLauncherLocal {
|
|||||||
if (true) {
|
if (true) {
|
||||||
// for local test:
|
// for local test:
|
||||||
ConfigBaseVariable.apiAdress = "http://0.0.0.0:19080/karusic/api/";
|
ConfigBaseVariable.apiAdress = "http://0.0.0.0:19080/karusic/api/";
|
||||||
ConfigBaseVariable.dbPort = "3306";
|
//ConfigBaseVariable.ssoAdress = "http://localhost:15080/karauth/api/";
|
||||||
ConfigBaseVariable.ssoAdress = "http://localhost:15080/karauth/api/";
|
ConfigBaseVariable.ssoAdress = "https://atria-soft.org/karauth/api/";
|
||||||
}
|
}
|
||||||
WebLauncher.main(args);
|
WebLauncher.main(args);
|
||||||
}
|
}
|
||||||
|
@ -1,252 +0,0 @@
|
|||||||
package org.kar.karusic.api;
|
|
||||||
|
|
||||||
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
|
|
||||||
import org.glassfish.jersey.media.multipart.FormDataParam;
|
|
||||||
import org.kar.archidata.GlobalConfiguration;
|
|
||||||
import org.kar.archidata.annotation.security.PermitTokenInURI;
|
|
||||||
import org.kar.archidata.filter.GenericContext;
|
|
||||||
import org.kar.archidata.util.ConfigBaseVariable;
|
|
||||||
import org.kar.archidata.util.DataTools;
|
|
||||||
import org.kar.archidata.db.DBEntry;
|
|
||||||
import org.kar.karusic.model.DataSmall;
|
|
||||||
|
|
||||||
import org.kar.archidata.annotation.security.PermitAll;
|
|
||||||
import org.kar.archidata.annotation.security.RolesAllowed;
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import javax.ws.rs.*;
|
|
||||||
import javax.ws.rs.core.Context;
|
|
||||||
import javax.ws.rs.core.HttpHeaders;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import javax.ws.rs.core.SecurityContext;
|
|
||||||
import javax.ws.rs.core.StreamingOutput;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.*;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
|
|
||||||
// https://stackoverflow.com/questions/35367113/jersey-webservice-scalable-approach-to-download-file-and-reply-to-client
|
|
||||||
// https://gist.github.com/aitoroses/4f7a2b197b732a6a691d
|
|
||||||
|
|
||||||
@Path("/data")
|
|
||||||
@Produces({MediaType.APPLICATION_JSON})
|
|
||||||
public class DataResource {
|
|
||||||
|
|
||||||
public DataSmall getSmall(Long id) {
|
|
||||||
DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig);
|
|
||||||
String query = "SELECT `id`, `sha512`, `mime_type`, `size` FROM `data` WHERE `deleted` = false AND `id` = ?";
|
|
||||||
try {
|
|
||||||
PreparedStatement ps = entry.connection.prepareStatement(query);
|
|
||||||
ps.setLong(1, id);
|
|
||||||
ResultSet rs = ps.executeQuery();
|
|
||||||
if (rs.next()) {
|
|
||||||
DataSmall out = new DataSmall(rs);
|
|
||||||
entry.disconnect();
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
} catch (SQLException throwables) {
|
|
||||||
throwables.printStackTrace();
|
|
||||||
}
|
|
||||||
entry.disconnect();
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Path("/upload/")
|
|
||||||
@Consumes({MediaType.MULTIPART_FORM_DATA})
|
|
||||||
@RolesAllowed("ADMIN")
|
|
||||||
public Response uploadFile(@Context SecurityContext sc, @FormDataParam("file") InputStream fileInputStream, @FormDataParam("file") FormDataContentDisposition fileMetaData) {
|
|
||||||
GenericContext gc = (GenericContext) sc.getUserPrincipal();
|
|
||||||
System.out.println("===================================================");
|
|
||||||
System.out.println("== DATA uploadFile " + (gc==null?"null":gc.user));
|
|
||||||
System.out.println("===================================================");
|
|
||||||
//public NodeSmall uploadFile(final FormDataMultiPart form) {
|
|
||||||
System.out.println("Upload file: ");
|
|
||||||
String filePath = DataTools.getTmpFolder();
|
|
||||||
try {
|
|
||||||
DataTools.createFolder(ConfigBaseVariable.getTmpDataFolder() + File.separator);
|
|
||||||
} catch (IOException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
DataTools.saveFile(fileInputStream, filePath);
|
|
||||||
return Response.ok("Data uploaded successfully !!").build();
|
|
||||||
//return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Path("{id}")
|
|
||||||
@PermitTokenInURI
|
|
||||||
@RolesAllowed("USER")
|
|
||||||
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
|
||||||
public Response retriveDataId(@Context SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) String token, @HeaderParam("Range") String range, @PathParam("id") Long id) throws Exception {
|
|
||||||
GenericContext gc = (GenericContext) sc.getUserPrincipal();
|
|
||||||
System.out.println("===================================================");
|
|
||||||
System.out.println("== DATA retriveDataId ? " + (gc==null?"null":gc.user));
|
|
||||||
System.out.println("===================================================");
|
|
||||||
DataSmall value = getSmall(id);
|
|
||||||
if (value == null) {
|
|
||||||
Response.status(404).
|
|
||||||
entity("{\"error\":\"media NOT FOUND: " + id + "\"}").
|
|
||||||
type("application/json").
|
|
||||||
build();
|
|
||||||
}
|
|
||||||
return buildStream(ConfigBaseVariable.getMediaDataFolder() + File.separator + id + File.separator + "data", range, value.mimeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Path("thumbnail/{id}")
|
|
||||||
@RolesAllowed("USER")
|
|
||||||
@PermitTokenInURI
|
|
||||||
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
|
||||||
//@CacheMaxAge(time = 10, unit = TimeUnit.DAYS)
|
|
||||||
public Response retriveDataThumbnailId(@Context SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) String token, @HeaderParam("Range") String range, @PathParam("id") Long id) throws Exception {
|
|
||||||
GenericContext gc = (GenericContext) sc.getUserPrincipal();
|
|
||||||
System.out.println("===================================================");
|
|
||||||
System.out.println("== DATA retriveDataThumbnailId ? " + (gc==null?"null":gc.user));
|
|
||||||
System.out.println("===================================================");
|
|
||||||
System.out.println("==id = " + id);
|
|
||||||
DataSmall value = getSmall(id);
|
|
||||||
if (value == null) {
|
|
||||||
return Response.status(404).
|
|
||||||
entity("{\"error\":\"media NOT FOUND: " + id + "\"}").
|
|
||||||
type("application/json").
|
|
||||||
build();
|
|
||||||
}
|
|
||||||
String filePathName = ConfigBaseVariable.getMediaDataFolder() + File.separator + id + File.separator + "data";
|
|
||||||
File inputFile = new File(filePathName);
|
|
||||||
if (!inputFile.exists()) {
|
|
||||||
return Response.status(404).
|
|
||||||
entity("{\"error\":\"media Does not exist: " + id + "\"}").
|
|
||||||
type("application/json").
|
|
||||||
build();
|
|
||||||
}
|
|
||||||
if ( value.mimeType.contentEquals("image/jpeg")
|
|
||||||
|| value.mimeType.contentEquals("image/png")
|
|
||||||
// || value.mimeType.contentEquals("image/webp")
|
|
||||||
) {
|
|
||||||
// reads input image
|
|
||||||
BufferedImage inputImage = ImageIO.read(inputFile);
|
|
||||||
int scaledWidth = 250;
|
|
||||||
int scaledHeight = (int)((float)inputImage.getHeight() / (float)inputImage.getWidth() * (float) scaledWidth);
|
|
||||||
// creates output image
|
|
||||||
BufferedImage outputImage = new BufferedImage(scaledWidth,
|
|
||||||
scaledHeight, inputImage.getType());
|
|
||||||
|
|
||||||
// scales the input image to the output image
|
|
||||||
Graphics2D g2d = outputImage.createGraphics();
|
|
||||||
g2d.drawImage(inputImage, 0, 0, scaledWidth, scaledHeight, null);
|
|
||||||
g2d.dispose();
|
|
||||||
// create the oputput stream:
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
||||||
ImageIO.write(outputImage, "JPG", baos);
|
|
||||||
byte[] imageData = baos.toByteArray();
|
|
||||||
Response.ok(new ByteArrayInputStream(imageData)).build();
|
|
||||||
Response.ResponseBuilder out = Response.ok(imageData)
|
|
||||||
.header(HttpHeaders.CONTENT_LENGTH, imageData.length);
|
|
||||||
out.type("image/jpeg");
|
|
||||||
return out.build();
|
|
||||||
}
|
|
||||||
return buildStream(filePathName, range, value.mimeType);
|
|
||||||
}
|
|
||||||
//@Secured
|
|
||||||
@GET
|
|
||||||
@Path("{id}/{name}")
|
|
||||||
@PermitTokenInURI
|
|
||||||
//@RolesAllowed("USER")
|
|
||||||
@PermitAll
|
|
||||||
@Produces(MediaType.APPLICATION_OCTET_STREAM)
|
|
||||||
public Response retriveDataFull(@Context SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) String token, @HeaderParam("Range") String range, @PathParam("id") Long id, @PathParam("name") String name) throws Exception {
|
|
||||||
GenericContext gc = (GenericContext) sc.getUserPrincipal();
|
|
||||||
System.out.println("===================================================");
|
|
||||||
System.out.println("== DATA retriveDataFull ? " + (gc==null?"null":gc.user));
|
|
||||||
System.out.println("===================================================");
|
|
||||||
DataSmall value = getSmall(id);
|
|
||||||
if (value == null) {
|
|
||||||
Response.status(404).
|
|
||||||
entity("media NOT FOUND: " + id).
|
|
||||||
type("text/plain").
|
|
||||||
build();
|
|
||||||
}
|
|
||||||
return buildStream(ConfigBaseVariable.getMediaDataFolder() + File.separator + id + File.separator + "data", range, value.mimeType);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adapted from http://stackoverflow.com/questions/12768812/video-streaming-to-ipad-does-not-work-with-tapestry5/12829541#12829541
|
|
||||||
*
|
|
||||||
* @param range range header
|
|
||||||
* @return Streaming output
|
|
||||||
* @throws Exception IOException if an error occurs in streaming.
|
|
||||||
*/
|
|
||||||
private Response buildStream(final String filename, final String range, String mimeType) throws Exception {
|
|
||||||
File file = new File(filename);
|
|
||||||
//System.out.println("request range : " + range);
|
|
||||||
// range not requested : Firefox does not send range headers
|
|
||||||
if (range == null) {
|
|
||||||
final StreamingOutput output = new StreamingOutput() {
|
|
||||||
@Override
|
|
||||||
public void write(OutputStream out) {
|
|
||||||
try (FileInputStream in = new FileInputStream(file)) {
|
|
||||||
byte[] buf = new byte[1024 * 1024];
|
|
||||||
int len;
|
|
||||||
while ((len = in.read(buf)) != -1) {
|
|
||||||
try {
|
|
||||||
out.write(buf, 0, len);
|
|
||||||
out.flush();
|
|
||||||
//System.out.println("---- wrote " + len + " bytes file ----");
|
|
||||||
} catch (IOException ex) {
|
|
||||||
System.out.println("remote close connection");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IOException ex) {
|
|
||||||
throw new InternalServerErrorException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Response.ResponseBuilder out = Response.ok(output)
|
|
||||||
.header(HttpHeaders.CONTENT_LENGTH, file.length());
|
|
||||||
if (mimeType != null) {
|
|
||||||
out.type(mimeType);
|
|
||||||
}
|
|
||||||
return out.build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] ranges = range.split("=")[1].split("-");
|
|
||||||
final long from = Long.parseLong(ranges[0]);
|
|
||||||
|
|
||||||
//System.out.println("request range : " + ranges.length);
|
|
||||||
//Chunk media if the range upper bound is unspecified. Chrome, Opera sends "bytes=0-"
|
|
||||||
long to = DataTools.CHUNK_SIZE + from;
|
|
||||||
if (ranges.length == 1) {
|
|
||||||
to = file.length() - 1;
|
|
||||||
} else {
|
|
||||||
if (to >= file.length()) {
|
|
||||||
to = (long) (file.length() - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
final String responseRange = String.format("bytes %d-%d/%d", from, to, file.length());
|
|
||||||
//System.out.println("responseRange : " + responseRange);
|
|
||||||
final RandomAccessFile raf = new RandomAccessFile(file, "r");
|
|
||||||
raf.seek(from);
|
|
||||||
|
|
||||||
final long len = to - from + 1;
|
|
||||||
final MediaStreamer streamer = new MediaStreamer(len, raf);
|
|
||||||
Response.ResponseBuilder out = Response.ok(streamer)
|
|
||||||
.status(Response.Status.PARTIAL_CONTENT)
|
|
||||||
.header("Accept-Ranges", "bytes")
|
|
||||||
.header("Content-Range", responseRange)
|
|
||||||
.header(HttpHeaders.CONTENT_LENGTH, streamer.getLenth())
|
|
||||||
.header(HttpHeaders.LAST_MODIFIED, new Date(file.lastModified()));
|
|
||||||
if (mimeType != null) {
|
|
||||||
out.type(mimeType);
|
|
||||||
}
|
|
||||||
return out.build();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,71 +0,0 @@
|
|||||||
package org.kar.karusic.api;
|
|
||||||
|
|
||||||
import javax.ws.rs.InternalServerErrorException;
|
|
||||||
import javax.ws.rs.WebApplicationException;
|
|
||||||
import javax.ws.rs.core.StreamingOutput;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.io.RandomAccessFile;
|
|
||||||
|
|
||||||
public class MediaStreamer implements StreamingOutput {
|
|
||||||
private final int CHUNK_SIZE = 1024 * 1024; // 1MB chunks
|
|
||||||
final byte[] buf = new byte[CHUNK_SIZE];
|
|
||||||
private long length;
|
|
||||||
private RandomAccessFile raf;
|
|
||||||
|
|
||||||
public MediaStreamer(long length, RandomAccessFile raf) throws IOException {
|
|
||||||
//System.out.println("request stream of " + length / 1024 + " data");
|
|
||||||
if (length<0) {
|
|
||||||
throw new IOException("Wrong size of the file to stream: " + length);
|
|
||||||
}
|
|
||||||
this.length = length;
|
|
||||||
this.raf = raf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
public void write(OutputStream out) {
|
|
||||||
try (FileInputStream in = new FileInputStream(file)) {
|
|
||||||
byte[] buf = new byte[1024*1024];
|
|
||||||
int len;
|
|
||||||
while ((len = in.read(buf)) != -1) {
|
|
||||||
out.write(buf, 0, len);
|
|
||||||
out.flush();
|
|
||||||
//System.out.println("---- wrote " + len + " bytes file ----");
|
|
||||||
}
|
|
||||||
} catch (IOException ex) {
|
|
||||||
throw new InternalServerErrorException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void write(OutputStream outputStream) {
|
|
||||||
try {
|
|
||||||
while (length != 0) {
|
|
||||||
int read = raf.read(buf, 0, buf.length > length ? (int) length : buf.length);
|
|
||||||
try {
|
|
||||||
outputStream.write(buf, 0, read);
|
|
||||||
} catch (IOException ex) {
|
|
||||||
System.out.println("remote close connection");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
length -= read;
|
|
||||||
}
|
|
||||||
} catch (IOException ex) {
|
|
||||||
throw new InternalServerErrorException(ex);
|
|
||||||
} catch (WebApplicationException ex) {
|
|
||||||
throw new InternalServerErrorException(ex);
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
raf.close();
|
|
||||||
} catch (IOException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
throw new InternalServerErrorException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getLenth() {
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,25 +1,15 @@
|
|||||||
package org.kar.karusic.api;
|
package org.kar.karusic.api;
|
||||||
|
|
||||||
import org.kar.archidata.GlobalConfiguration;
|
|
||||||
import org.kar.archidata.SqlWrapper;
|
import org.kar.archidata.SqlWrapper;
|
||||||
import org.kar.archidata.db.DBEntry;
|
|
||||||
import org.kar.archidata.filter.GenericContext;
|
import org.kar.archidata.filter.GenericContext;
|
||||||
import org.kar.archidata.model.User;
|
import org.kar.archidata.model.User;
|
||||||
import org.kar.karusic.model.UserKarusic;
|
import org.kar.karusic.model.UserKarusic;
|
||||||
|
|
||||||
import org.kar.archidata.annotation.security.PermitAll;
|
|
||||||
import org.kar.archidata.annotation.security.RolesAllowed;
|
import org.kar.archidata.annotation.security.RolesAllowed;
|
||||||
import javax.ws.rs.*;
|
import javax.ws.rs.*;
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import javax.ws.rs.core.SecurityContext;
|
import javax.ws.rs.core.SecurityContext;
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.security.MessageDigest;
|
|
||||||
import java.security.NoSuchAlgorithmException;
|
|
||||||
import java.sql.PreparedStatement;
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
@ -30,30 +20,6 @@ public class UserResource {
|
|||||||
public UserResource() {
|
public UserResource() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// private static String randomString(int count) {
|
|
||||||
// Random rand = new Random(System.nanoTime());
|
|
||||||
// String s = new String();
|
|
||||||
// int nbChar = count;
|
|
||||||
// for (int i = 0; i < nbChar; i++) {
|
|
||||||
// char c = (char) rand.nextInt();
|
|
||||||
// while ((c < 'a' || c > 'z') && (c < 'A' || c > 'Z') && (c < '0' || c > '9'))
|
|
||||||
// c = (char) rand.nextInt();
|
|
||||||
// s = s + c;
|
|
||||||
// }
|
|
||||||
// return s;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// I do not understand why angular request option before, but this is needed..
|
|
||||||
/*
|
|
||||||
@OPTIONS
|
|
||||||
public Response getOption(){
|
|
||||||
return Response.ok()
|
|
||||||
.header("Allow", "POST")
|
|
||||||
.header("Allow", "GET")
|
|
||||||
.header("Allow", "OPTIONS")
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// curl http://localhost:9993/api/users
|
// curl http://localhost:9993/api/users
|
||||||
@GET
|
@GET
|
||||||
@RolesAllowed("ADMIN")
|
@RolesAllowed("ADMIN")
|
||||||
@ -68,18 +34,6 @@ public class UserResource {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// I do not understand why angular request option before, but this is needed..
|
|
||||||
/*
|
|
||||||
@OPTIONS
|
|
||||||
@Path("{id}")
|
|
||||||
public Response getTokenOption(@PathParam("id") long userId){
|
|
||||||
return Response.ok()
|
|
||||||
.header("Allow", "POST")
|
|
||||||
.header("Allow", "GET")
|
|
||||||
.header("Allow", "OPTIONS")
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// curl http://localhost:9993/api/users/3
|
// curl http://localhost:9993/api/users/3
|
||||||
@GET
|
@GET
|
||||||
@Path("{id}")
|
@Path("{id}")
|
||||||
@ -99,16 +53,6 @@ public class UserResource {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
@OPTIONS
|
|
||||||
@Path("me")
|
|
||||||
public Response getOptionMe(){
|
|
||||||
return Response.ok()
|
|
||||||
.header("Allow", "GET")
|
|
||||||
.header("Allow", "OPTIONS")
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// curl http://localhost:9993/api/users/3
|
// curl http://localhost:9993/api/users/3
|
||||||
@GET
|
@GET
|
||||||
@Path("me")
|
@Path("me")
|
||||||
@ -122,103 +66,6 @@ public class UserResource {
|
|||||||
return gc.user;
|
return gc.user;
|
||||||
}
|
}
|
||||||
|
|
||||||
// curl -d '{"id":3,"login":"HeeroYui","password":"bouloued","email":"yui.heero@gmail.com","emailValidate":0,"newEmail":null,"authorisationLevel":"ADMIN"}' -H "Content-Type: application/json" -X POST http://localhost:9993/api/users
|
|
||||||
@POST
|
|
||||||
@RolesAllowed("ADMIN")
|
|
||||||
public Response createUser(UserKarusic user) {
|
|
||||||
System.out.println("getUser " + user);
|
|
||||||
/*
|
|
||||||
DBEntry entry = new DBEntry(WebLauncher.dbConfig);
|
|
||||||
String query = "SELECT * FROM user WHERE id = ?";
|
|
||||||
try {
|
|
||||||
PreparedStatement ps = entry.connection.prepareStatement(query);
|
|
||||||
ps.setLong(1, userId);
|
|
||||||
ResultSet rs = ps.executeQuery();
|
|
||||||
if (rs.next()) {
|
|
||||||
User out = new User(rs);
|
|
||||||
entry.disconnect();
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
} catch (SQLException throwables) {
|
|
||||||
throwables.printStackTrace();
|
|
||||||
}
|
|
||||||
entry.disconnect();
|
|
||||||
entry = null;
|
|
||||||
return null;
|
|
||||||
*/
|
|
||||||
String result = "User saved ... : " + user;
|
|
||||||
return Response.status(201).entity(result).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Path("/check_login")
|
|
||||||
@PermitAll
|
|
||||||
public Response checkLogin(@QueryParam("login") String login) {
|
|
||||||
System.out.println("checkLogin: " + login);
|
|
||||||
|
|
||||||
DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig);
|
|
||||||
String query = "SELECT COUNT(*) FROM user WHERE login = ?";
|
|
||||||
try {
|
|
||||||
PreparedStatement ps = entry.connection.prepareStatement(query);
|
|
||||||
ps.setString(1, login);
|
|
||||||
ResultSet rs = ps.executeQuery();
|
|
||||||
if (rs.next()) {
|
|
||||||
int count = rs.getInt(1);
|
|
||||||
entry.disconnect();
|
|
||||||
if (count >= 1) {
|
|
||||||
return Response.ok().build();
|
|
||||||
}
|
|
||||||
return Response.status(404).build();
|
|
||||||
}
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
entry.disconnect();
|
|
||||||
return Response.status(520).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: for more security we need to hash the email when sended... or remove thios API !!!
|
|
||||||
@GET
|
|
||||||
@Path("/check_email")
|
|
||||||
@PermitAll
|
|
||||||
public Response checkEmail(@QueryParam("email") String email) {
|
|
||||||
System.out.println("checkEmail: " + email);
|
|
||||||
|
|
||||||
DBEntry entry = new DBEntry(GlobalConfiguration.dbConfig);
|
|
||||||
String query = "SELECT COUNT(*) FROM user WHERE email = ?";
|
|
||||||
try {
|
|
||||||
PreparedStatement ps = entry.connection.prepareStatement(query);
|
|
||||||
ps.setString(1, email);
|
|
||||||
ResultSet rs = ps.executeQuery();
|
|
||||||
if (rs.next()) {
|
|
||||||
int count = rs.getInt(1);
|
|
||||||
entry.disconnect();
|
|
||||||
if (count >= 1) {
|
|
||||||
return Response.ok().build();
|
|
||||||
}
|
|
||||||
return Response.status(404).build();
|
|
||||||
}
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
entry.disconnect();
|
|
||||||
return Response.status(520).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getSHA512(String passwordToHash) {
|
|
||||||
try {
|
|
||||||
MessageDigest md = MessageDigest.getInstance("SHA-512");
|
|
||||||
byte[] bytes = md.digest(passwordToHash.getBytes(StandardCharsets.UTF_8));
|
|
||||||
StringBuilder sb = new StringBuilder();
|
|
||||||
for (int i = 0; i < bytes.length; i++) {
|
|
||||||
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
} catch (NoSuchAlgorithmException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
package org.kar.karusic.model;
|
|
||||||
|
|
||||||
public class DataGetToken {
|
|
||||||
public String login;
|
|
||||||
public String method;
|
|
||||||
public String time;
|
|
||||||
public String password;
|
|
||||||
}
|
|
@ -1,57 +0,0 @@
|
|||||||
package org.kar.karusic.model;
|
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
/*
|
|
||||||
CREATE TABLE `token` (
|
|
||||||
`id` bigint NOT NULL COMMENT 'Unique ID of the TOKEN' AUTO_INCREMENT PRIMARY KEY,
|
|
||||||
`userId` bigint NOT NULL COMMENT 'Unique ID of the user',
|
|
||||||
`token` varchar(128) COLLATE 'latin1_bin' NOT NULL COMMENT 'Token (can be not unique)',
|
|
||||||
`createTime` datetime NOT NULL COMMENT 'Time the token has been created',
|
|
||||||
`endValidityTime` datetime NOT NULL COMMENT 'Time of the token end validity'
|
|
||||||
) AUTO_INCREMENT=10;
|
|
||||||
|
|
||||||
*/
|
|
||||||
public class Token {
|
|
||||||
public Long id;
|
|
||||||
public Long userId;
|
|
||||||
public String token;
|
|
||||||
public String createTime;
|
|
||||||
public String endValidityTime;
|
|
||||||
|
|
||||||
public Token() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public Token(long id, long userId, String token, String createTime, String endValidityTime) {
|
|
||||||
this.id = id;
|
|
||||||
this.userId = userId;
|
|
||||||
this.token = token;
|
|
||||||
this.createTime = createTime;
|
|
||||||
this.endValidityTime = endValidityTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Token(ResultSet rs) {
|
|
||||||
int iii = 1;
|
|
||||||
try {
|
|
||||||
this.id = rs.getLong(iii++);
|
|
||||||
this.userId = rs.getLong(iii++);
|
|
||||||
this.token = rs.getString(iii++);
|
|
||||||
this.createTime = rs.getString(iii++);
|
|
||||||
this.endValidityTime = rs.getString(iii++);
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "Token{" +
|
|
||||||
"id=" + id +
|
|
||||||
", userId=" + userId +
|
|
||||||
", token='" + token + '\'' +
|
|
||||||
", createTime=" + createTime +
|
|
||||||
", endValidityTime=" + endValidityTime +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
package org.kar.karusic.model;
|
|
||||||
|
|
||||||
/*
|
|
||||||
CREATE TABLE `user` (
|
|
||||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
|
||||||
`login` varchar(128) COLLATE 'utf8_general_ci' NOT NULL COMMENT 'login of the user',
|
|
||||||
`email` varchar(512) COLLATE 'utf8_general_ci' NOT NULL COMMENT 'email of the user',
|
|
||||||
`lastConnection` datetime NOT NULL COMMENT 'last connection time',
|
|
||||||
`admin` enum("TRUE", "FALSE") NOT NULL DEFAULT 'FALSE',
|
|
||||||
`blocked` enum("TRUE", "FALSE") NOT NULL DEFAULT 'FALSE',
|
|
||||||
`removed` enum("TRUE", "FALSE") NOT NULL DEFAULT 'FALSE'
|
|
||||||
) AUTO_INCREMENT=10;
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
public class UserExtern {
|
|
||||||
public Long id;
|
|
||||||
public String login;
|
|
||||||
public boolean admin;
|
|
||||||
|
|
||||||
public UserExtern(UserKarusic other) {
|
|
||||||
this.id = other.id;
|
|
||||||
this.login = other.login;
|
|
||||||
this.admin = other.admin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "User{" +
|
|
||||||
"id=" + id +
|
|
||||||
", login='" + login + '\'' +
|
|
||||||
", admin=" + admin +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
package org.kar.karusic.model;
|
|
||||||
|
|
||||||
/*
|
|
||||||
CREATE TABLE `user` (
|
|
||||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
|
||||||
`login` varchar(128) COLLATE 'utf8_general_ci' NOT NULL COMMENT 'login of the user',
|
|
||||||
`email` varchar(512) COLLATE 'utf8_general_ci' NOT NULL COMMENT 'email of the user',
|
|
||||||
`lastConnection` datetime NOT NULL COMMENT 'last connection time',
|
|
||||||
`admin` enum("TRUE", "FALSE") NOT NULL DEFAULT 'FALSE',
|
|
||||||
`blocked` enum("TRUE", "FALSE") NOT NULL DEFAULT 'FALSE',
|
|
||||||
`removed` enum("TRUE", "FALSE") NOT NULL DEFAULT 'FALSE'
|
|
||||||
) AUTO_INCREMENT=10;
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
public class UserPerso {
|
|
||||||
public Long id;
|
|
||||||
public String login;
|
|
||||||
public boolean admin;
|
|
||||||
public boolean blocked;
|
|
||||||
public boolean removed;
|
|
||||||
|
|
||||||
public UserPerso(UserKarusic other) {
|
|
||||||
this.id = other.id;
|
|
||||||
this.login = other.login;
|
|
||||||
this.admin = other.admin;
|
|
||||||
this.blocked = other.blocked;
|
|
||||||
this.removed = other.removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "User{" +
|
|
||||||
"id=" + id +
|
|
||||||
", login='" + login + '\'' +
|
|
||||||
", admin=" + admin +
|
|
||||||
", blocked=" + blocked +
|
|
||||||
", removed=" + removed +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,73 +0,0 @@
|
|||||||
package org.kar.karusic.model;
|
|
||||||
|
|
||||||
/*
|
|
||||||
CREATE TABLE `user` (
|
|
||||||
`id` bigint NOT NULL COMMENT 'table ID' AUTO_INCREMENT PRIMARY KEY,
|
|
||||||
`login` varchar(128) COLLATE 'utf8_general_ci' NOT NULL COMMENT 'login of the user',
|
|
||||||
`password` varchar(128) COLLATE 'latin1_bin' NOT NULL COMMENT 'password of the user hashed (sha512)',
|
|
||||||
`email` varchar(512) COLLATE 'utf8_general_ci' NOT NULL COMMENT 'email of the user',
|
|
||||||
`emailValidate` bigint COMMENT 'date of the email validation',
|
|
||||||
`newEmail` varchar(512) COLLATE 'utf8_general_ci' COMMENT 'email of the user if he want to change',
|
|
||||||
`authorisationLevel` enum("REMOVED", "USER", "ADMIN") NOT NULL COMMENT 'user level of authorization'
|
|
||||||
) AUTO_INCREMENT=10;
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
|
|
||||||
public class UserSmall {
|
|
||||||
public long id;
|
|
||||||
public String login;
|
|
||||||
public String email;
|
|
||||||
public State authorisationLevel;
|
|
||||||
|
|
||||||
public UserSmall() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public UserSmall(long id, String login, String email, State authorisationLevel) {
|
|
||||||
this.id = id;
|
|
||||||
this.login = login;
|
|
||||||
this.email = email;
|
|
||||||
this.authorisationLevel = authorisationLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UserSmall(ResultSet rs) {
|
|
||||||
int iii = 1;
|
|
||||||
try {
|
|
||||||
this.id = rs.getLong(iii++);
|
|
||||||
this.login = rs.getString(iii++);
|
|
||||||
this.email = rs.getString(iii++);
|
|
||||||
this.authorisationLevel = State.valueOf(rs.getString(iii++));
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
public void serialize(ResultSet rs) {
|
|
||||||
int iii = 1;
|
|
||||||
try {
|
|
||||||
this.id = rs.getLong(iii++);
|
|
||||||
this.login = rs.getString(iii++);
|
|
||||||
this.password = rs.getString(iii++);
|
|
||||||
this.email = rs.getString(iii++);
|
|
||||||
this.emailValidate = rs.getLong(iii++);
|
|
||||||
this.newEmail = rs.getString(iii++);
|
|
||||||
this.authorisationLevel = State.valueOf(rs.getString(iii++));
|
|
||||||
} catch (SQLException ex) {
|
|
||||||
ex.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "UserSmall{" +
|
|
||||||
"id='" + id + '\'' +
|
|
||||||
", login='" + login + '\'' +
|
|
||||||
", email='" + email + '\'' +
|
|
||||||
", authorisationLevel=" + authorisationLevel +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
@ -7,7 +7,7 @@ public class ConfigVariable {
|
|||||||
public static String getFrontFolder() {
|
public static String getFrontFolder() {
|
||||||
String out = System.getenv(BASE_NAME + "FRONT_FOLDER");
|
String out = System.getenv(BASE_NAME + "FRONT_FOLDER");
|
||||||
if (out == null) {
|
if (out == null) {
|
||||||
return "/application/karusic";
|
return "/application/front";
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,16 @@
|
|||||||
"replace" : "src/environments/environment.ts",
|
"replace" : "src/environments/environment.ts",
|
||||||
"with" : "src/environments/environment.prod.ts"
|
"with" : "src/environments/environment.prod.ts"
|
||||||
} ]
|
} ]
|
||||||
|
},
|
||||||
|
"develop" : {
|
||||||
|
"optimization" : false,
|
||||||
|
"outputHashing" : "none",
|
||||||
|
"sourceMap" : true,
|
||||||
|
"namedChunks" : true,
|
||||||
|
"aot" : true,
|
||||||
|
"extractLicenses" : true,
|
||||||
|
"vendorChunk" : true,
|
||||||
|
"buildOptimizer" : false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -46,6 +56,9 @@
|
|||||||
"configurations" : {
|
"configurations" : {
|
||||||
"production" : {
|
"production" : {
|
||||||
"browserTarget" : "karusic:build:production"
|
"browserTarget" : "karusic:build:production"
|
||||||
|
},
|
||||||
|
"develop" : {
|
||||||
|
"browserTarget" : "karusic:build:develop"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
15602
front/package-lock.json
generated
15602
front/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -5,7 +5,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"all": "npm run build && npm run test",
|
"all": "npm run build && npm run test",
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"start": "ng serve --watch --port 4203",
|
"start": "ng serve --configuration=develop --watch --port 4203",
|
||||||
"build": "ng build --prod",
|
"build": "ng build --prod",
|
||||||
"test": "ng test",
|
"test": "ng test",
|
||||||
"lint": "ng lint",
|
"lint": "ng lint",
|
||||||
@ -13,51 +13,28 @@
|
|||||||
},
|
},
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@angular/animations": "^13.2.5",
|
"@angular/animations": "^14.2.10",
|
||||||
"@angular/cdk": "^13.2.5",
|
"@angular/cdk": "^14.2.7",
|
||||||
"@angular/common": "^13.2.5",
|
"@angular/common": "^14.2.10",
|
||||||
"@angular/compiler": "^13.2.5",
|
"@angular/compiler": "^14.2.10",
|
||||||
"@angular/core": "^13.2.5",
|
"@angular/core": "^14.2.10",
|
||||||
"@angular/forms": "^13.2.5",
|
"@angular/forms": "^14.2.10",
|
||||||
"@angular/material": "^13.2.5",
|
"@angular/material": "^14.2.7",
|
||||||
"@angular/platform-browser": "^13.2.5",
|
"@angular/platform-browser": "^14.2.10",
|
||||||
"@angular/platform-browser-dynamic": "^13.2.5",
|
"@angular/platform-browser-dynamic": "^14.2.10",
|
||||||
"@angular/router": "^13.2.5",
|
"@angular/router": "^14.2.10",
|
||||||
"core-js": "^3.21.1",
|
"rxjs": "^7.5.7",
|
||||||
"jquery": "^3.6.0",
|
"zone.js": "^0.12.0"
|
||||||
"rxjs": "^7.5.4",
|
|
||||||
"tslib": "^2.3.1",
|
|
||||||
"videogular": "^2.2.1",
|
|
||||||
"zone.js": "^0.11.5"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@angular-devkit/build-angular": "^13.2.5",
|
"@angular-devkit/build-angular": "^14.2.9",
|
||||||
"@angular-eslint/builder": "13.1.0",
|
"@angular-eslint/builder": "14.2.0",
|
||||||
"@angular-eslint/eslint-plugin": "13.1.0",
|
"@angular-eslint/eslint-plugin": "14.2.0",
|
||||||
"@angular-eslint/eslint-plugin-template": "13.1.0",
|
"@angular-eslint/eslint-plugin-template": "14.2.0",
|
||||||
"@angular-eslint/schematics": "13.1.0",
|
"@angular-eslint/schematics": "14.2.0",
|
||||||
"@angular-eslint/template-parser": "13.1.0",
|
"@angular-eslint/template-parser": "14.2.0",
|
||||||
"@angular/cli": "^13.2.5",
|
"@angular/cli": "^14.2.9",
|
||||||
"@angular/compiler-cli": "^13.2.5",
|
"@angular/compiler-cli": "^14.2.10",
|
||||||
"@angular/language-service": "^13.2.5",
|
"@angular/language-service": "^14.2.10"
|
||||||
"@types/jasmine": "^3.10.3",
|
|
||||||
"@types/jasminewd2": "^2.0.10",
|
|
||||||
"@types/node": "^17.0.21",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^5.17.0",
|
|
||||||
"@typescript-eslint/parser": "^5.17.0",
|
|
||||||
"codelyzer": "^6.0.2",
|
|
||||||
"eslint": "^8.12.0",
|
|
||||||
"eslint-config-google": "^0.14.0",
|
|
||||||
"jasmine-core": "^4.0.1",
|
|
||||||
"jasmine-spec-reporter": "^7.0.0",
|
|
||||||
"karma": "^6.3.17",
|
|
||||||
"karma-chrome-launcher": "^3.1.0",
|
|
||||||
"karma-coverage-istanbul-reporter": "^3.0.3",
|
|
||||||
"karma-jasmine": "^4.0.1",
|
|
||||||
"karma-jasmine-html-reporter": "^1.7.0",
|
|
||||||
"protractor": "^7.0.0",
|
|
||||||
"ts-node": "^10.7.0",
|
|
||||||
"tslint": "^5.20.1",
|
|
||||||
"typescript": "~4.5.5"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -35,9 +35,9 @@ npx ng lint
|
|||||||
|
|
||||||
build the local image:
|
build the local image:
|
||||||
|
|
||||||
docker build -t gitea.atria-soft.org/kangaroo-and-rabbit/karideo:latest .
|
docker build -t gitea.atria-soft.org/kangaroo-and-rabbit/karusic:latest .
|
||||||
|
|
||||||
docker login gitea.atria-soft.org
|
docker login gitea.atria-soft.org
|
||||||
|
|
||||||
docker push gitea.atria-soft.org/kangaroo-and-rabbit/karideo:latest
|
docker push gitea.atria-soft.org/kangaroo-and-rabbit/karusic:latest
|
||||||
|
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
|
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { Routes, RouterModule } from '@angular/router'; // CLI imports router
|
import { Routes, RouterModule } from '@angular/router'; // CLI imports router
|
||||||
import { SsoScene } from 'common/scene';
|
import { ForbiddenScene, HomeOutScene, NotFound404Scene, SsoScene } from 'common/scene';
|
||||||
|
import { OnlyAdminGuard, OnlyUnregisteredGuardHome, OnlyUsersGuard, OnlyUsersGuardHome } from 'common/service';
|
||||||
|
|
||||||
import { HelpScene, HomeScene, AlbumEditScene, AlbumsScene, ArtistEditScene, ArtistScene, SettingsScene,
|
import { HelpScene, HomeScene, AlbumEditScene, AlbumsScene, ArtistEditScene, ArtistScene, SettingsScene,
|
||||||
GenderScene, PlaylistScene, TrackEditScene, TrackScene, UploadScene, ArtistsScene, ArtistAlbumScene, AlbumScene } from './scene';
|
GenderScene, PlaylistScene, TrackEditScene, TrackScene, UploadScene, ArtistsScene, ArtistAlbumScene, AlbumScene } from './scene';
|
||||||
@ -19,23 +20,57 @@ import { HelpScene, HomeScene, AlbumEditScene, AlbumsScene, ArtistEditScene, Art
|
|||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{ path: '', redirectTo: '/home', pathMatch: 'full' },
|
{ path: '', redirectTo: '/home', pathMatch: 'full' },
|
||||||
|
|
||||||
|
{ path: 'forbidden', component: ForbiddenScene },
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- home global interface
|
// -- home global interface
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
{ path: 'home', component: HomeScene },
|
{
|
||||||
|
path: 'home',
|
||||||
|
component: HomeScene,
|
||||||
|
canActivate: [OnlyUsersGuardHome], // this route to unregistered path when not logged ==> permit to simplify display
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'unregistered',
|
||||||
|
component: HomeOutScene,
|
||||||
|
canActivate: [OnlyUnregisteredGuardHome], // jump to the home when registered
|
||||||
|
},
|
||||||
|
// ------------------------------------
|
||||||
|
// -- SSO Generic interface
|
||||||
|
// ------------------------------------
|
||||||
|
{ path: 'sso/:data/:keepConnected/:token', component: SsoScene },
|
||||||
|
{ path: 'sso/:keepConnected/:token', component: SsoScene },
|
||||||
|
{ path: 'sso', component: SsoScene },
|
||||||
|
|
||||||
|
// ------------------------------------
|
||||||
|
// -- Generic pages
|
||||||
|
// ------------------------------------
|
||||||
|
{ path: 'help/:page', component: HelpScene },
|
||||||
|
{ path: 'help', component: HelpScene },
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- upload new data:
|
// -- upload new data:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
{ path: 'upload', component: UploadScene },
|
{
|
||||||
|
path: 'upload',
|
||||||
|
component: UploadScene,
|
||||||
|
canActivate: [OnlyAdminGuard],
|
||||||
|
},
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- gender:
|
// -- gender:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// display all gender
|
// display all gender
|
||||||
{ path: 'gender', component: GenderScene },
|
{
|
||||||
|
path: 'gender',
|
||||||
|
component: GenderScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
// display all (artist | album | traks)
|
// display all (artist | album | traks)
|
||||||
{ path: 'gender/:genderId', component: GenderScene },
|
{
|
||||||
|
path: 'gender/:genderId',
|
||||||
|
component: GenderScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
//{ path: 'gender-edit/:genderId', component: GenderEditScene },
|
//{ path: 'gender-edit/:genderId', component: GenderEditScene },
|
||||||
|
|
||||||
//{ path: 'gender/:genderId', component: GenderScene },
|
//{ path: 'gender/:genderId', component: GenderScene },
|
||||||
@ -44,8 +79,16 @@ const routes: Routes = [
|
|||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- playlist:
|
// -- playlist:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
{ path: 'playlist', component: PlaylistScene },
|
{
|
||||||
{ path: 'playlist/:playlistId', component: PlaylistScene },
|
path: 'playlist',
|
||||||
|
component: PlaylistScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'playlist/:playlistId',
|
||||||
|
component: PlaylistScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
|
||||||
//{ path: 'playlist-edit/:playlistId', component: PlaylistEditScene },
|
//{ path: 'playlist-edit/:playlistId', component: PlaylistEditScene },
|
||||||
|
|
||||||
@ -53,47 +96,89 @@ const routes: Routes = [
|
|||||||
// -- Artist:
|
// -- Artist:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// display list of all artist
|
// display list of all artist
|
||||||
{ path: 'artist', component: ArtistsScene },
|
{
|
||||||
|
path: 'artist',
|
||||||
|
component: ArtistsScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
// display list af all artist with a specific gender
|
// display list af all artist with a specific gender
|
||||||
{ path: 'artist/:artistId', component: ArtistScene },
|
{
|
||||||
{ path: 'artist/:artistId/:albumId', component: ArtistAlbumScene },
|
path: 'artist/:artistId',
|
||||||
|
component: ArtistScene,
|
||||||
{ path: 'artist-edit/:artistId', component: ArtistEditScene },
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'artist/:artistId/:albumId',
|
||||||
|
component: ArtistAlbumScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'artist-edit/:artistId',
|
||||||
|
component: ArtistEditScene,
|
||||||
|
canActivate: [OnlyAdminGuard],
|
||||||
|
},
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- Album:
|
// -- Album:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// display all Album
|
// display all Album
|
||||||
{ path: 'album', component: AlbumsScene },
|
{
|
||||||
{ path: 'album/:albumId', component: AlbumScene },
|
path: 'album',
|
||||||
|
component: AlbumsScene,
|
||||||
{ path: 'album-edit/:albumId', component: AlbumEditScene },
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'album/:albumId',
|
||||||
|
component: AlbumScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'album-edit/:albumId',
|
||||||
|
component: AlbumEditScene,
|
||||||
|
canActivate: [OnlyAdminGuard],
|
||||||
|
},
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- Tracks:
|
// -- Tracks:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
{ path: 'track/:genderId/:artistId/:albumId/:trackId', component: TrackScene },
|
{
|
||||||
|
path: 'track/:genderId/:artistId/:albumId/:trackId',
|
||||||
{ path: 'track-edit/:trackId', component: TrackEditScene },
|
component: TrackScene,
|
||||||
|
canActivate: [OnlyUsersGuard],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'track-edit/:trackId',
|
||||||
|
component: TrackEditScene,
|
||||||
|
canActivate: [OnlyAdminGuard],
|
||||||
|
},
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// -- SSO Generic interface
|
// -- setting:
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
{ path: 'sso/:data/:keepConnected/:token', component: SsoScene },
|
{
|
||||||
{ path: 'sso', component: SsoScene },
|
path: 'settings',
|
||||||
|
component: SettingsScene,
|
||||||
// ------------------------------------
|
canActivate: [OnlyUsersGuard],
|
||||||
// -- Generic pages
|
},
|
||||||
// ------------------------------------
|
{
|
||||||
{ path: 'help/:page', component: HelpScene },
|
path: '**',
|
||||||
{ path: 'help', component: HelpScene },
|
component: NotFound404Scene,
|
||||||
{ path: 'settings', component: SettingsScene },
|
},
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [ RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' }) ],
|
imports: [
|
||||||
exports: [ RouterModule ]
|
RouterModule.forRoot(
|
||||||
|
routes,
|
||||||
|
{
|
||||||
|
//enableTracing: true, // <-- debugging purposes only
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
|
exports: [
|
||||||
|
RouterModule,
|
||||||
|
]
|
||||||
})
|
})
|
||||||
export class AppRoutingModule { }
|
export class AppRoutingModule { }
|
||||||
// export const routing: ModuleWithProviders = RouterModule.forRoot(routes);
|
// export const routing: ModuleWithProviders = RouterModule.forRoot(routes);
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
|
<!-- Generig global menu -->
|
||||||
<app-top-menu></app-top-menu>
|
<app-top-menu [menu]="currentMenu" (callback)="eventOnMenu($event)"></app-top-menu>
|
||||||
<div class="main-content">
|
<!-- all interfaced pages -->
|
||||||
<router-outlet *ngIf="autoConnectedDone"></router-outlet>
|
<div class="main-content" *ngIf="autoConnectedDone">
|
||||||
<div class="generic-page" *ngIf="!isConnected">
|
<router-outlet ></router-outlet>
|
||||||
|
</div>
|
||||||
|
<div class="main-content" *ngIf="!autoConnectedDone">
|
||||||
|
<div class="generic-page">
|
||||||
<div class="fill-all colomn_mutiple">
|
<div class="fill-all colomn_mutiple">
|
||||||
<b style="color:red;">You Must be connected to access @Karusic...</b>
|
<b style="color:red;">Auto-connection in progress</b>
|
||||||
<div class="clear"></div>
|
<div class="clear"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -5,8 +5,23 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Router } from '@angular/router';
|
import { EventOnMenu } from 'common/component/top-menu/top-menu';
|
||||||
import { UserService, SessionService } from 'common/service';
|
import { MenuItem, MenuPosition } from 'common/model';
|
||||||
|
import { UserService, SessionService, SSOService } from 'common/service';
|
||||||
|
import { isNullOrUndefined } from 'common/utils';
|
||||||
|
import { ArianeService } from './service';
|
||||||
|
|
||||||
|
enum MenuEventType {
|
||||||
|
SSO_LOGIN = "SSO_CALL_LOGIN",
|
||||||
|
SSO_LOGOUT = "SSO_CALL_LOGOUT",
|
||||||
|
SSO_SIGNUP = "SSO_CALL_SIGNUP",
|
||||||
|
SEGMENT = "SEGMENT",
|
||||||
|
TYPE = "TYPE",
|
||||||
|
ARTIST = "ARTIST",
|
||||||
|
ALBUM = "ALBUM",
|
||||||
|
TRACK = "TRACK",
|
||||||
|
PLAYLIST = "PLAYLIST",
|
||||||
|
}
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
@ -19,22 +34,36 @@ export class AppComponent implements OnInit {
|
|||||||
title: string = 'Karideo';
|
title: string = 'Karideo';
|
||||||
autoConnectedDone: boolean = false;
|
autoConnectedDone: boolean = false;
|
||||||
isConnected: boolean = false;
|
isConnected: boolean = false;
|
||||||
|
signUpEnable: boolean = true;
|
||||||
|
currentMenu: MenuItem[] = [];
|
||||||
|
location: string = "home";
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private router: Router,
|
|
||||||
private userService: UserService,
|
private userService: UserService,
|
||||||
private sessionService: SessionService) {
|
private sessionService: SessionService,
|
||||||
|
private ssoService: SSOService,
|
||||||
|
private arianeService: ArianeService) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.autoConnectedDone = false;
|
this.autoConnectedDone = false;
|
||||||
this.isConnected = false;
|
this.isConnected = false;
|
||||||
|
this.updateMainMenu();
|
||||||
let self = this;
|
let self = this;
|
||||||
this.sessionService.change.subscribe((isConnected) => {
|
this.sessionService.change.subscribe((isConnected) => {
|
||||||
console.log(`receive event from session ...${ isConnected}`);
|
console.log(`receive event from session ...${ isConnected}`);
|
||||||
self.isConnected = isConnected;
|
self.isConnected = isConnected;
|
||||||
self.autoConnectedDone = true;
|
self.autoConnectedDone = true;
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
this.ssoService.checkSignUpEnable()
|
||||||
|
.then((value: boolean) => {
|
||||||
|
console.log(`Get value signUp = ${value}`);
|
||||||
|
self.signUpEnable = value;
|
||||||
|
self.updateMainMenu();
|
||||||
|
}).catch((error: any) => {
|
||||||
|
console.log(`Can not call the sso to check the sign-up_interface: ${error}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
this.userService.checkAutoConnect().then(() => {
|
this.userService.checkAutoConnect().then(() => {
|
||||||
@ -47,6 +76,219 @@ export class AppComponent implements OnInit {
|
|||||||
console.log(` ==>>>>> Autoconnect FINALLY !!!`);
|
console.log(` ==>>>>> Autoconnect FINALLY !!!`);
|
||||||
self.autoConnectedDone = true;
|
self.autoConnectedDone = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.arianeService.segmentChange.subscribe((_segmentName: string) => {
|
||||||
|
//console.log(`>>> change typeId=${typeId}`);
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
this.arianeService.typeChange.subscribe((_typeId: number) => {
|
||||||
|
//console.log(`>>> change typeId=${typeId}`);
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
this.arianeService.playlistChange.subscribe((_universId: number) => {
|
||||||
|
//console.log(`>>> change universId=${universId}`);
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
this.arianeService.artistChange.subscribe((_artistId: number) => {
|
||||||
|
//console.log(`>>> change artistId=${artistId}`);
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
this.arianeService.albumChange.subscribe((_albumId: number) => {
|
||||||
|
//console.log(`>>> change albumId=${albumId}`);
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
this.arianeService.trackChange.subscribe((_trackId: number) => {
|
||||||
|
//console.log(`>>> change trackId=${trackId}`);
|
||||||
|
self.updateMainMenu();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
eventOnMenu(data: EventOnMenu): void {
|
||||||
|
//console.log(`plopppppppppp ${JSON.stringify(this.route.snapshot.url)}`);
|
||||||
|
//console.log(`Get event on menu: ${JSON.stringify(data, null, 4)}`);
|
||||||
|
switch(data.menu.otherData) {
|
||||||
|
case MenuEventType.SSO_LOGIN:
|
||||||
|
this.ssoService.requestSignIn();
|
||||||
|
break;
|
||||||
|
case MenuEventType.SSO_LOGOUT:
|
||||||
|
this.ssoService.requestSignOut();
|
||||||
|
break;
|
||||||
|
case MenuEventType.SSO_SIGNUP:
|
||||||
|
this.ssoService.requestSignUp();
|
||||||
|
break;
|
||||||
|
case MenuEventType.SEGMENT:
|
||||||
|
if(this.arianeService.getCurrrentSegment() === "artist") {
|
||||||
|
this.arianeService.navigateArtist({});
|
||||||
|
} else if(this.arianeService.getCurrrentSegment() === "gender") {
|
||||||
|
this.arianeService.navigateGender({});
|
||||||
|
} else if(this.arianeService.getCurrrentSegment() === "playlist") {
|
||||||
|
this.arianeService.navigatePlaylist({});
|
||||||
|
} else if(this.arianeService.getCurrrentSegment() === "track") {
|
||||||
|
this.arianeService.navigateTrack({});
|
||||||
|
} else if(this.arianeService.getCurrrentSegment() === "album") {
|
||||||
|
this.arianeService.navigateAlbum({});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MenuEventType.TYPE:
|
||||||
|
|
||||||
|
break;
|
||||||
|
case MenuEventType.ARTIST:
|
||||||
|
if(this.arianeService.getCurrrentSegment() === "artist") {
|
||||||
|
this.arianeService.navigateArtist({artistId: this.arianeService.getArtistId()});
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MenuEventType.ALBUM:
|
||||||
|
break;
|
||||||
|
case MenuEventType.TRACK:
|
||||||
|
break;
|
||||||
|
case MenuEventType.PLAYLIST:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
updateMainMenu(): void {
|
||||||
|
console.log("update main menu :");
|
||||||
|
if (this.isConnected) {
|
||||||
|
this.currentMenu = [
|
||||||
|
{
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
hover: `You are logged as: ${this.sessionService.getLogin()}`,
|
||||||
|
icon: "menu",
|
||||||
|
title: "Menu",
|
||||||
|
subMenu: [
|
||||||
|
{
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
hover: "Go to Home page",
|
||||||
|
icon: "home",
|
||||||
|
title: "Home",
|
||||||
|
navigateTo: "home",
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "group_work",
|
||||||
|
title: this.getSegmentDisplayable(),
|
||||||
|
otherData: MenuEventType.SEGMENT,
|
||||||
|
callback: true,
|
||||||
|
enable: this.getSegmentDisplayable() !== "",
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "piano",
|
||||||
|
title: this.getSegmentDisplayable(),
|
||||||
|
otherData: MenuEventType.TYPE,
|
||||||
|
callback: true,
|
||||||
|
enable: !isNullOrUndefined(this.arianeService.getTypeId()),
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "person",
|
||||||
|
title: this.arianeService.getArtistName(),
|
||||||
|
otherData: MenuEventType.ARTIST,
|
||||||
|
callback: true,
|
||||||
|
enable: !isNullOrUndefined(this.arianeService.getArtistId()),
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "album",
|
||||||
|
title: this.arianeService.getAlbumName(),
|
||||||
|
otherData: MenuEventType.ALBUM,
|
||||||
|
callback: true,
|
||||||
|
enable: !isNullOrUndefined(this.arianeService.getAlbumId()),
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "music_note",
|
||||||
|
title: this.arianeService.getTrackName(),
|
||||||
|
otherData: MenuEventType.TRACK,
|
||||||
|
callback: true,
|
||||||
|
enable: !isNullOrUndefined(this.arianeService.getTrackId()),
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "queue_music",
|
||||||
|
title: this.arianeService.getPlaylistName(),
|
||||||
|
otherData: MenuEventType.PLAYLIST,
|
||||||
|
callback: true,
|
||||||
|
enable: !isNullOrUndefined(this.arianeService.getPlaylistId()),
|
||||||
|
}
|
||||||
|
],
|
||||||
|
},{
|
||||||
|
position: MenuPosition.RIGHT,
|
||||||
|
image: "assets/images/avatar_generic.svg",
|
||||||
|
title: "",
|
||||||
|
subMenu: [
|
||||||
|
{
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
hover: `You are logged as: <b>${this.sessionService.getLogin()}</b>`,
|
||||||
|
title: `Sign in as ${this.sessionService.getLogin()}`,
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "add_circle",
|
||||||
|
title: "Add media",
|
||||||
|
navigateTo: "upload",
|
||||||
|
enable: this.sessionService.userAdmin === true,
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "settings",
|
||||||
|
title: "Settings",
|
||||||
|
navigateTo: "settings",
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
icon: "help",
|
||||||
|
title: "Help",
|
||||||
|
navigateTo: "help",
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
hover: "Exit connection",
|
||||||
|
icon: "exit_to_app",
|
||||||
|
title: "Sign out",
|
||||||
|
callback: true,
|
||||||
|
otherData: MenuEventType.SSO_LOGOUT,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
} else {
|
||||||
|
this.currentMenu = [
|
||||||
|
{
|
||||||
|
position: MenuPosition.LEFT,
|
||||||
|
hover: "Go to Home page",
|
||||||
|
icon: "home",
|
||||||
|
title: "Home",
|
||||||
|
navigateTo: "home",
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.RIGHT,
|
||||||
|
hover: "Create a new account",
|
||||||
|
icon: "add_circle_outline",
|
||||||
|
title: "Sign-up",
|
||||||
|
callback: true,
|
||||||
|
model: this.signUpEnable?undefined:"disable",
|
||||||
|
otherData: MenuEventType.SSO_SIGNUP,
|
||||||
|
}, {
|
||||||
|
position: MenuPosition.RIGHT,
|
||||||
|
hover: "Login page",
|
||||||
|
icon: "account_circle",
|
||||||
|
title: "Sign-in",
|
||||||
|
callback: true,
|
||||||
|
otherData: MenuEventType.SSO_LOGIN,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
console.log(" ==> DONE");
|
||||||
|
|
||||||
|
}
|
||||||
|
getSegmentDisplayable(): string {
|
||||||
|
let segment = this.arianeService.getCurrrentSegment();
|
||||||
|
if (segment === "artist") {
|
||||||
|
return "Artists"
|
||||||
|
}
|
||||||
|
if (segment === "gender") {
|
||||||
|
return "Genders"
|
||||||
|
}
|
||||||
|
if (segment === "album") {
|
||||||
|
return "Albums"
|
||||||
|
}
|
||||||
|
if (segment === "track") {
|
||||||
|
return "Tracks"
|
||||||
|
}
|
||||||
|
if (segment === "playlist") {
|
||||||
|
return "Playlistq"
|
||||||
|
}
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,23 +11,19 @@ import { HttpClientModule } from '@angular/common/http';
|
|||||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; // this is needed for dynamic selection of the select
|
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; // this is needed for dynamic selection of the select
|
||||||
import { AppRoutingModule } from './app-routing.module';
|
import { AppRoutingModule } from './app-routing.module';
|
||||||
|
|
||||||
import { UploadFileComponent } from '../common/component/upload-file/upload-file';
|
import { ErrorComponent, PopInComponent, TopMenuComponent, UploadFileComponent } from 'common/component/';
|
||||||
import { TopMenuComponent } from './component/top-menu/top-menu';
|
|
||||||
import { ElementDataImageComponent } from './component/data-image/data-image';
|
import { ElementDataImageComponent } from './component/data-image/data-image';
|
||||||
import { ElementTypeComponent } from './component/element-type/element-type';
|
import { ElementTypeComponent } from './component/element-type/element-type';
|
||||||
import { PopInComponent } from '../common/component/popin/popin';
|
|
||||||
|
|
||||||
import { PopInCreateType } from './popin/create-type/create-type';
|
import { PopInCreateType } from './popin/create-type/create-type';
|
||||||
import { PopInUploadProgress } from '../common/popin/upload-progress/upload-progress';
|
import { PopInDeleteConfirm, PopInUploadProgress } from 'common/popin';
|
||||||
import { PopInDeleteConfirm } from '../common/popin/delete-confirm/delete-confirm';
|
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
import { ErrorComponent } from '../common/error/error';
|
|
||||||
import { HomeScene, HelpScene, GenderScene, PlaylistScene, ArtistScene, AlbumScene, AlbumsScene, TrackScene, SettingsScene,
|
import { HomeScene, HelpScene, GenderScene, PlaylistScene, ArtistScene, AlbumScene, AlbumsScene, TrackScene, SettingsScene,
|
||||||
TrackEditScene, AlbumEditScene, ArtistEditScene, ArtistsScene, ArtistAlbumScene } from './scene';
|
TrackEditScene, AlbumEditScene, ArtistEditScene, ArtistsScene, ArtistAlbumScene } from './scene';
|
||||||
import { GenderService, DataService, PlaylistService, ArtistService, AlbumService, TrackService, ArianeService, PlayerService } from './service';
|
import { GenderService, DataService, PlaylistService, ArtistService, AlbumService, TrackService, ArianeService, PlayerService } from './service';
|
||||||
import { BddService, CookiesService, HttpWrapperService, PopInService, SessionService, SSOService, StorageService, UserService } from 'common/service';
|
import { BddService, CookiesService, HttpWrapperService, OnlyAdminGuard, OnlyUnregisteredGuardHome, OnlyUsersGuard, OnlyUsersGuardHome, PopInService, SessionService, SSOService, StorageService, UserService } from 'common/service';
|
||||||
import { ErrorViewerScene, SsoScene } from 'common/scene';
|
import { ErrorViewerScene, ForbiddenScene, HomeOutScene, NotFound404Scene, SsoScene } from 'common/scene';
|
||||||
import { UploadScene } from './scene/upload/upload';
|
import { UploadScene } from './scene/upload/upload';
|
||||||
import { ElementSeriesComponent, ElementTrackComponent, ElementSeasonComponent, ElementVideoComponent, ElementPlayerAudioComponent } from './component';
|
import { ElementSeriesComponent, ElementTrackComponent, ElementSeasonComponent, ElementVideoComponent, ElementPlayerAudioComponent } from './component';
|
||||||
|
|
||||||
@ -67,6 +63,9 @@ import { ElementSeriesComponent, ElementTrackComponent, ElementSeasonComponent,
|
|||||||
AlbumEditScene,
|
AlbumEditScene,
|
||||||
ArtistEditScene,
|
ArtistEditScene,
|
||||||
UploadScene,
|
UploadScene,
|
||||||
|
ForbiddenScene,
|
||||||
|
HomeOutScene,
|
||||||
|
NotFound404Scene,
|
||||||
],
|
],
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
@ -93,7 +92,11 @@ import { ElementSeriesComponent, ElementTrackComponent, ElementSeasonComponent,
|
|||||||
ArtistService,
|
ArtistService,
|
||||||
AlbumService,
|
AlbumService,
|
||||||
TrackService,
|
TrackService,
|
||||||
ArianeService
|
ArianeService,
|
||||||
|
OnlyUsersGuard,
|
||||||
|
OnlyAdminGuard,
|
||||||
|
OnlyUsersGuardHome,
|
||||||
|
OnlyUnregisteredGuardHome,
|
||||||
],
|
],
|
||||||
exports: [
|
exports: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
|
@ -11,6 +11,8 @@ import { GenderService, DataService, PlayerService, TrackService, AlbumService,
|
|||||||
import { PlaylistCurrent } from 'app/service/player';
|
import { PlaylistCurrent } from 'app/service/player';
|
||||||
import { Media } from 'app/model';
|
import { Media } from 'app/model';
|
||||||
import { HttpWrapperService } from 'common/service';
|
import { HttpWrapperService } from 'common/service';
|
||||||
|
import { Title } from '@angular/platform-browser';
|
||||||
|
import { environment } from 'environments/environment';
|
||||||
|
|
||||||
|
|
||||||
export enum PlayMode {
|
export enum PlayMode {
|
||||||
@ -73,7 +75,8 @@ export class ElementPlayerAudioComponent implements OnInit {
|
|||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private httpService: HttpWrapperService,
|
private httpService: HttpWrapperService,
|
||||||
private dataService: DataService) {
|
private dataService: DataService,
|
||||||
|
private titleService: Title) {
|
||||||
// nothing to do...
|
// nothing to do...
|
||||||
}
|
}
|
||||||
private currentLMedia: Media;
|
private currentLMedia: Media;
|
||||||
@ -110,13 +113,15 @@ export class ElementPlayerAudioComponent implements OnInit {
|
|||||||
this.albumService.get(response.albumId)
|
this.albumService.get(response.albumId)
|
||||||
.then((response2: NodeData) => {
|
.then((response2: NodeData) => {
|
||||||
self.nameData = response2.name + " - " + self.nameData;
|
self.nameData = response2.name + " - " + self.nameData;
|
||||||
|
this.titleService.setTitle(`${environment.applName} > ${self.nameData}`)
|
||||||
})
|
})
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
}
|
}
|
||||||
if (!isNullOrUndefined(response.artists) && isArray(response.artists) && response.artists.length > 0) {
|
if (!isNullOrUndefined(response.artists) && isArray(response.artists) && response.artists.length > 0) {
|
||||||
this.artistService.get(response.artists[0])
|
this.artistService.get(response.artists[0])
|
||||||
.then((response2: NodeData) => {
|
.then((response2: NodeData) => {
|
||||||
self.nameData = self.nameData + " (" + response2.name + ")";
|
self.nameData = `${self.nameData} (${response2.name})`;
|
||||||
|
this.titleService.setTitle(`${environment.applName} > ${self.nameData}`)
|
||||||
})
|
})
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
}
|
}
|
||||||
|
@ -81,7 +81,7 @@ export class ElementSeasonComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
this.subValueData += response[kkk];
|
this.subValueData += response[kkk];
|
||||||
}
|
}
|
||||||
console.log(`get values: ${this.element.id} ==> ${self.subValueData}`)
|
//console.log(`get values: ${this.element.id} ==> ${self.subValueData}`)
|
||||||
}).catch((response) => {
|
}).catch((response) => {
|
||||||
self.count2 = undefined;
|
self.count2 = undefined;
|
||||||
});
|
});
|
||||||
|
@ -1,211 +0,0 @@
|
|||||||
<div class="top">
|
|
||||||
<div id="main-menu" class="main-menu color-menu-background">
|
|
||||||
<button class="item"
|
|
||||||
(click)="onHome($event)"
|
|
||||||
(auxclick)="($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
<i class="material-icons">home</i> Home
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
<i class="material-icons">home</i>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<div class="ariane">
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeTypeId !== null"
|
|
||||||
title="Uype"
|
|
||||||
(click)="onArianeType($event)"
|
|
||||||
(auxclick)="onArianeType($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
{{arianeTypeName}}
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
T
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<div class="item_ariane_separator" *ngIf="arianePlaylistId !== null && arianeTypeId !== null" >/</div>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianePlaylistId !== null"
|
|
||||||
title="Playlist"
|
|
||||||
(click)="onArianePlaylist($event)"
|
|
||||||
(auxclick)="onArianePlaylist($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
{{arianePlaylistName}}
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
U
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<div class="item_ariane_separator" *ngIf="arianeArtistId !== null && (arianePlaylistId !== null || arianeTypeId !== null)" >/</div>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeArtistId !== null"
|
|
||||||
title="Artist"
|
|
||||||
(click)="onArianeArtist($event)"
|
|
||||||
(auxclick)="onArianeArtist($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
{{arianeArtistName}}
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
G
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<div class="item_ariane_separator" *ngIf="arianeAlbumId !== null && (arianeArtistId !== null || arianePlaylistId !== null || arianeTypeId !== null)" >/</div>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeAlbumId !== null"
|
|
||||||
title="Album"
|
|
||||||
(click)="onArianeAlbum($event)"
|
|
||||||
(auxclick)="onArianeAlbum($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
{{arianeAlbumName}}
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
S
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="!login"
|
|
||||||
style="float:right;"
|
|
||||||
(click)="onSignUp($event)"
|
|
||||||
(auxclick)="onSignUp($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
<i class="material-icons">add_circle_outline</i> Sign-up
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
<i class="material-icons">add_circle_outline</i>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="!login"
|
|
||||||
style="float:right;"
|
|
||||||
(click)="onSignIn($event)"
|
|
||||||
(auxclick)="onSignIn($event)">
|
|
||||||
<div class="xdesktop">
|
|
||||||
<i class="material-icons">account_circle</i> Sign-in
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
<i class="material-icons">account_circle</i>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="login"
|
|
||||||
style="float:right; height:56px;"
|
|
||||||
(click)="onAvatar()">
|
|
||||||
<img class="avatar" src="{{avatar}}"/>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="editShow === true"
|
|
||||||
style="float:right; height:56px;"
|
|
||||||
(click)="onEdit()">
|
|
||||||
<div class="xdesktop">
|
|
||||||
<i class="material-icons">edit</i> Edit
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
<i class="material-icons">edit</i>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
<div class="fill-all" *ngIf="login && displayUserMenu === true" (click)="onOutUserProperty()">
|
|
||||||
<!-- (click)="onOutUserProperty()" -->
|
|
||||||
<div class="sub-menu user-menu color-menu-background">
|
|
||||||
<button class="item" disabled="disabled">
|
|
||||||
Sign in as <b>{{login}}</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
(click)="onHelp($event)"
|
|
||||||
(auxclick)="onHelp($event)">
|
|
||||||
<i class="material-icons">help_outline</i> Help
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
(click)="onSetting($event)"
|
|
||||||
(auxclick)="onSetting($event)">
|
|
||||||
<i class="material-icons">settings</i> Settings
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
(click)="onLogout($event)"
|
|
||||||
(auxclick)="onLogout($event)">
|
|
||||||
<i class="material-icons">exit_to_app</i> Sign out
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
(click)="onAddMedia($event)"
|
|
||||||
(auxclick)="onAddMedia($event)">
|
|
||||||
<i class="material-icons">add_circle</i> Add media
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="fill-all" *ngIf="displayEditMenu == true" (click)="onOutUserProperty()">
|
|
||||||
<!-- (click)="onOutUserProperty()" -->
|
|
||||||
<div class="xdesktop">
|
|
||||||
<div class="sub-menu edit-menu color-menu-background">
|
|
||||||
<!--
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeTypeId !== null"
|
|
||||||
(click)="onSubEditType($event)"
|
|
||||||
(auxclick)="onSubEditType($event)">
|
|
||||||
<b>Edit Type</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianePlaylistId !== null"
|
|
||||||
(click)="onSubEditPlaylist($event)"
|
|
||||||
(auxclick)="onSubEditPlaylist($event)">
|
|
||||||
<b>Edit Playlist</b>
|
|
||||||
</button>
|
|
||||||
-->
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeArtistId !== null"
|
|
||||||
(click)="onSubEditArtist($event)"
|
|
||||||
(auxclick)="onSubEditArtist($event)">
|
|
||||||
<b>Edit Artist</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeAlbumId !== null"
|
|
||||||
(click)="onSubEditAlbum($event)"
|
|
||||||
(auxclick)="onSubEditAlbum($event)">
|
|
||||||
<b>Edit Album</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeTrackId !== null"
|
|
||||||
(click)="onSubEditTrack($event)"
|
|
||||||
(auxclick)="onSubEditTrack($event)">
|
|
||||||
<b>Edit Track</b>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="xmobile">
|
|
||||||
<div class="sub-menu edit-menu-mob color-menu-background">
|
|
||||||
<!--
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeTypeId !== null"
|
|
||||||
(click)="onSubEditType($event)"
|
|
||||||
(auxclick)="onSubEditType($event)">
|
|
||||||
<b>Edit Type</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianePlaylistId !== null"
|
|
||||||
(click)="onSubEditPlaylist($event)"
|
|
||||||
(auxclick)="onSubEditPlaylist($event)">
|
|
||||||
<b>Edit Playlist</b>
|
|
||||||
</button>
|
|
||||||
-->
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeArtistId !== null"
|
|
||||||
(click)="onSubEditArtist($event)"
|
|
||||||
(auxclick)="onSubEditArtist($event)">
|
|
||||||
<b>Edit Artist</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeAlbumId !== null"
|
|
||||||
(click)="onSubEditAlbum($event)"
|
|
||||||
(auxclick)="onSubEditAlbum($event)">
|
|
||||||
<b>Edit Album</b>
|
|
||||||
</button>
|
|
||||||
<button class="item"
|
|
||||||
*ngIf="arianeTrackId !== null"
|
|
||||||
(click)="onSubEditTrack($event)"
|
|
||||||
(auxclick)="onSubEditTrack($event)">
|
|
||||||
<b>Edit Track</b>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -1,165 +0,0 @@
|
|||||||
|
|
||||||
.top {
|
|
||||||
.sub-menu {
|
|
||||||
|
|
||||||
position: fixed;
|
|
||||||
|
|
||||||
min-width:150px;
|
|
||||||
min-height:70px;
|
|
||||||
|
|
||||||
display: block;
|
|
||||||
overflow: visible;
|
|
||||||
|
|
||||||
box-shadow: none;
|
|
||||||
flex-direction: column;
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
justify-content: flex-start;
|
|
||||||
box-sizing: border-box;
|
|
||||||
flex-shrink: 0;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 3px 0 3px;
|
|
||||||
border: none;
|
|
||||||
z-index: 300;
|
|
||||||
box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.6);
|
|
||||||
|
|
||||||
.item {
|
|
||||||
display:block;
|
|
||||||
float: top;
|
|
||||||
line-height: 56px;
|
|
||||||
z-index: 4;
|
|
||||||
margin: 3px 0px 3px 0px;
|
|
||||||
/*padding: 0px 3px 0px 3px;*/
|
|
||||||
border: 0px; /*0px 3px 0px 3px solid transparent;*/
|
|
||||||
/*text-transform: uppercase;*/
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 17px;
|
|
||||||
width:100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.material-icons {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
/* Create an Arraw on the top ob the box ... */
|
|
||||||
&:after, &:before {
|
|
||||||
bottom: 100%;
|
|
||||||
right: 13px;
|
|
||||||
border: solid transparent;
|
|
||||||
content: " ";
|
|
||||||
height: 0;
|
|
||||||
width: 0;
|
|
||||||
position: absolute;
|
|
||||||
pointer-events: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:after {
|
|
||||||
border-color: rgba(136, 183, 213, 0);
|
|
||||||
border-bottom-color: #263238;
|
|
||||||
border-width: 15px;
|
|
||||||
margin-left: -15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
.user-menu {
|
|
||||||
top:75px;
|
|
||||||
right:15px;
|
|
||||||
}
|
|
||||||
.edit-menu {
|
|
||||||
top:75px;
|
|
||||||
right:200px;
|
|
||||||
}
|
|
||||||
.edit-menu-mob {
|
|
||||||
top:75px;
|
|
||||||
right:25px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fill-all {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width:100%;
|
|
||||||
height:100%;
|
|
||||||
/*
|
|
||||||
background-color: #0F0;
|
|
||||||
*/
|
|
||||||
z-index:400;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-menu {
|
|
||||||
position: fixed;
|
|
||||||
top:0px;
|
|
||||||
left:0px;
|
|
||||||
|
|
||||||
display: block;
|
|
||||||
overflow: visible;
|
|
||||||
|
|
||||||
box-shadow: none;
|
|
||||||
min-height: 56px;
|
|
||||||
flex-direction: column;
|
|
||||||
flex-wrap: nowrap;
|
|
||||||
justify-content: flex-start;
|
|
||||||
box-sizing: border-box;
|
|
||||||
flex-shrink: 0;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0 12px 0 12px;
|
|
||||||
border: none;
|
|
||||||
max-height: 1000px;
|
|
||||||
z-index: 3;
|
|
||||||
box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.6);
|
|
||||||
|
|
||||||
.item {
|
|
||||||
display:block;
|
|
||||||
float: left;
|
|
||||||
line-height: 56px;
|
|
||||||
z-index: 4;
|
|
||||||
margin: 0 3px 0 3px;
|
|
||||||
border: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 17px;
|
|
||||||
.comment {
|
|
||||||
visibility: "hidden";
|
|
||||||
}
|
|
||||||
@media all and (min-width: 700px) {
|
|
||||||
.comment {
|
|
||||||
visibility: "visible";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.ariane {
|
|
||||||
display:block;
|
|
||||||
float: left;
|
|
||||||
line-height: 56px;
|
|
||||||
z-index: 4;
|
|
||||||
padding: 0 0 0 15px;
|
|
||||||
margin: 0 3px 0 3px;
|
|
||||||
border: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 15px;
|
|
||||||
.item_ariane_separator {
|
|
||||||
display:block;
|
|
||||||
float: left;
|
|
||||||
line-height: 56px;
|
|
||||||
z-index: 4;
|
|
||||||
margin: 0 3px 0 3px;
|
|
||||||
border: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 30px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.material-icons {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.avatar {
|
|
||||||
height:42px;
|
|
||||||
width:42px;
|
|
||||||
border-radius: 50%;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,215 +0,0 @@
|
|||||||
/** @file
|
|
||||||
* @author Edouard DUPIN
|
|
||||||
* @copyright 2018, Edouard DUPIN, all right reserved
|
|
||||||
* @license PROPRIETARY (see license file)
|
|
||||||
*/
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
import { Router } from '@angular/router';
|
|
||||||
import { UserService, SessionService, SSOService } from 'common/service';
|
|
||||||
import { ArianeService } from 'app/service';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-top-menu',
|
|
||||||
templateUrl: './top-menu.html',
|
|
||||||
styleUrls: [ './top-menu.less' ]
|
|
||||||
})
|
|
||||||
export class TopMenuComponent implements OnInit {
|
|
||||||
public login: string;// Session.getLogin();
|
|
||||||
public avatar: string;// Session.getAvatar();
|
|
||||||
public displayUserMenu: boolean = false;
|
|
||||||
public displayEditMenu: boolean = false;
|
|
||||||
|
|
||||||
public arianeTypeId: number = null;
|
|
||||||
public arianeTypeName: string = null;
|
|
||||||
|
|
||||||
public arianePlaylistId: number = null;
|
|
||||||
public arianePlaylistName: string = null;
|
|
||||||
|
|
||||||
public arianeArtistId: number = null;
|
|
||||||
public arianeArtistName: string = null;
|
|
||||||
|
|
||||||
public arianeAlbumId: number = null;
|
|
||||||
public arianeAlbumName: string = null;
|
|
||||||
|
|
||||||
public arianeTrackId: number = null;
|
|
||||||
public arianeTrackName: string = null;
|
|
||||||
|
|
||||||
public editShow: boolean = false;
|
|
||||||
|
|
||||||
constructor(private router: Router,
|
|
||||||
private sessionService: SessionService,
|
|
||||||
private arianeService: ArianeService,
|
|
||||||
private userService: UserService,
|
|
||||||
private ssoService: SSOService) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
let self = this;
|
|
||||||
this.sessionService.change.subscribe((isConnected) => {
|
|
||||||
console.log(`TOP-MENU: receive event from session ...${isConnected}`);
|
|
||||||
if(isConnected === false) {
|
|
||||||
self.login = undefined;
|
|
||||||
self.avatar = undefined;
|
|
||||||
self.displayUserMenu = false;
|
|
||||||
} else {
|
|
||||||
self.updateIsJusteLogged();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (this.sessionService.islogged()) {
|
|
||||||
this.updateIsJusteLogged();
|
|
||||||
}
|
|
||||||
this.arianeService.typeChange.subscribe((typeId: number) => {
|
|
||||||
this.arianeTypeId = typeId;
|
|
||||||
this.arianeTypeName = this.arianeService.getTypeName();
|
|
||||||
this.updateEditShow();
|
|
||||||
});
|
|
||||||
this.arianeService.playlistChange.subscribe((universId) => {
|
|
||||||
this.arianePlaylistId = universId;
|
|
||||||
this.arianePlaylistName = this.arianeService.getPlaylistName();
|
|
||||||
this.updateEditShow();
|
|
||||||
});
|
|
||||||
this.arianeService.artistChange.subscribe((artistId) => {
|
|
||||||
this.arianeArtistId = artistId;
|
|
||||||
this.arianeArtistName = this.arianeService.getArtistName();
|
|
||||||
this.updateEditShow();
|
|
||||||
});
|
|
||||||
this.arianeService.albumChange.subscribe((albumId) => {
|
|
||||||
this.arianeAlbumId = albumId;
|
|
||||||
this.arianeAlbumName = this.arianeService.getAlbumName();
|
|
||||||
this.updateEditShow();
|
|
||||||
});
|
|
||||||
this.arianeService.trackChange.subscribe((trackId) => {
|
|
||||||
this.arianeTrackId = trackId;
|
|
||||||
this.arianeTrackName = this.arianeService.getTrackName();
|
|
||||||
this.updateEditShow();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private updateIsJusteLogged(): void {
|
|
||||||
this.login = this.sessionService.getLogin();
|
|
||||||
this.avatar = this.sessionService.getAvatar();
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
console.log(` login:${this.sessionService.getLogin()}`);
|
|
||||||
console.log(` avatar:${this.avatar}`);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
onAvatar(): void {
|
|
||||||
console.log(`onAvatar() ${ this.displayUserMenu}`);
|
|
||||||
this.displayUserMenu = !this.displayUserMenu;
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
onHome(event: any): void {
|
|
||||||
console.log('onHome()');
|
|
||||||
this.router.navigate([ 'home' ]);
|
|
||||||
}
|
|
||||||
|
|
||||||
onSignIn(event: any): void {
|
|
||||||
console.log('onSignIn()');
|
|
||||||
this.ssoService.requestSignIn();
|
|
||||||
}
|
|
||||||
|
|
||||||
onSignUp(event: any): void {
|
|
||||||
console.log('onSignIn()');
|
|
||||||
this.ssoService.requestSignUp();
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onLogout(event: any): void {
|
|
||||||
console.log('onLogout()');
|
|
||||||
this.ssoService.requestSignOut();
|
|
||||||
this.userService.logOut();
|
|
||||||
this.router.navigate(['home']);
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
onSetting(event: any): void {
|
|
||||||
console.log('onSetting()');
|
|
||||||
this.router.navigate([ 'settings' ]);
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onHelp(event: any): void {
|
|
||||||
console.log('onHelp()');
|
|
||||||
this.router.navigate([ 'help' ]);
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onOutUserProperty(): void {
|
|
||||||
console.log('onOutUserProperty ==> event...');
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
onArianeType(event: any): void {
|
|
||||||
console.log(`onArianeType(${ this.arianeTypeId })`);
|
|
||||||
//this.arianeService.navigateType(this.arianeTypeId, event.which === 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
onArianePlaylist(event: any): void {
|
|
||||||
console.log(`onArianePlaylist(${ this.arianePlaylistId })`);
|
|
||||||
//this.arianeService.navigatePlaylist(this.arianePlaylistId, event.which === 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
onArianeArtist(event: any): void {
|
|
||||||
console.log(`onArianeArtist(${ this.arianeArtistId })`);
|
|
||||||
this.arianeService.navigateArtist( {artistId: this.arianeArtistId, newWindows: event.which === 2 } );
|
|
||||||
}
|
|
||||||
|
|
||||||
onArianeAlbum(event: any): void {
|
|
||||||
console.log(`onArianeAlbum(${ this.arianeAlbumId })`);
|
|
||||||
//this.arianeService.navigateAlbum(this.arianeAlbumId, event.which === 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
updateEditShow():void {
|
|
||||||
this.editShow = /* this.arianeTypeId !== null
|
|
||||||
|| this.arianePlaylistId !== null
|
|
||||||
||*/ this.arianeArtistId !== null ||
|
|
||||||
this.arianeAlbumId !== null ||
|
|
||||||
this.arianeTrackId !== null;
|
|
||||||
}
|
|
||||||
onEdit(): void {
|
|
||||||
console.log('onEdit()');
|
|
||||||
this.displayEditMenu = !this.displayEditMenu;
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
}
|
|
||||||
onSubEditTrack(event: any): void {
|
|
||||||
console.log('onSubEdit()');
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
//this.arianeService.navigateTrackEdit(this.arianeTrackId, event.which === 2);
|
|
||||||
}
|
|
||||||
onSubEditAlbum(event: any): void {
|
|
||||||
console.log('onSubEdit()');
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
//this.arianeService.navigateAlbumEdit(this.arianeAlbumId, event.which === 2);
|
|
||||||
}
|
|
||||||
onSubEditArtist(event: any): void {
|
|
||||||
console.log('onSubEdit()');
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
//this.arianeService.navigateArtistEdit(this.arianeArtistId, event.which === 2);
|
|
||||||
}
|
|
||||||
onSubEditPlaylist(event: any): void {
|
|
||||||
console.log('onSubEdit()');
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
//this.arianeService.navigatePlaylistEdit(this.arianePlaylistId, event.which === 2);
|
|
||||||
}
|
|
||||||
onSubEditType(event: any): void {
|
|
||||||
console.log('onSubEditType()');
|
|
||||||
this.displayEditMenu = false;
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
//this.arianeService.navigateTypeEdit(this.arianeTypeId, event.which === 2);
|
|
||||||
}
|
|
||||||
onAddMedia(event: any): void {
|
|
||||||
console.log('onAddMedia()');
|
|
||||||
this.router.navigate([ 'upload' ]);
|
|
||||||
this.displayUserMenu = false;
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,14 +5,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { AlbumService , ArianeService, DataService} from 'app/service';
|
import { AlbumService , ArianeService, DataService} from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
|
|
||||||
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
||||||
import { PopInService } from 'common/service';
|
import { PopInService } from 'common/service';
|
||||||
import { isNumberFinite } from 'common/utils';
|
|
||||||
|
|
||||||
export interface ElementList {
|
export interface ElementList {
|
||||||
value: number;
|
value: number;
|
||||||
@ -68,7 +66,6 @@ export class AlbumEditScene implements OnInit {
|
|||||||
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private arianeService: ArianeService,
|
private arianeService: ArianeService,
|
||||||
private popInService: PopInService,
|
private popInService: PopInService,
|
||||||
@ -77,7 +74,6 @@ export class AlbumEditScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
this.idAlbum = this.arianeService.getAlbumId();
|
this.idAlbum = this.arianeService.getAlbumId();
|
||||||
let self = this;
|
let self = this;
|
||||||
this.albumService.get(this.idAlbum)
|
this.albumService.get(this.idAlbum)
|
||||||
|
@ -5,12 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
import { Media } from 'app/model';
|
import { Media } from 'app/model';
|
||||||
import { AlbumModel, isAlbumModel } from 'app/model/album';
|
|
||||||
|
|
||||||
import { ArtistService, DataService, ArianeService, AlbumService, TrackService, PlayerService } from 'app/service';
|
import { ArtistService, DataService, ArianeService, AlbumService, TrackService, PlayerService } from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-album',
|
selector: 'app-album',
|
||||||
@ -31,7 +28,6 @@
|
|||||||
public tracks: Media[] = undefined;
|
public tracks: Media[] = undefined;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private trackService: TrackService,
|
private trackService: TrackService,
|
||||||
@ -42,7 +38,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
||||||
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
||||||
this.idArtist = this.arianeService.getArtistId();
|
this.idArtist = this.arianeService.getArtistId();
|
||||||
@ -75,7 +70,7 @@
|
|||||||
this.trackService.getWithAlbum(self.idAlbum)
|
this.trackService.getWithAlbum(self.idAlbum)
|
||||||
.then((response2: Media[]) => {
|
.then((response2: Media[]) => {
|
||||||
self.tracks = response2;
|
self.tracks = response2;
|
||||||
console.log(`>>>>BBB get tracks : ${JSON.stringify(response2, null, 2)}`);
|
//console.log(`>>>>BBB get tracks : ${JSON.stringify(response2, null, 2)}`);
|
||||||
}).catch((response) => {
|
}).catch((response) => {
|
||||||
//console.log(`>>>>BBB plop`);
|
//console.log(`>>>>BBB plop`);
|
||||||
self.tracks = undefined;
|
self.tracks = undefined;
|
||||||
@ -92,9 +87,9 @@
|
|||||||
let valuePlayed: number = undefined;
|
let valuePlayed: number = undefined;
|
||||||
for (let iii=0; iii< this.tracks.length; iii++) {
|
for (let iii=0; iii< this.tracks.length; iii++) {
|
||||||
elements.push(this.tracks[iii].id);
|
elements.push(this.tracks[iii].id);
|
||||||
console.log(`plop: ${this.tracks[iii].id} == ${idSelected} ==> ${this.tracks[iii].name}`);
|
//console.log(`plop: ${this.tracks[iii].id} == ${idSelected} ==> ${this.tracks[iii].name}`);
|
||||||
if (this.tracks[iii].id == idSelected) {
|
if (this.tracks[iii].id == idSelected) {
|
||||||
console.log(` ==> find`);
|
//console.log(` ==> find`);
|
||||||
valuePlayed = iii;
|
valuePlayed = iii;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { ArtistService, DataService, ArianeService, AlbumService, PlayerService, TrackService } from 'app/service';
|
import { ArtistService, DataService, ArianeService, AlbumService, PlayerService, TrackService } from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
import { isNullOrUndefined } from 'common/utils';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-albums',
|
selector: 'app-albums',
|
||||||
@ -27,7 +25,6 @@
|
|||||||
getArtistsString: (id: number) => Promise<String[]>;
|
getArtistsString: (id: number) => Promise<String[]>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private arianeService: ArianeService,
|
private arianeService: ArianeService,
|
||||||
@ -42,13 +39,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
getArtistsStringCallback(albumId: number) : Promise<String[]> {
|
getArtistsStringCallback(albumId: number) : Promise<String[]> {
|
||||||
console.log(`request all artist for album: {albumId}`)
|
//console.log(`request all artist for album: {albumId}`)
|
||||||
return this.albumService.getArtists(albumId);
|
return this.albumService.getArtists(albumId);
|
||||||
}
|
}
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.getArtistsString = (id:number) => {return self.getArtistsStringCallback(id);};
|
this.getArtistsString = (id:number) => {return self.getArtistsStringCallback(id);};
|
||||||
this.countTrack = (id:number) => {return self.countTrackCallback(id);};
|
this.countTrack = (id:number) => {return self.countTrackCallback(id);};
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
let self = this;
|
let self = this;
|
||||||
self.name = "All Albums";
|
self.name = "All Albums";
|
||||||
self.description = "View all albums (no specific artist)";
|
self.description = "View all albums (no specific artist)";
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { ArtistService, DataService, GenderService, ArianeService } from 'app/service';
|
import { ArtistService, DataService, GenderService, ArianeService } from 'app/service';
|
||||||
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
||||||
@ -74,8 +73,7 @@ export class ArtistEditScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private dataService: DataService,
|
||||||
private dataService: DataService,
|
|
||||||
private typeService: GenderService,
|
private typeService: GenderService,
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private arianeService: ArianeService,
|
private arianeService: ArianeService,
|
||||||
@ -84,7 +82,6 @@ export class ArtistEditScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
this.idArtist = this.arianeService.getArtistId();
|
this.idArtist = this.arianeService.getArtistId();
|
||||||
let self = this;
|
let self = this;
|
||||||
this.listType = [ { value: null, label: '---' } ];
|
this.listType = [ { value: null, label: '---' } ];
|
||||||
|
@ -5,12 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
import { Media } from 'app/model';
|
import { Media } from 'app/model';
|
||||||
import { AlbumModel, isAlbumModel } from 'app/model/album';
|
|
||||||
|
|
||||||
import { ArtistService, DataService, ArianeService, AlbumService, TrackService, PlayerService } from 'app/service';
|
import { ArtistService, DataService, ArianeService, AlbumService, TrackService, PlayerService } from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-artist-album',
|
selector: 'app-artist-album',
|
||||||
@ -31,7 +28,6 @@ export class ArtistAlbumScene implements OnInit {
|
|||||||
public tracks: Media[] = undefined;
|
public tracks: Media[] = undefined;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private trackService: TrackService,
|
private trackService: TrackService,
|
||||||
@ -42,7 +38,6 @@ export class ArtistAlbumScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
||||||
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
||||||
this.idArtist = this.arianeService.getArtistId();
|
this.idArtist = this.arianeService.getArtistId();
|
||||||
@ -75,7 +70,7 @@ export class ArtistAlbumScene implements OnInit {
|
|||||||
this.trackService.getWithAlbum(self.idAlbum)
|
this.trackService.getWithAlbum(self.idAlbum)
|
||||||
.then((response2: Media[]) => {
|
.then((response2: Media[]) => {
|
||||||
self.tracks = response2;
|
self.tracks = response2;
|
||||||
console.log(`>>>>BBB get tracks : ${JSON.stringify(response2, null, 2)}`);
|
//console.log(`>>>>BBB get tracks : ${JSON.stringify(response2, null, 2)}`);
|
||||||
}).catch((response) => {
|
}).catch((response) => {
|
||||||
//console.log(`>>>>BBB plop`);
|
//console.log(`>>>>BBB plop`);
|
||||||
self.tracks = undefined;
|
self.tracks = undefined;
|
||||||
@ -92,9 +87,9 @@ export class ArtistAlbumScene implements OnInit {
|
|||||||
let valuePlayed: number = undefined;
|
let valuePlayed: number = undefined;
|
||||||
for (let iii=0; iii< this.tracks.length; iii++) {
|
for (let iii=0; iii< this.tracks.length; iii++) {
|
||||||
elements.push(this.tracks[iii].id);
|
elements.push(this.tracks[iii].id);
|
||||||
console.log(`plop: ${this.tracks[iii].id} == ${idSelected} ==> ${this.tracks[iii].name}`);
|
//console.log(`plop: ${this.tracks[iii].id} == ${idSelected} ==> ${this.tracks[iii].name}`);
|
||||||
if (this.tracks[iii].id == idSelected) {
|
if (this.tracks[iii].id == idSelected) {
|
||||||
console.log(` ==> find`);
|
//console.log(` ==> find`);
|
||||||
valuePlayed = iii;
|
valuePlayed = iii;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { ArtistService, DataService, ArianeService, AlbumService, PlayerService } from 'app/service';
|
import { ArtistService, DataService, ArianeService, AlbumService, PlayerService } from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
import { isNullOrUndefined } from 'common/utils';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-artist',
|
selector: 'app-artist',
|
||||||
@ -27,7 +25,6 @@ export class ArtistScene implements OnInit {
|
|||||||
countTrack: (id: number) => Promise<Number>;
|
countTrack: (id: number) => Promise<Number>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private playerService: PlayerService,
|
private playerService: PlayerService,
|
||||||
@ -42,7 +39,6 @@ export class ArtistScene implements OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.countTrack = (id:number) => {return self.countTrackCallback(id);};
|
this.countTrack = (id:number) => {return self.countTrackCallback(id);};
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
||||||
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
||||||
this.idArtist = this.arianeService.getArtistId();
|
this.idArtist = this.arianeService.getArtistId();
|
||||||
|
@ -5,11 +5,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { ArtistService, DataService, ArianeService, AlbumService, TrackService, PlayerService } from 'app/service';
|
import { ArtistService, ArianeService, AlbumService, TrackService, PlayerService } from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
import { isNullOrUndefined } from 'common/utils';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-artists',
|
selector: 'app-artists',
|
||||||
@ -26,7 +24,6 @@ export class ArtistsScene implements OnInit {
|
|||||||
countAlbum: (id: number) => Promise<Number>;
|
countAlbum: (id: number) => Promise<Number>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private trackService: TrackService,
|
private trackService: TrackService,
|
||||||
@ -39,7 +36,6 @@ export class ArtistsScene implements OnInit {
|
|||||||
let self = this;
|
let self = this;
|
||||||
this.countTrack = (id:number) => {return self.countTrackCallback(id);};
|
this.countTrack = (id:number) => {return self.countTrackCallback(id);};
|
||||||
this.countAlbum = (id:number) => {return self.countAlbumCallback(id);};
|
this.countAlbum = (id:number) => {return self.countAlbumCallback(id);};
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
// this.idPlaylist = parseInt(this.route.snapshot.paramMap.get('universId'));
|
||||||
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
// this.idType = parseInt(this.route.snapshot.paramMap.get('typeId'));
|
||||||
this.artistService.getOrder()
|
this.artistService.getOrder()
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
import { ArianeService } from '../../service/ariane';
|
import { ArianeService } from '../../service/ariane';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
@ -14,11 +13,9 @@ import { ArianeService } from '../../service/ariane';
|
|||||||
styleUrls: [ './error-viewer.less' ]
|
styleUrls: [ './error-viewer.less' ]
|
||||||
})
|
})
|
||||||
export class ErrorViewerScene implements OnInit {
|
export class ErrorViewerScene implements OnInit {
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private arianeService: ArianeService) { }
|
||||||
private arianeService: ArianeService) { }
|
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { GenderService, DataService, ArianeService } from 'app/service';
|
import { GenderService, DataService, ArianeService } from 'app/service';
|
||||||
|
|
||||||
@ -26,7 +25,6 @@ export class GenderScene implements OnInit {
|
|||||||
tracksError = '';
|
tracksError = '';
|
||||||
tracks = [];
|
tracks = [];
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private genderService: GenderService,
|
private genderService: GenderService,
|
||||||
private arianeService: ArianeService,
|
private arianeService: ArianeService,
|
||||||
private dataService: DataService) {
|
private dataService: DataService) {
|
||||||
@ -34,7 +32,6 @@ export class GenderScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
this.genderId = this.arianeService.getTypeId();
|
this.genderId = this.arianeService.getTypeId();
|
||||||
let self = this;
|
let self = this;
|
||||||
console.log(`get gender global id: ${ this.genderId}`);
|
console.log(`get gender global id: ${ this.genderId}`);
|
||||||
|
@ -20,7 +20,6 @@ export class HelpScene implements OnInit {
|
|||||||
private arianeService: ArianeService) { }
|
private arianeService: ArianeService) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
const page = this.route.snapshot.paramMap.get('page');
|
const page = this.route.snapshot.paramMap.get('page');
|
||||||
if (page == null) {
|
if (page == null) {
|
||||||
this.page = undefined;
|
this.page = undefined;
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { ArianeService, GenderService } from 'app/service';
|
import { ArianeService, GenderService } from 'app/service';
|
||||||
|
|
||||||
@ -34,14 +33,11 @@ export class HomeScene implements OnInit {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
error = '';
|
error = '';
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private arianeService: ArianeService) {
|
||||||
private genderService: GenderService,
|
|
||||||
private arianeService: ArianeService) {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
let self = this;
|
let self = this;
|
||||||
/*
|
/*
|
||||||
this.genderService.getData()
|
this.genderService.getData()
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { Router, ActivatedRoute } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
|
|
||||||
import { ArianeService } from 'app/service/ariane';
|
import { ArianeService } from 'app/service/ariane';
|
||||||
import { environment } from 'environments/environment';
|
import { environment } from 'environments/environment';
|
||||||
@ -20,14 +20,12 @@ export class PlaylistScene implements OnInit {
|
|||||||
playlistId = -1;
|
playlistId = -1;
|
||||||
tracksError = '';
|
tracksError = '';
|
||||||
tracks = [];
|
tracks = [];
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private router: Router,
|
||||||
private router: Router,
|
|
||||||
private arianeService: ArianeService) {
|
private arianeService: ArianeService) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
this.playlistId = this.arianeService.getPlaylistId();
|
this.playlistId = this.arianeService.getPlaylistId();
|
||||||
console.log(`get parameter id: ${ this.playlistId}`);
|
console.log(`get parameter id: ${ this.playlistId}`);
|
||||||
|
|
||||||
|
@ -5,8 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ArianeService } from 'app/service';
|
||||||
import { ArianeService, DataService } from 'app/service';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-settings',
|
selector: 'app-settings',
|
||||||
@ -17,19 +16,11 @@ export class SettingsScene implements OnInit {
|
|||||||
page = '';
|
page = '';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private arianeService: ArianeService) {
|
private arianeService: ArianeService) {
|
||||||
// nothing to do.
|
// nothing to do.
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
const page = this.route.snapshot.paramMap.get('page');
|
|
||||||
if (page == null) {
|
|
||||||
this.page = undefined;
|
|
||||||
} else {
|
|
||||||
this.page = page;
|
|
||||||
}
|
|
||||||
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
|
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
|
||||||
console.error(`get parameter update: ${this.page}`);
|
console.error(`get parameter update: ${this.page}`);
|
||||||
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
|
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
|
||||||
|
@ -5,12 +5,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
|
|
||||||
import { DataService, GenderService, ArtistService, TrackService, ArianeService, AlbumService } from 'app/service';
|
import { DataService, GenderService, ArtistService, TrackService, ArianeService, AlbumService } from 'app/service';
|
||||||
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
||||||
import { NodeData } from 'common/model';
|
|
||||||
import { PopInService } from 'common/service';
|
import { PopInService } from 'common/service';
|
||||||
import { Media } from 'app/model';
|
import { Media } from 'app/model';
|
||||||
import { isNullOrUndefined } from 'common/utils';
|
import { isNullOrUndefined } from 'common/utils';
|
||||||
@ -99,7 +97,6 @@ export class TrackEditScene implements OnInit {
|
|||||||
{ value: undefined, label: '---' },
|
{ value: undefined, label: '---' },
|
||||||
];
|
];
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
|
||||||
private genderService: GenderService,
|
private genderService: GenderService,
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
@ -134,7 +131,6 @@ export class TrackEditScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
this.idTrack = this.arianeService.getTrackId();
|
this.idTrack = this.arianeService.getTrackId();
|
||||||
let self = this;
|
let self = this;
|
||||||
this.listGender = [ { value: null, label: '---' } ];
|
this.listGender = [ { value: null, label: '---' } ];
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
|
import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
import { DataService, TrackService, ArtistService, AlbumService, ArianeService } from 'app/service';
|
import { DataService, TrackService, ArtistService, AlbumService, ArianeService } from 'app/service';
|
||||||
import { HttpWrapperService } from 'common/service';
|
import { HttpWrapperService } from 'common/service';
|
||||||
import { isNullOrUndefined } from 'common/utils';
|
import { isNullOrUndefined } from 'common/utils';
|
||||||
@ -73,8 +72,7 @@ export class TrackScene implements OnInit {
|
|||||||
displayNeedHide:boolean = false;
|
displayNeedHide:boolean = false;
|
||||||
timeLeft: number = 10;
|
timeLeft: number = 10;
|
||||||
interval = null;
|
interval = null;
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private trackService: TrackService,
|
||||||
private trackService: TrackService,
|
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private httpService: HttpWrapperService,
|
private httpService: HttpWrapperService,
|
||||||
@ -190,7 +188,6 @@ export class TrackScene implements OnInit {
|
|||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
let self = this;
|
let self = this;
|
||||||
this.startHideTimer();
|
this.startHideTimer();
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
this.idTrack = this.arianeService.getTrackId();
|
this.idTrack = this.arianeService.getTrackId();
|
||||||
this.arianeService.trackChange.subscribe((trackId) => {
|
this.arianeService.trackChange.subscribe((trackId) => {
|
||||||
console.log(`Detect trackId change...${ trackId}`);
|
console.log(`Detect trackId change...${ trackId}`);
|
||||||
|
@ -5,9 +5,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
|
||||||
|
|
||||||
import { GenderService, PlaylistService, ArtistService, TrackService, ArianeService, AlbumService } from 'app/service';
|
import { GenderService, ArtistService, TrackService, ArianeService, AlbumService } from 'app/service';
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
import { UploadProgress } from 'common/popin/upload-progress/upload-progress';
|
||||||
import { PopInService } from 'common/service';
|
import { PopInService } from 'common/service';
|
||||||
@ -95,7 +94,7 @@ export class UploadScene implements OnInit {
|
|||||||
globalGender: string = null;
|
globalGender: string = null;
|
||||||
globalArtist: string = null;
|
globalArtist: string = null;
|
||||||
globalAlbum: string = null;
|
globalAlbum: string = null;
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(
|
||||||
private genderService: GenderService,
|
private genderService: GenderService,
|
||||||
private artistService: ArtistService,
|
private artistService: ArtistService,
|
||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
@ -125,7 +124,6 @@ export class UploadScene implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
let self = this;
|
let self = this;
|
||||||
this.listGender = [ { value: null, label: '---' } ];
|
this.listGender = [ { value: null, label: '---' } ];
|
||||||
this.listArtist = [ { value: null, label: '---' } ];
|
this.listArtist = [ { value: null, label: '---' } ];
|
||||||
|
@ -5,7 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { AlbumModel } from 'app/model/album';
|
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
|
|
||||||
import { HttpWrapperService, BddService } from 'common/service';
|
import { HttpWrapperService, BddService } from 'common/service';
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
import { Injectable, Output, EventEmitter } from '@angular/core';
|
import { Injectable, Output, EventEmitter } from '@angular/core';
|
||||||
|
|
||||||
import { Router } from '@angular/router';
|
import { NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
|
||||||
|
|
||||||
import { GenderService } from './gender';
|
import { GenderService } from './gender';
|
||||||
import { PlaylistService } from './playlist';
|
import { PlaylistService } from './playlist';
|
||||||
@ -15,38 +15,43 @@ import { AlbumService } from './album';
|
|||||||
import { TrackService } from './track';
|
import { TrackService } from './track';
|
||||||
import { environment } from 'environments/environment';
|
import { environment } from 'environments/environment';
|
||||||
import { NodeData } from 'common/model';
|
import { NodeData } from 'common/model';
|
||||||
import { isNullOrUndefined, isUndefined } from 'common/utils';
|
import { isNullOrUndefined, isStringNullOrUndefined, isUndefined } from 'common/utils';
|
||||||
|
|
||||||
export class InputOrders {
|
export class InputOrders {
|
||||||
public genderId: number = null;
|
public genderId: number = undefined;
|
||||||
public playlistId: number = null;
|
public playlistId: number = undefined;
|
||||||
public artistId: number = null;
|
public artistId: number = undefined;
|
||||||
public albumId: number = null;
|
public albumId: number = undefined;
|
||||||
public trackId: number = null;
|
public trackId: number = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ArianeService {
|
export class ArianeService {
|
||||||
public genderId: number = null;
|
public genderId: number = undefined;
|
||||||
public typeName: string = null;
|
public typeName: string = undefined;
|
||||||
@Output() typeChange: EventEmitter<number> = new EventEmitter();
|
@Output() typeChange: EventEmitter<number> = new EventEmitter();
|
||||||
|
|
||||||
public playlistId: number = null;
|
public playlistId: number = undefined;
|
||||||
public playlistName: string = null;
|
public playlistName: string = undefined;
|
||||||
@Output() playlistChange: EventEmitter<number> = new EventEmitter();
|
@Output() playlistChange: EventEmitter<number> = new EventEmitter();
|
||||||
|
|
||||||
public artistId: number = null;
|
public artistId: number = undefined;
|
||||||
public artistName: string = null;
|
public artistName: string = undefined;
|
||||||
@Output() artistChange: EventEmitter<number> = new EventEmitter();
|
@Output() artistChange: EventEmitter<number> = new EventEmitter();
|
||||||
|
|
||||||
public albumId: number = null;
|
public albumId: number = undefined;
|
||||||
public albumName: string = null;
|
public albumName: string = undefined;
|
||||||
@Output() albumChange: EventEmitter<number> = new EventEmitter();
|
@Output() albumChange: EventEmitter<number> = new EventEmitter();
|
||||||
|
|
||||||
public trackId: number = null;
|
public trackId: number = undefined;
|
||||||
public trackName: string = null;
|
public trackName: string = undefined;
|
||||||
@Output() trackChange: EventEmitter<number> = new EventEmitter();
|
@Output() trackChange: EventEmitter<number> = new EventEmitter();
|
||||||
|
|
||||||
|
@Output() update: EventEmitter<InputOrders> = new EventEmitter();
|
||||||
|
|
||||||
|
public segment: string = "";
|
||||||
|
@Output() segmentChange: EventEmitter<string> = new EventEmitter();
|
||||||
|
|
||||||
constructor(private router: Router,
|
constructor(private router: Router,
|
||||||
private typeService: GenderService,
|
private typeService: GenderService,
|
||||||
private playlistService: PlaylistService,
|
private playlistService: PlaylistService,
|
||||||
@ -54,125 +59,113 @@ export class ArianeService {
|
|||||||
private albumService: AlbumService,
|
private albumService: AlbumService,
|
||||||
private trackService: TrackService) {
|
private trackService: TrackService) {
|
||||||
//console.log('Start ArianeService');
|
//console.log('Start ArianeService');
|
||||||
}
|
//this.route.
|
||||||
updateParams(params) {
|
let self = this;
|
||||||
console.log(`sparams ${ params}`);
|
this.router.events.subscribe((event: any) => {
|
||||||
console.log(`sparams['genderId'] ${ params.genderId}`);
|
if (event instanceof NavigationStart) {
|
||||||
if(params.genderId) {
|
// Show progress spinner or progress bar
|
||||||
this.setType(params.genderId);
|
//console.log('>>>>>>>>>>>>>> Route change detected');
|
||||||
} else {
|
|
||||||
this.setType(null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
updateManual(params) {
|
if (event instanceof NavigationEnd) {
|
||||||
let genderId = params.get('genderId');
|
// Hide progress spinner or progress bar
|
||||||
if(genderId === null || genderId === undefined || genderId === 'null' || genderId === 'NULL' || genderId === '') {
|
//this.currentRoute = event.url;
|
||||||
genderId = null;
|
//console.log(`>>>>>>>>>>>> ${event}`);
|
||||||
} else {
|
self.updateProperties();
|
||||||
genderId = parseInt(genderId, 10);
|
|
||||||
}
|
}
|
||||||
console.log(`genderId = ${ genderId } ${ params.get('genderId')}`);
|
|
||||||
|
|
||||||
let playlistId = params.get('playlistId');
|
if (event instanceof NavigationError) {
|
||||||
if(playlistId === null || playlistId === undefined || playlistId === 'null' || playlistId === 'NULL' || playlistId === '') {
|
// Hide progress spinner or progress bar
|
||||||
playlistId = null;
|
|
||||||
} else {
|
|
||||||
playlistId = parseInt(playlistId, 10);
|
|
||||||
}
|
|
||||||
console.log(`playlistId = ${ playlistId } ${ params.get('universId')}`);
|
|
||||||
|
|
||||||
let artistId = params.get('artistId');
|
// Present error to user
|
||||||
if(artistId === null || artistId === undefined || artistId === 'null' || artistId === 'NULL' || artistId === '') {
|
//console.log(`<<<<<<<<<<<<< ${event.error}`);
|
||||||
artistId = null;
|
|
||||||
} else {
|
|
||||||
artistId = parseInt(artistId, 10);
|
|
||||||
}
|
}
|
||||||
console.log(`artistId = ${ artistId } ${ params.get('artistId')}`);
|
|
||||||
|
|
||||||
let albumId = params.get('albumId');
|
});
|
||||||
if(albumId === null || albumId === undefined || albumId === 'null' || albumId === 'NULL' || albumId === '') {
|
|
||||||
albumId = null;
|
|
||||||
} else {
|
|
||||||
albumId = parseInt(albumId, 10);
|
|
||||||
}
|
|
||||||
console.log(`albumId = ${ albumId } ${ params.get('albumId')}`);
|
|
||||||
|
|
||||||
let trackId = params.get('trackId');
|
|
||||||
if(trackId === null || trackId === undefined || trackId === 'null' || trackId === 'NULL' || trackId === '') {
|
|
||||||
trackId = null;
|
|
||||||
} else {
|
|
||||||
trackId = parseInt(trackId, 10);
|
|
||||||
}
|
}
|
||||||
console.log(`trackId = ${ trackId } ${ params.get('trackId')}`);
|
|
||||||
|
getCurrrentSegment(): string|undefined {
|
||||||
|
return this.segment;
|
||||||
|
}
|
||||||
|
|
||||||
|
getIsParam(params: any, name: string): undefined|number {
|
||||||
|
let valueStr = params.get(name);
|
||||||
|
if(isNullOrUndefined(valueStr) || isStringNullOrUndefined(valueStr)) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
return parseInt(valueStr, 10);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
updateProperties() {
|
||||||
|
let elem = this.router.routerState.root;
|
||||||
|
while (!isNullOrUndefined(elem.firstChild)) {
|
||||||
|
elem = elem.firstChild;
|
||||||
|
}
|
||||||
|
//console.log(`!!!!!!!!!!!!!!!!!!!!!!!!!! ${JSON.stringify(elem.snapshot.paramMap)}`);
|
||||||
|
let params = elem.snapshot.paramMap;
|
||||||
|
let segment: string[] = location.pathname.split("/");
|
||||||
|
while (segment.length > 1 && (segment[0] === "" || segment[0] === environment.applName)) {
|
||||||
|
segment = segment.slice(1);
|
||||||
|
}
|
||||||
|
if (segment.length > 0) {
|
||||||
|
if (this.segment !== segment[0]) {
|
||||||
|
this.segment = segment[0];
|
||||||
|
this.segmentChange.emit(this.segment)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.segment !== "") {
|
||||||
|
this.segment = "";
|
||||||
|
this.segmentChange.emit(this.segment)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(`segment: ${JSON.stringify(this.segment)}`);
|
||||||
|
console.log(`params: ${JSON.stringify(params)}`);
|
||||||
|
let genderId = this.getIsParam(params, 'genderId');
|
||||||
|
let playlistId = this.getIsParam(params, 'playlistId');
|
||||||
|
let artistId = this.getIsParam(params, 'artistId');
|
||||||
|
let albumId = this.getIsParam(params, 'albumId');
|
||||||
|
let trackId = this.getIsParam(params, 'trackId');
|
||||||
|
|
||||||
this.setType(genderId);
|
this.setType(genderId);
|
||||||
this.setPlaylist(playlistId);
|
this.setPlaylist(playlistId);
|
||||||
this.setArtist(artistId);
|
this.setArtist(artistId);
|
||||||
this.setAlbum(albumId);
|
this.setAlbum(albumId);
|
||||||
this.setTrack(trackId);
|
this.setTrack(trackId);
|
||||||
|
this.update.emit({
|
||||||
|
genderId: this.genderId,
|
||||||
|
playlistId: this.playlistId,
|
||||||
|
artistId: this.artistId,
|
||||||
|
albumId: this.albumId,
|
||||||
|
trackId: this.trackId,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
reset():void {
|
reset():void {
|
||||||
this.genderId = null;
|
this.genderId = undefined;
|
||||||
this.typeName = null;
|
this.typeName = undefined;
|
||||||
this.typeChange.emit(this.genderId);
|
this.typeChange.emit(this.genderId);
|
||||||
this.playlistId = null;
|
this.playlistId = undefined;
|
||||||
this.playlistName = null;
|
this.playlistName = undefined;
|
||||||
this.playlistChange.emit(this.playlistId);
|
this.playlistChange.emit(this.playlistId);
|
||||||
this.artistId = null;
|
this.artistId = undefined;
|
||||||
this.artistName = null;
|
this.artistName = undefined;
|
||||||
this.artistChange.emit(this.artistId);
|
this.artistChange.emit(this.artistId);
|
||||||
this.albumId = null;
|
this.albumId = undefined;
|
||||||
this.albumName = null;
|
this.albumName = undefined;
|
||||||
this.albumChange.emit(this.albumId);
|
this.albumChange.emit(this.albumId);
|
||||||
this.trackId = null;
|
this.trackId = undefined;
|
||||||
this.trackName = null;
|
this.trackName = undefined;
|
||||||
this.trackChange.emit(this.trackId);
|
this.trackChange.emit(this.trackId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
getCurrentRoute():InputOrders {
|
|
||||||
let out = new InputOrders()
|
|
||||||
out.genderId = parseInt(this.route.snapshot.paramMap.get('genderId'));
|
|
||||||
if (out.genderId === 0){
|
|
||||||
out.genderId = undefined;
|
|
||||||
}
|
|
||||||
out.playlistId = parseInt(this.route.snapshot.paramMap.get('universId'));
|
|
||||||
if (out.playlistId === 0){
|
|
||||||
out.playlistId = undefined;
|
|
||||||
}
|
|
||||||
out.artistId = parseInt(this.route.snapshot.paramMap.get('artistId'));
|
|
||||||
if (out.artistId === 0){
|
|
||||||
out.artistId = undefined;
|
|
||||||
}
|
|
||||||
out.albumId = parseInt(this.route.snapshot.paramMap.get('albumId'));
|
|
||||||
if (out.albumId === 0){
|
|
||||||
out.albumId = undefined;
|
|
||||||
}
|
|
||||||
out.trackId = parseInt(this.route.snapshot.paramMap.get('trackId'));
|
|
||||||
if (out.trackId === 0){
|
|
||||||
out.trackId = undefined;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
routeTo(data:InputOrders, destination:string = null) {
|
|
||||||
routeTo = ""
|
|
||||||
//if (
|
|
||||||
this.router.navigate(['/type/' + this.genderId + '/artist/' + this.idArtist + '/album/' + IdSelected ]);
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
setType(id:number):void {
|
setType(id:number):void {
|
||||||
if(this.genderId === id) {
|
if(this.genderId === id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(id === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.genderId = id;
|
this.genderId = id;
|
||||||
this.typeName = '??--??';
|
this.typeName = '??--??';
|
||||||
if(this.genderId === null) {
|
if(isUndefined(this.genderId)) {
|
||||||
this.typeChange.emit(this.genderId);
|
this.typeChange.emit(this.genderId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -185,23 +178,20 @@ export class ArianeService {
|
|||||||
self.typeChange.emit(self.genderId);
|
self.typeChange.emit(self.genderId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
getTypeId():number {
|
getTypeId():number|undefined {
|
||||||
return this.genderId;
|
return this.genderId;
|
||||||
}
|
}
|
||||||
getTypeName():string {
|
getTypeName():string|undefined {
|
||||||
return this.typeName;
|
return this.typeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPlaylist(id:number) {
|
setPlaylist(id:number|undefined) {
|
||||||
if(this.playlistId === id) {
|
if(this.playlistId === id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(id === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.playlistId = id;
|
this.playlistId = id;
|
||||||
this.playlistName = '??--??';
|
this.playlistName = '??--??';
|
||||||
if(this.playlistId === null) {
|
if(isUndefined(this.playlistId)) {
|
||||||
this.playlistChange.emit(this.playlistId);
|
this.playlistChange.emit(this.playlistId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -214,23 +204,20 @@ export class ArianeService {
|
|||||||
self.playlistChange.emit(self.playlistId);
|
self.playlistChange.emit(self.playlistId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
getPlaylistId():number {
|
getPlaylistId():number|undefined {
|
||||||
return this.playlistId;
|
return this.playlistId;
|
||||||
}
|
}
|
||||||
getPlaylistName():string {
|
getPlaylistName():string|undefined {
|
||||||
return this.playlistName;
|
return this.playlistName;
|
||||||
}
|
}
|
||||||
|
|
||||||
setArtist(id:number):void {
|
setArtist(id:number|undefined):void {
|
||||||
if(this.artistId === id) {
|
if(this.artistId === id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(id === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.artistId = id;
|
this.artistId = id;
|
||||||
this.artistName = '??--??';
|
this.artistName = '??--??';
|
||||||
if(this.artistId === null) {
|
if(isUndefined(this.artistId)) {
|
||||||
this.artistChange.emit(this.artistId);
|
this.artistChange.emit(this.artistId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -243,23 +230,20 @@ export class ArianeService {
|
|||||||
self.artistChange.emit(self.artistId);
|
self.artistChange.emit(self.artistId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
getArtistId():number {
|
getArtistId():number|undefined {
|
||||||
return this.artistId;
|
return this.artistId;
|
||||||
}
|
}
|
||||||
getArtistName():string {
|
getArtistName():string|undefined {
|
||||||
return this.artistName;
|
return this.artistName;
|
||||||
}
|
}
|
||||||
|
|
||||||
setAlbum(id:number):void {
|
setAlbum(id:number|undefined):void {
|
||||||
if(this.albumId === id) {
|
if(this.albumId === id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(id === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.albumId = id;
|
this.albumId = id;
|
||||||
this.albumName = '??--??';
|
this.albumName = '??--??';
|
||||||
if(this.albumId === null) {
|
if(isUndefined(this.albumId)) {
|
||||||
this.albumChange.emit(this.albumId);
|
this.albumChange.emit(this.albumId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -273,23 +257,20 @@ export class ArianeService {
|
|||||||
self.albumChange.emit(self.albumId);
|
self.albumChange.emit(self.albumId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
getAlbumId():number {
|
getAlbumId():number|undefined {
|
||||||
return this.albumId;
|
return this.albumId;
|
||||||
}
|
}
|
||||||
getAlbumName():string {
|
getAlbumName():string|undefined {
|
||||||
return this.albumName;
|
return this.albumName;
|
||||||
}
|
}
|
||||||
|
|
||||||
setTrack(id:number):void {
|
setTrack(id:number|undefined):void {
|
||||||
if(this.trackId === id) {
|
if(this.trackId === id) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if(id === undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.trackId = id;
|
this.trackId = id;
|
||||||
this.trackName = '??--??';
|
this.trackName = '??--??';
|
||||||
if(this.trackId === null) {
|
if(isUndefined(this.trackId)) {
|
||||||
this.trackChange.emit(this.trackId);
|
this.trackChange.emit(this.trackId);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -304,10 +285,10 @@ export class ArianeService {
|
|||||||
self.trackChange.emit(self.trackId);
|
self.trackChange.emit(self.trackId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
getTrackId():number {
|
getTrackId():number|undefined {
|
||||||
return this.trackId;
|
return this.trackId;
|
||||||
}
|
}
|
||||||
getTrackName():string {
|
getTrackName():string|undefined {
|
||||||
return this.trackName;
|
return this.trackName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,15 +325,15 @@ export class ArianeService {
|
|||||||
id:number,
|
id:number,
|
||||||
newWindows?:boolean,
|
newWindows?:boolean,
|
||||||
replaceCurrentPage: boolean = false): void {
|
replaceCurrentPage: boolean = false): void {
|
||||||
let addressOffset = `${destination }-edit/${ id }`;
|
let addressOffset = `${destination }/${ id }`;
|
||||||
if(!isNullOrUndefined(newWindows) && newWindows === true) {
|
if(!isNullOrUndefined(newWindows) && newWindows === true) {
|
||||||
if(isNullOrUndefined(environment.frontBaseUrl) || environment.frontBaseUrl === '') {
|
if(isNullOrUndefined(environment.frontBaseUrl) || environment.frontBaseUrl === '') {
|
||||||
window.open(`/${ addressOffset}`);
|
window.open(`/${ addressOffset}/edit`);
|
||||||
} else {
|
} else {
|
||||||
window.open(`/${ environment.frontBaseUrl }/${ addressOffset}`);
|
window.open(`/${ environment.frontBaseUrl }/${ addressOffset}/edit`);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.router.navigate([ addressOffset ], { replaceUrl: replaceCurrentPage });
|
this.router.navigate([ `${addressOffset}/edit` ], { replaceUrl: replaceCurrentPage });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ export class DataService {
|
|||||||
private serviceName:string = 'data';
|
private serviceName:string = 'data';
|
||||||
|
|
||||||
constructor(private http: HttpWrapperService) {
|
constructor(private http: HttpWrapperService) {
|
||||||
console.log('Start GenderService');
|
console.log('Start DataService');
|
||||||
}
|
}
|
||||||
|
|
||||||
getData():any {
|
getData():any {
|
||||||
|
27
front/src/assets/js_3rd_party/dateFormat.min.js
vendored
27
front/src/assets/js_3rd_party/dateFormat.min.js
vendored
@ -1,27 +0,0 @@
|
|||||||
; function dateFormat(g, c, k) {
|
|
||||||
function l(a, b) { a.setHours(a.getHours() + parseFloat(b)); return a } function m(a, b) { var c = "Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "); return b ? c[a.getDay()].substr(0, 3) : c[a.getDay()] } function n(a, b) { var c = "January February March April May June July August September October November December".split(" "); return b ? c[a.getMonth()].substr(0, 3) : c[a.getMonth()] } var d = {
|
|
||||||
d: function () { var a = this.getDate(); return 9 < a ? a : "0" + a }, D: function () { return m(this, !0) }, j: function () { return this.getDate() },
|
|
||||||
l: function () { return m(this) }, N: function () { return this.getDay() + 1 }, S: function () { var a = this.getDate(); return /^1[0-9]$/.test(a) ? "th" : /1$/.test(a) ? "st" : /2$/.test(a) ? "nd" : /3$/.test(a) ? "rd" : "th" }, w: function () { return this.getDay() }, z: function () { return Math.round(Math.abs((this.getTime() - (new Date("1/1/" + this.getFullYear())).getTime()) / 864E5)) }, W: function () { var a = new Date(this.getFullYear(), 0, 1); return Math.ceil(((this - a) / 864E5 + a.getDay() + 1) / 7) }, F: function () { return n(this) }, m: function () {
|
|
||||||
var a = this.getMonth() +
|
|
||||||
1; return 9 < a ? a : "0" + a
|
|
||||||
}, M: function () { return n(this, !0) }, n: function () { return this.getMonth() + 1 }, t: function () { return (new Date(this.getFullYear(), this.getMonth() + 1, 0)).getDate() }, L: function () { var a = this.getFullYear(); return 0 == a % 4 && 0 != a % 100 || 0 == a % 400 }, o: function () { return parseInt(this.getFullYear()) }, Y: function () { return parseInt(this.getFullYear()) }, y: function () { return parseInt((this.getFullYear() + "").substr(-2)) }, a: function () { return 12 <= this.getHours() ? "pm" : "am" }, A: function () {
|
|
||||||
return 12 <= this.getHours() ?
|
|
||||||
"PM" : "AM"
|
|
||||||
}, B: function () { return "@" + ("00" + Math.floor((60 * ((this.getHours() + 1) % 24 * 60 + this.getMinutes()) + this.getSeconds() + .001 * this.getMilliseconds()) / 86.4)).slice(-3) }, g: function () { var a = this.getHours(); return 0 == a ? 12 : 12 >= a ? a : a - 12 }, G: function () { return this.getHours() }, h: function () { var a = this.getHours(), a = 12 >= a ? a : a - 12; return 0 == a ? 12 : 9 < a ? a : "0" + a }, H: function () { var a = this.getHours(); return 9 < a ? a : "0" + a }, i: function () { var a = this.getMinutes(); return 9 < a ? a : "0" + a }, s: function () {
|
|
||||||
var a = this.getSeconds(); return 9 <
|
|
||||||
a ? a : "0" + a
|
|
||||||
}, u: function () { return this.getMilliseconds() }, e: function () { var a = this.toString().match(/ ([A-Z]{3,4})([-|+]?\d{4})/); return 1 < a.length ? a[1] : "" }, I: function () { var a = new Date(this.getFullYear(), 0, 1), b = new Date(this.getFullYear(), 6, 1), a = Math.max(a.getTimezoneOffset(), b.getTimezoneOffset()); return this.getTimezoneOffset() < a ? 1 : 0 }, O: function () { var a = this.toString().match(/ ([A-Z]{3,4})([-|+]?\d{4})/); return 2 < a.length ? a[2] : "" }, P: function () {
|
|
||||||
var a = this.toString().match(/ ([A-Z]{3,4})([-|+]?\d{4})/);
|
|
||||||
return 2 < a.length ? a[2].substr(0, 3) + ":" + a[2].substr(3, 2) : ""
|
|
||||||
}, T: function () { return this.toLocaleString("en", { timeZoneName: "short" }).split(" ").pop() }, Z: function () { return 60 * this.getTimezoneOffset() }, c: function () { return l(new Date(this), -(this.getTimezoneOffset() / 60)).toISOString() }, r: function () { return l(new Date(this), -(this.getTimezoneOffset() / 60)).toISOString() }, U: function () { return this.getTime() / 1E3 | 0 }
|
|
||||||
}, e = {
|
|
||||||
commonLogFormat: "d/M/Y:G:i:s", exif: "Y:m:d G:i:s", isoYearWeek: "Y\\WW", isoYearWeek2: "Y-\\WW",
|
|
||||||
isoYearWeekDay: "Y\\WWj", isoYearWeekDay2: "Y-\\WW-j", mySQL: "Y-m-d h:i:s", postgreSQL: "Y.z", postgreSQL2: "Yz", soap: "Y-m-d\\TH:i:s.u", soap2: "Y-m-d\\TH:i:s.uP", unixTimestamp: "@U", xmlrpc: "Ymd\\TG:i:s", xmlrpcCompact: "Ymd\\tGis", wddx: "Y-n-j\\TG:i:s"
|
|
||||||
}, h = {
|
|
||||||
AMERICAN: "F j, Y", AMERICANSHORT: "m/d/Y", AMERICANSHORTWTIME: "m/d/Y h:i:sA", ATOM: "Y-m-d\\TH:i:sP", COOKIE: "l, d-M-Y H:i:s T", EUROPEAN: "j F Y", EUROPEANSHORT: "d.m.Y", EUROPEANSHORTWTIME: "d.m.Y H:i:s", ISO8601: "Y-m-d\\TH:i:sO", LEGAL: "j F Y", RFC822: "D, d M y H:i:s O",
|
|
||||||
RFC850: "l, d-M-y H:i:s T", RFC1036: "D, d M y H:i:s O", RFC1123: "D, d M Y H:i:s O", RFC2822: "D, d M Y H:i:s O", RFC3339: "Y-m-d\\TH:i:sP", RSS: "D, d M Y H:i:s O", W3C: "Y-m-d\\TH:i:sP"
|
|
||||||
}, f = { "pretty-a": "g:i.sA l jS \\o\\f F, Y", "pretty-b": "g:iA l jS \\o\\f F, Y", "pretty-c": "n/d/Y g:iA", "pretty-d": "n/d/Y", "pretty-e": "F jS - g:ia", "pretty-f": "g:iA", "pretty-g": "F jS, Y", "pretty-h": "F jS, Y g:mA" }; if (c) {
|
|
||||||
if ("compound" == c) { if (!1 === k) return e; var d = {}, b; for (b in e) d[b] = dateFormat(g, e[b]); return d } if (e[c]) return dateFormat(g,
|
|
||||||
e[c], k); if ("constants" == c) { if (!1 === k) return h; d = {}; for (b in h) d[b] = dateFormat(g, h[b]); return d } if (h[c]) return dateFormat(g, h[c], k); if ("pretty" == c) { if (!1 === k) return f; d = {}; for (b in f) d[b] = dateFormat(g, f[b]); return d } if (f[c]) return dateFormat(g, f[c], k); e = c.split(""); h = ""; for (b in e) (f = e[b]) && /[a-z]/i.test(f) && !/\\/.test(h + f) && (e[b] = d[f] ? d[f].apply(g) : f), h = e[b]; return e.join("").replace(/\\/g, "")
|
|
||||||
} return g
|
|
||||||
};
|
|
14
front/src/common/component/index.ts
Normal file
14
front/src/common/component/index.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import { ErrorComponent } from "./error/error";
|
||||||
|
import { PopInComponent } from "./popin/popin";
|
||||||
|
import { TopMenuComponent } from "./top-menu/top-menu";
|
||||||
|
import { UploadFileComponent } from "./upload-file/upload-file";
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
PopInComponent,
|
||||||
|
TopMenuComponent,
|
||||||
|
UploadFileComponent,
|
||||||
|
ErrorComponent,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
|||||||
<div class="top">
|
<div class="top">
|
||||||
<div id="main-menu" class="main-menu color-menu-background">
|
<div id="main-menu" class="main-menu color-menu-background">
|
||||||
<div *ngFor="let data of menu">
|
<div *ngFor="let data of menu">
|
||||||
<button class="item"
|
<div class="inert_element"
|
||||||
(click)="onGeneric(data, $event)"
|
*ngIf="isNotButton(data)"
|
||||||
(auxclick)="onGeneric(data, $event)"
|
|
||||||
[ngStyle]="{'float': data.position}"
|
[ngStyle]="{'float': data.position}"
|
||||||
[disable]="false">
|
[ngClass]="getClassModel(data.model)">
|
||||||
<div class="xdesktop" *ngIf="data.icon">
|
<div class="xdesktop" *ngIf="data.icon">
|
||||||
<i class="material-icons">{{data.icon}}</i> {{data.title}}
|
<i class="material-icons">{{data.icon}}</i> {{data.title}}
|
||||||
</div>
|
</div>
|
||||||
@ -15,17 +14,37 @@
|
|||||||
<div class="xdesktop" *ngIf="!data.icon">
|
<div class="xdesktop" *ngIf="!data.icon">
|
||||||
{{data.title}}
|
{{data.title}}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="item"
|
||||||
|
*ngIf="!isNotButton(data)"
|
||||||
|
(click)="onGeneric(data, $event)"
|
||||||
|
(auxclick)="onGeneric(data, $event)"
|
||||||
|
[ngStyle]="{'float': data.position}"
|
||||||
|
[ngClass]="getClassModel(data.model)"
|
||||||
|
[disable]="false">
|
||||||
|
<div class="avatar" *ngIf="data.image">
|
||||||
|
<img class="avatar" src="{{data.image}}"/> {{data.title}}
|
||||||
|
</div>
|
||||||
|
<div class="xdesktop" *ngIf="data.icon && !data.image">
|
||||||
|
<i class="material-icons">{{data.icon}}</i> {{data.title}}
|
||||||
|
</div>
|
||||||
|
<div class="xmobile" *ngIf="data.icon && !data.image">
|
||||||
|
<i class="material-icons">{{data.icon}}</i>
|
||||||
|
</div>
|
||||||
|
<div class="xdesktop" *ngIf="!data.icon && !data.image">
|
||||||
|
{{data.title}}
|
||||||
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="fill-all" *ngIf="subMenu" (click)="onOutUserProperty()">
|
<div class="fill-all" *ngIf="subMenu" (click)="onOutUserProperty()">
|
||||||
<div class="sub-menu menu-left color-menu-background">
|
<div class="sub-menu color-menu-background"
|
||||||
|
[ngClass]="getClassMenuPosition()">
|
||||||
<div *ngFor="let data of subMenu">
|
<div *ngFor="let data of subMenu">
|
||||||
<button class="item"
|
<div class="inert_element unselectable"
|
||||||
(click)="onGeneric(data, $event)"
|
*ngIf="isNotButton(data)"
|
||||||
(auxclick)="onGeneric(data, $event)"
|
|
||||||
[ngStyle]="{'float': data.position}"
|
[ngStyle]="{'float': data.position}"
|
||||||
[disable]="false">
|
[ngClass]="getClassModel(data.model)" >
|
||||||
<div class="xdesktop"
|
<div class="xdesktop"
|
||||||
*ngIf="data.icon"
|
*ngIf="data.icon"
|
||||||
[ngStyle]="{'float': data.position}">
|
[ngStyle]="{'float': data.position}">
|
||||||
@ -40,6 +59,22 @@
|
|||||||
[ngStyle]="{'float': data.position}">
|
[ngStyle]="{'float': data.position}">
|
||||||
{{data.title}}
|
{{data.title}}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<button class="item"
|
||||||
|
*ngIf="isEnable(data) && !isNotButton(data)"
|
||||||
|
(click)="onGeneric(data, $event)"
|
||||||
|
(auxclick)="onGeneric(data, $event)"
|
||||||
|
[ngStyle]="{'float': data.position}"
|
||||||
|
[ngClass]="getClassModel(data.model)"
|
||||||
|
[disable]="false">
|
||||||
|
<div *ngIf="data.icon"
|
||||||
|
[ngStyle]="{'float': data.position}">
|
||||||
|
<i class="material-icons">{{data.icon}}</i> {{data.title}}
|
||||||
|
</div>
|
||||||
|
<div *ngIf="!data.icon"
|
||||||
|
[ngStyle]="{'float': data.position}">
|
||||||
|
{{data.title}}
|
||||||
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -13,6 +13,15 @@
|
|||||||
float: none;
|
float: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.model_happy {
|
||||||
|
color:yellow;
|
||||||
|
}
|
||||||
|
.model_disable {
|
||||||
|
color:rgb(100, 100, 100);
|
||||||
|
}
|
||||||
|
.model_error {
|
||||||
|
color:darkred;
|
||||||
|
}
|
||||||
.top {
|
.top {
|
||||||
.sub-menu {
|
.sub-menu {
|
||||||
|
|
||||||
@ -138,6 +147,18 @@
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.inert_element {
|
||||||
|
display:block;
|
||||||
|
float: left;
|
||||||
|
line-height: 56px;
|
||||||
|
z-index: 4;
|
||||||
|
margin: 0 3px 0 3px;
|
||||||
|
border: 0;
|
||||||
|
//text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
.ariane {
|
.ariane {
|
||||||
display:block;
|
display:block;
|
||||||
float: left;
|
float: left;
|
||||||
@ -149,17 +170,6 @@
|
|||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 15px;
|
font-size: 15px;
|
||||||
.item_ariane_separator {
|
|
||||||
display:block;
|
|
||||||
float: left;
|
|
||||||
line-height: 56px;
|
|
||||||
z-index: 4;
|
|
||||||
margin: 0 3px 0 3px;
|
|
||||||
border: 0;
|
|
||||||
text-transform: uppercase;
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 30px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.material-icons {
|
.material-icons {
|
||||||
|
@ -3,13 +3,20 @@
|
|||||||
* @copyright 2018, Edouard DUPIN, all right reserved
|
* @copyright 2018, Edouard DUPIN, all right reserved
|
||||||
* @license PROPRIETARY (see license file)
|
* @license PROPRIETARY (see license file)
|
||||||
*/
|
*/
|
||||||
import { Component, OnInit, Input } from '@angular/core';
|
import { Component, OnInit, Input, EventEmitter, Output } from '@angular/core';
|
||||||
|
|
||||||
import { Router } from '@angular/router';
|
import { Router } from '@angular/router';
|
||||||
import { isNullOrUndefined } from '../../utils';
|
import { isNullOrUndefined } from 'common/utils';
|
||||||
import { MenuItem } from '../../model/menu-item';
|
import { MenuItem } from 'common/model/menu-item';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export interface EventOnMenu {
|
||||||
|
menu: MenuItem;
|
||||||
|
newWindows: boolean;
|
||||||
|
ctrl: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-top-menu',
|
selector: 'app-top-menu',
|
||||||
templateUrl: './top-menu.html',
|
templateUrl: './top-menu.html',
|
||||||
@ -17,12 +24,26 @@ import { MenuItem } from '../../model/menu-item';
|
|||||||
})
|
})
|
||||||
export class TopMenuComponent implements OnInit {
|
export class TopMenuComponent implements OnInit {
|
||||||
@Input() menu: MenuItem[];
|
@Input() menu: MenuItem[];
|
||||||
subMenu: MenuItem[] = null;
|
subMenu: MenuItem[] = undefined;
|
||||||
|
subMenuPosition: String = undefined;
|
||||||
|
@Output() callback: EventEmitter<EventOnMenu> = new EventEmitter();
|
||||||
|
|
||||||
constructor(private router: Router) {
|
constructor(private router: Router) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isNotButton(data: MenuItem) {
|
||||||
|
return isNullOrUndefined(data.navigateTo)
|
||||||
|
&& (isNullOrUndefined(data.callback) || data.callback === false)
|
||||||
|
&& isNullOrUndefined(data.subMenu);
|
||||||
|
}
|
||||||
|
isEnable(data: MenuItem) {
|
||||||
|
if (!isNullOrUndefined(data) && !isNullOrUndefined(data.enable) && data.enable === false) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
getPosition(data: string) : string {
|
getPosition(data: string) : string {
|
||||||
return `float: ${data}`;
|
return `float: ${data}`;
|
||||||
}
|
}
|
||||||
@ -31,37 +52,58 @@ export class TopMenuComponent implements OnInit {
|
|||||||
|
|
||||||
}
|
}
|
||||||
onOutUserProperty(): void {
|
onOutUserProperty(): void {
|
||||||
console.log('onOutUserProperty ==> event...');
|
//console.log('onOutUserProperty ==> event...');
|
||||||
this.subMenu = undefined;
|
this.subMenu = undefined;
|
||||||
}
|
}
|
||||||
|
getClassMenuPosition(): string {
|
||||||
|
if (isNullOrUndefined(this.subMenuPosition)) {
|
||||||
|
return "menu-left";
|
||||||
|
}
|
||||||
|
return 'menu-' + this.subMenuPosition;
|
||||||
|
}
|
||||||
|
getClassModel(data?:string): string {
|
||||||
|
if (isNullOrUndefined(data)) {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return 'model_' + data;
|
||||||
|
}
|
||||||
|
|
||||||
onGeneric(data: MenuItem, event: any): void {
|
onGeneric(data: MenuItem, event: any): void {
|
||||||
console.log(`onGeneric()`);
|
//console.log(`onGeneric()`);
|
||||||
// check if we need to navigate
|
// check if we need to navigate
|
||||||
if (!isNullOrUndefined(data.navigateTo)) {
|
if (!isNullOrUndefined(data.navigateTo)) {
|
||||||
// remove in every case the subMenu:
|
// remove in every case the subMenu:
|
||||||
console.log("Navigate request !!!");
|
|
||||||
this.subMenu = undefined
|
this.subMenu = undefined
|
||||||
|
this.subMenuPosition = undefined;
|
||||||
this.router.navigate([ data.navigateTo ]);
|
this.router.navigate([ data.navigateTo ]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!isNullOrUndefined(data.callback) && data.callback === true) {
|
||||||
|
//console.log(`Emit message on ${JSON.stringify(data)}`);
|
||||||
|
this.callback.emit({
|
||||||
|
menu: data,
|
||||||
|
newWindows: event.which === 2,
|
||||||
|
ctrl: event.ctrlKey,
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
// check if we need to display a submenu
|
// check if we need to display a submenu
|
||||||
if (isNullOrUndefined(data.subMenu)) {
|
if (isNullOrUndefined(data.subMenu)) {
|
||||||
console.log("No menu !!!");
|
|
||||||
//just a toggle mode:
|
//just a toggle mode:
|
||||||
data.subMenu = undefined;
|
data.subMenu = undefined;
|
||||||
|
this.subMenuPosition = undefined;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this.subMenu === data.subMenu) {
|
if (this.subMenu === data.subMenu) {
|
||||||
console.log("Toggle menu");
|
|
||||||
//just a toggle mode:
|
//just a toggle mode:
|
||||||
this.subMenu = undefined;
|
this.subMenu = undefined;
|
||||||
|
this.subMenuPosition = undefined;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log(`Set Menu: ${JSON.stringify(data.subMenu)}`);
|
//console.log(`Set Menu: ${JSON.stringify(data.subMenu)}`);
|
||||||
// set the requested menu
|
// set the requested menu
|
||||||
this.subMenu = data.subMenu;
|
this.subMenu = data.subMenu;
|
||||||
|
this.subMenuPosition = data.position;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
|
import { isMenuItem, isMenuPosition, MenuItem, MenuPosition } from "./menu-item";
|
||||||
import { NodeData, isNodeData } from "./node";
|
import { NodeData, isNodeData } from "./node";
|
||||||
|
|
||||||
|
|
||||||
export {
|
export {
|
||||||
NodeData, isNodeData,
|
NodeData, isNodeData,
|
||||||
|
MenuPosition, isMenuPosition, MenuItem, isMenuItem,
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import { isNumberFinite, isObject, isOptionalOf, isString, isNullOrUndefined, isOptionalArrayOf } from "../utils";
|
import { isObject, isOptionalOf, isString, isNullOrUndefined, isOptionalArrayOf } from "common/utils";
|
||||||
|
|
||||||
export enum MenuPosition {
|
export enum MenuPosition {
|
||||||
LEFT = "left",
|
LEFT = "left",
|
||||||
@ -20,10 +20,20 @@ export interface MenuItem {
|
|||||||
hover?: string;
|
hover?: string;
|
||||||
// Icon of the menue (need to be a meterial-icon name
|
// Icon of the menue (need to be a meterial-icon name
|
||||||
icon?: string;
|
icon?: string;
|
||||||
|
// If we want to display an image instead of an icon
|
||||||
|
image?: string;
|
||||||
// Displayed Title
|
// Displayed Title
|
||||||
title: string;
|
title: string;
|
||||||
// Jump Link (If undefined: it is considered as text and not a button)
|
// Jump Link (If undefined: it is considered as text and not a button)
|
||||||
|
model?: string;
|
||||||
|
// Jump Link (If undefined: it is considered as text and not a button)
|
||||||
navigateTo?: string;
|
navigateTo?: string;
|
||||||
|
// if it request a callbak with the curent element: (not compatible with the previous)
|
||||||
|
callback?: boolean;
|
||||||
|
// Other data that want to be set by the user
|
||||||
|
otherData?: any;
|
||||||
|
// Enable or not the elemnt
|
||||||
|
enable?: boolean;
|
||||||
// Menu model For a subList of elements
|
// Menu model For a subList of elements
|
||||||
subMenu?: MenuItem[];
|
subMenu?: MenuItem[];
|
||||||
};
|
};
|
||||||
@ -45,6 +55,9 @@ export function isMenuItem(data: any): data is MenuItem {
|
|||||||
if (!isOptionalOf(data.icon, isString)) {
|
if (!isOptionalOf(data.icon, isString)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!isOptionalOf(data.image, isString)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (!isString(data.title)) {
|
if (!isString(data.title)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
8
front/src/common/popin/index.ts
Normal file
8
front/src/common/popin/index.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { PopInDeleteConfirm } from "./delete-confirm/delete-confirm";
|
||||||
|
import { PopInUploadProgress } from "./upload-progress/upload-progress";
|
||||||
|
|
||||||
|
|
||||||
|
export {
|
||||||
|
PopInDeleteConfirm,
|
||||||
|
PopInUploadProgress,
|
||||||
|
}
|
6
front/src/common/scene/404/404.html
Normal file
6
front/src/common/scene/404/404.html
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<div class="full-mode">
|
||||||
|
<div class="centered">
|
||||||
|
<div class="error"><label class="unselectable"><i class="material-icons">report</i> 404 Not Found !</label></div>
|
||||||
|
<div class="comment"><label class="unselectable">Unknwn this page.</label></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
50
front/src/common/scene/404/404.less
Normal file
50
front/src/common/scene/404/404.less
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
.full-mode{
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
border:0;
|
||||||
|
float:left;
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
position:relative;
|
||||||
|
max-width:75%;
|
||||||
|
padding: 16px 32px 16px 32px;
|
||||||
|
|
||||||
|
top: 50%;
|
||||||
|
transform: ~"translate(0, -50%)";
|
||||||
|
font-size: 30px;
|
||||||
|
|
||||||
|
font-weight: 600;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 200%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
font-size: 55px;
|
||||||
|
background-size: 45px;
|
||||||
|
/*background-attachment: fixed;*/
|
||||||
|
background-position: 0% 50%;
|
||||||
|
padding: 0 0 0 58px;
|
||||||
|
margin: 17px 0 17px 0;
|
||||||
|
text-shadow:0px 0px 4px #000000;
|
||||||
|
color: rgb(160, 44, 44);
|
||||||
|
i {
|
||||||
|
font-size: 55px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment {
|
||||||
|
background-size: 45px;
|
||||||
|
/*background-attachment: fixed;*/
|
||||||
|
background-position: 0% 50%;
|
||||||
|
padding: 0 0 0 58px;
|
||||||
|
margin: 17px 0 17px 0;
|
||||||
|
text-shadow:0px 0px 4px #07213a;
|
||||||
|
color: white;
|
||||||
|
}
|
16
front/src/common/scene/404/404.ts
Normal file
16
front/src/common/scene/404/404.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2018, Edouard DUPIN, all right reserved
|
||||||
|
* @license PROPRIETARY (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-404-not-found',
|
||||||
|
templateUrl: './404.html',
|
||||||
|
styleUrls: [ './404.less' ]
|
||||||
|
})
|
||||||
|
export class NotFound404Scene {
|
||||||
|
constructor() { }
|
||||||
|
}
|
@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
import { ActivatedRoute } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { ArianeService } from 'app/service/ariane';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-error-viewer',
|
selector: 'app-error-viewer',
|
||||||
@ -14,11 +13,10 @@ import { ArianeService } from 'app/service/ariane';
|
|||||||
styleUrls: [ './error-viewer.less' ]
|
styleUrls: [ './error-viewer.less' ]
|
||||||
})
|
})
|
||||||
export class ErrorViewerScene implements OnInit {
|
export class ErrorViewerScene implements OnInit {
|
||||||
constructor(private route: ActivatedRoute,
|
constructor(private route: ActivatedRoute) { }
|
||||||
private arianeService: ArianeService) { }
|
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.arianeService.updateManual(this.route.snapshot.paramMap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<div class="full-mode">
|
<div class="full-mode">
|
||||||
<div class="centered">
|
<div class="centered">
|
||||||
<div class="error"><label class="unselectable"><i class="material-icons">block</i> 403 Forbidden</label></div>
|
<div class="error"><label class="unselectable"><i class="material-icons">gpp_bad</i> 403 Forbidden</label></div>
|
||||||
<div class="comment"><label class="unselectable">You don't have permission to access this resource.</label></div>
|
<div class="comment"><label class="unselectable">You don't have permission to access this resource.</label></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
6
front/src/common/scene/home-out/home-out.html
Normal file
6
front/src/common/scene/home-out/home-out.html
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<div class="full-mode">
|
||||||
|
<div class="centered">
|
||||||
|
<div class="error"><label class="unselectable"><i class="material-icons">login</i> Not registered!</label></div>
|
||||||
|
<div class="comment"><label class="unselectable">you must login to access to this website.</label></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
50
front/src/common/scene/home-out/home-out.less
Normal file
50
front/src/common/scene/home-out/home-out.less
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
|
||||||
|
.full-mode{
|
||||||
|
width:100%;
|
||||||
|
height:100%;
|
||||||
|
top:0;
|
||||||
|
left:0;
|
||||||
|
margin:0;
|
||||||
|
padding:0;
|
||||||
|
border:0;
|
||||||
|
float:left;
|
||||||
|
display:block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.centered {
|
||||||
|
position:relative;
|
||||||
|
max-width:75%;
|
||||||
|
padding: 16px 32px 16px 32px;
|
||||||
|
|
||||||
|
top: 50%;
|
||||||
|
transform: ~"translate(0, -50%)";
|
||||||
|
font-size: 30px;
|
||||||
|
|
||||||
|
font-weight: 600;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 200%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error {
|
||||||
|
font-size: 55px;
|
||||||
|
background-size: 45px;
|
||||||
|
/*background-attachment: fixed;*/
|
||||||
|
background-position: 0% 50%;
|
||||||
|
padding: 0 0 0 58px;
|
||||||
|
margin: 17px 0 17px 0;
|
||||||
|
text-shadow:0px 0px 4px #000000;
|
||||||
|
color: rgb(160, 44, 44);
|
||||||
|
i {
|
||||||
|
font-size: 55px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.comment {
|
||||||
|
background-size: 45px;
|
||||||
|
/*background-attachment: fixed;*/
|
||||||
|
background-position: 0% 50%;
|
||||||
|
padding: 0 0 0 58px;
|
||||||
|
margin: 17px 0 17px 0;
|
||||||
|
text-shadow:0px 0px 4px #07213a;
|
||||||
|
color: white;
|
||||||
|
}
|
16
front/src/common/scene/home-out/home-out.ts
Normal file
16
front/src/common/scene/home-out/home-out.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/** @file
|
||||||
|
* @author Edouard DUPIN
|
||||||
|
* @copyright 2018, Edouard DUPIN, all right reserved
|
||||||
|
* @license PROPRIETARY (see license file)
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-home-out',
|
||||||
|
templateUrl: './home-out.html',
|
||||||
|
styleUrls: [ './home-out.less' ]
|
||||||
|
})
|
||||||
|
export class HomeOutScene {
|
||||||
|
constructor() { }
|
||||||
|
}
|
@ -1,11 +1,17 @@
|
|||||||
import { ErrorViewerScene } from "./error-viewer/error-viewer";
|
import { ErrorViewerScene } from "./error-viewer/error-viewer";
|
||||||
|
import { ForbiddenScene } from "./forbidden/forbidden";
|
||||||
import { SsoScene } from "./sso/sso";
|
import { SsoScene } from "./sso/sso";
|
||||||
import { UploadScene } from "../../app/scene/upload/upload";
|
//import { UploadScene } from "../../app/scene/upload/upload";
|
||||||
|
import { HomeOutScene } from "./home-out/home-out";
|
||||||
|
import { NotFound404Scene } from "./404/404";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
ErrorViewerScene,
|
ErrorViewerScene,
|
||||||
SsoScene,
|
SsoScene,
|
||||||
UploadScene,
|
//UploadScene,
|
||||||
|
ForbiddenScene,
|
||||||
|
HomeOutScene,
|
||||||
|
NotFound404Scene,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ export class SsoScene implements OnInit {
|
|||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
let self = this;
|
let self = this;
|
||||||
console.error("retreive data after SSO back");
|
console.log(`call after SSO back: ${window.location.href}`);
|
||||||
const ssoData = this.route.snapshot.paramMap.get('data');
|
const ssoData = this.route.snapshot.paramMap.get('data');
|
||||||
if (ssoData == null) {
|
if (ssoData == null) {
|
||||||
this.ssoData = undefined;
|
this.ssoData = undefined;
|
||||||
@ -48,20 +48,19 @@ export class SsoScene implements OnInit {
|
|||||||
} else {
|
} else {
|
||||||
this.keepConnected = keepConnected === 'true';
|
this.keepConnected = keepConnected === 'true';
|
||||||
}
|
}
|
||||||
console.error(`ssoData: '${ssoData}'`);
|
console.log(`ssoData: '${ssoData}'`);
|
||||||
console.error(`token: '${token}'`);
|
console.log(`token: '${token}'`);
|
||||||
console.error(`keepConnected: '${keepConnected}'`);
|
console.log(`keepConnected: '${keepConnected}'`);
|
||||||
if (this.token !== '__CANCEL__' && this.token !== '__FAIL__' && this.token !== '__LOGOUT__') {
|
if (this.token !== '__CANCEL__' && this.token !== '__FAIL__' && this.token !== '__LOGOUT__') {
|
||||||
const destination = (this.ssoData);
|
const destination = (this.ssoData);
|
||||||
console.error(`ssoData (decoded): '${destination}'`);
|
console.log(`ssoData (decoded): '${destination}'`);
|
||||||
// sample : ZZ**DST:home
|
|
||||||
const realDst = this.ssoService.unHashLocalData(destination);
|
const realDst = this.ssoService.unHashLocalData(destination);
|
||||||
console.error(`realDst: '${realDst}'`);
|
console.log(`realDst: '${realDst}'`);
|
||||||
this.userService.startSession(this.token, this.keepConnected).then((userName: string) => {
|
this.userService.startSession(this.token, this.keepConnected).then((userName: string) => {
|
||||||
self.userName = userName;
|
self.userName = userName;
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
self.router.navigate([ realDst ], { replaceUrl:true });
|
self.router.navigate([ realDst ], { replaceUrl:true });
|
||||||
}, 2000); // 2 seconds
|
}, 500); // 2 seconds
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
this.token = "ERROR_ME";
|
this.token = "ERROR_ME";
|
||||||
})
|
})
|
||||||
@ -74,7 +73,7 @@ export class SsoScene implements OnInit {
|
|||||||
console.error(`realDst: '${realDst}'`);
|
console.error(`realDst: '${realDst}'`);
|
||||||
setTimeout(function(){
|
setTimeout(function(){
|
||||||
self.router.navigate([ realDst ], { replaceUrl:true });
|
self.router.navigate([ realDst ], { replaceUrl:true });
|
||||||
}, 2000); // 2 seconds
|
}, 500); // 2 seconds
|
||||||
} else {
|
} else {
|
||||||
this.userService.removeSession();
|
this.userService.removeSession();
|
||||||
}
|
}
|
||||||
|
@ -62,9 +62,10 @@ export class HttpWrapperService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
addTokenIfNeeded(headerOption:any): any {
|
addTokenIfNeeded(headerOption:any): any {
|
||||||
if(!isNullOrUndefined(this.session.getToken())) {
|
const token = this.session.getToken();
|
||||||
|
if(!isNullOrUndefined(token)) {
|
||||||
if(headerOption.Authorization === undefined) {
|
if(headerOption.Authorization === undefined) {
|
||||||
headerOption.Authorization = `Yota ${this.session.getToken()}`;
|
headerOption.Authorization = `Yota ${token}`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return headerOption;
|
return headerOption;
|
||||||
@ -72,7 +73,7 @@ export class HttpWrapperService {
|
|||||||
|
|
||||||
request(properties: HTTPRequest) : Promise<Response> {
|
request(properties: HTTPRequest) : Promise<Response> {
|
||||||
//uriRest:string, headerOption:any, params:any): Promise<{status:number, data:any}> {
|
//uriRest:string, headerOption:any, params:any): Promise<{status:number, data:any}> {
|
||||||
console.log(`-------------------------------------------------------\nHTTP-wrapper GET '${ properties.endPoint }'\n\t\tparams=${ JSON.stringify(properties, null, 2)}`);
|
//console.log(`-------------------------------------------------------\nHTTP-wrapper GET '${ properties.endPoint }'\n\t\tparams=${ JSON.stringify(properties, null, 2)}`);
|
||||||
|
|
||||||
let connectionAdresse = this.createRESTCall2({
|
let connectionAdresse = this.createRESTCall2({
|
||||||
server: properties.server,
|
server: properties.server,
|
||||||
@ -89,11 +90,11 @@ export class HttpWrapperService {
|
|||||||
if (properties.requestType !== HTTPRequestModel.GET) {
|
if (properties.requestType !== HTTPRequestModel.GET) {
|
||||||
headers['Content-Type'] = properties.contentType;
|
headers['Content-Type'] = properties.contentType;
|
||||||
}
|
}
|
||||||
console.log(`disble tocken : ${JSON.stringify(properties)} properties.disableTocken=${properties.disableTocken}`);
|
//console.log(`disble tocken : ${JSON.stringify(properties)} properties.disableTocken=${properties.disableTocken}`);
|
||||||
if (properties.disableTocken === undefined || properties.disableTocken === null || properties.disableTocken === true) {
|
if (properties.disableTocken === undefined || properties.disableTocken === null || properties.disableTocken === false) {
|
||||||
headers = this.addTokenIfNeeded(headers);
|
headers = this.addTokenIfNeeded(headers);
|
||||||
}
|
}
|
||||||
console.log(`header: ${JSON.stringify(headers)}`);
|
//console.log(`header: ${JSON.stringify(headers)}`);
|
||||||
let body = properties.body;
|
let body = properties.body;
|
||||||
if (properties.contentType === HTTPMimeType.JSON) {
|
if (properties.contentType === HTTPMimeType.JSON) {
|
||||||
body = JSON.stringify(properties.body);
|
body = JSON.stringify(properties.body);
|
||||||
@ -167,7 +168,10 @@ export class HttpWrapperService {
|
|||||||
server = environment.defaultServer;
|
server = environment.defaultServer;
|
||||||
}
|
}
|
||||||
const basePage = environment.server[server];
|
const basePage = environment.server[server];
|
||||||
let addressServerRest = `${basePage }/`;
|
let addressServerRest = basePage;
|
||||||
|
if (!basePage.endsWith("/")) {
|
||||||
|
addressServerRest = `${basePage}/`;
|
||||||
|
}
|
||||||
let options = inputOptions;
|
let options = inputOptions;
|
||||||
if(isNullOrUndefined(options)) {
|
if(isNullOrUndefined(options)) {
|
||||||
options = {};
|
options = {};
|
||||||
@ -176,8 +180,12 @@ export class HttpWrapperService {
|
|||||||
if (isArrayOfs(api, isString, isNumber, isBoolean)) {
|
if (isArrayOfs(api, isString, isNumber, isBoolean)) {
|
||||||
for (let iii=0; iii<api.length; iii++) {
|
for (let iii=0; iii<api.length; iii++) {
|
||||||
let elem = api[iii];
|
let elem = api[iii];
|
||||||
|
if (out.endsWith("/")) {
|
||||||
|
out += elem;
|
||||||
|
} else {
|
||||||
out += `/${elem}`;
|
out += `/${elem}`;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
out += api;
|
out += api;
|
||||||
}
|
}
|
||||||
@ -195,7 +203,7 @@ export class HttpWrapperService {
|
|||||||
out = out + "=" + options[keys[iii]];
|
out = out + "=" + options[keys[iii]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(`try to get session : ${this.session.getToken()}`);
|
//console.log(`try to get session : ${this.session.getToken()}`);
|
||||||
if (!isNullOrUndefined(this.session.getToken())) {
|
if (!isNullOrUndefined(this.session.getToken())) {
|
||||||
if (addURLToken !== undefined && addURLToken === true) {
|
if (addURLToken !== undefined && addURLToken === true) {
|
||||||
if(first === false) {
|
if(first === false) {
|
||||||
@ -232,7 +240,7 @@ export class HttpWrapperService {
|
|||||||
}
|
}
|
||||||
// Deprecated ... old model stream
|
// Deprecated ... old model stream
|
||||||
post(uriRest:string, headerOption:any, data:any, progress:ProgressCallback = null) {
|
post(uriRest:string, headerOption:any, data:any, progress:ProgressCallback = null) {
|
||||||
console.log(`-------------------------------------------------------\nHTTP-wrapper POST '${ uriRest }'\n\t\theaderOption=${ JSON.stringify(headerOption, null, 2)}\n\t\tdata=${ JSON.stringify(data, null, 2)}`);
|
//console.log(`-------------------------------------------------------\nHTTP-wrapper POST '${ uriRest }'\n\t\theaderOption=${ JSON.stringify(headerOption, null, 2)}\n\t\tdata=${ JSON.stringify(data, null, 2)}`);
|
||||||
this.addTokenIfNeeded(headerOption);
|
this.addTokenIfNeeded(headerOption);
|
||||||
let connectionAdresse = this.createRESTCall(uriRest, {});
|
let connectionAdresse = this.createRESTCall(uriRest, {});
|
||||||
|
|
||||||
@ -253,20 +261,20 @@ export class HttpWrapperService {
|
|||||||
}
|
}
|
||||||
if(res.type === HttpEventType.Sent) {
|
if(res.type === HttpEventType.Sent) {
|
||||||
/* res.type === 0 */
|
/* res.type === 0 */
|
||||||
console.log('post : Sent');
|
//console.log('post : Sent');
|
||||||
} else if(res.type === HttpEventType.UploadProgress) {
|
} else if(res.type === HttpEventType.UploadProgress) {
|
||||||
/* res.type === 1 */
|
/* res.type === 1 */
|
||||||
// console.log("post : " + res.loaded + " / " + res.total);
|
// console.log("post : " + res.loaded + " / " + res.total);
|
||||||
progress(res.loaded, res.total);
|
progress(res.loaded, res.total);
|
||||||
} else if(res.type === HttpEventType.ResponseHeader) {
|
} else if(res.type === HttpEventType.ResponseHeader) {
|
||||||
/* res.type === 2 */
|
/* res.type === 2 */
|
||||||
console.log('post : get header');
|
//console.log('post : get header');
|
||||||
} else if(res.type === HttpEventType.DownloadProgress) {
|
} else if(res.type === HttpEventType.DownloadProgress) {
|
||||||
/* res.type === 3 */
|
/* res.type === 3 */
|
||||||
console.log(`post : get DownloadProgress ${ res.loaded}`);
|
//console.log(`post : get DownloadProgress ${ res.loaded}`);
|
||||||
} else if(res.type === HttpEventType.Response) {
|
} else if(res.type === HttpEventType.Response) {
|
||||||
/* res.type === 4 */
|
/* res.type === 4 */
|
||||||
console.log('post : get response');
|
//console.log('post : get response');
|
||||||
if(res.httpCode) {
|
if(res.httpCode) {
|
||||||
resolve({ status:res.httpCode, data:res });
|
resolve({ status:res.httpCode, data:res });
|
||||||
} else {
|
} else {
|
||||||
@ -274,7 +282,7 @@ export class HttpWrapperService {
|
|||||||
}
|
}
|
||||||
} else if(res.type === HttpEventType.User) {
|
} else if(res.type === HttpEventType.User) {
|
||||||
/* res.type === 5 */
|
/* res.type === 5 */
|
||||||
console.log('post : get User');
|
//console.log('post : get User');
|
||||||
} else {
|
} else {
|
||||||
console.log(`post : get unknown ... ${ res.type}`);
|
console.log(`post : get unknown ... ${ res.type}`);
|
||||||
}
|
}
|
||||||
@ -290,7 +298,7 @@ export class HttpWrapperService {
|
|||||||
}
|
}
|
||||||
// Deprecated ... old model stream
|
// Deprecated ... old model stream
|
||||||
uploadMultipart(base:string, multipart:FormData, progress: ProgressCallback): any {
|
uploadMultipart(base:string, multipart:FormData, progress: ProgressCallback): any {
|
||||||
console.log(`Upload multipart to ${ base}`);
|
//console.log(`Upload multipart to ${ base}`);
|
||||||
|
|
||||||
let url = base;
|
let url = base;
|
||||||
let self = this;
|
let self = this;
|
||||||
@ -301,7 +309,7 @@ export class HttpWrapperService {
|
|||||||
|
|
||||||
self.post(url, headers, multipart, progress)
|
self.post(url, headers, multipart, progress)
|
||||||
.then((response: any) => {
|
.then((response: any) => {
|
||||||
console.log(`URL: ${ url }\nRespond(${ response.status }): ${ JSON.stringify(response.data, null, 2)}`);
|
//console.log(`URL: ${ url }\nRespond(${ response.status }): ${ JSON.stringify(response.data, null, 2)}`);
|
||||||
if(response.status >= 200 && response.status <= 299) {
|
if(response.status >= 200 && response.status <= 299) {
|
||||||
resolve(response.data.body);
|
resolve(response.data.body);
|
||||||
return;
|
return;
|
||||||
|
@ -3,7 +3,7 @@ import { CookiesService } from "./cookies";
|
|||||||
import { HttpWrapperService, ModelResponseHttp, HTTPRequest, HTTPMimeType, HTTPRequestModel } from "./http-wrapper";
|
import { HttpWrapperService, ModelResponseHttp, HTTPRequest, HTTPMimeType, HTTPRequestModel } from "./http-wrapper";
|
||||||
import { StorageService } from "./local-storage";
|
import { StorageService } from "./local-storage";
|
||||||
import { PopInService } from "./popin";
|
import { PopInService } from "./popin";
|
||||||
import { SessionService } from "./session";
|
import { OnlyAdminGuard, OnlyUnregisteredGuardHome, OnlyUsersGuard, OnlyUsersGuardHome, SessionService } from "./session";
|
||||||
import { SSOService } from "./sso";
|
import { SSOService } from "./sso";
|
||||||
import { UserService } from "./user";
|
import { UserService } from "./user";
|
||||||
|
|
||||||
@ -20,6 +20,10 @@ export {
|
|||||||
SessionService,
|
SessionService,
|
||||||
UserService,
|
UserService,
|
||||||
SSOService,
|
SSOService,
|
||||||
|
OnlyUsersGuard,
|
||||||
|
OnlyUsersGuardHome,
|
||||||
|
OnlyUnregisteredGuardHome,
|
||||||
|
OnlyAdminGuard,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,11 +30,11 @@ export class PopInService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
open(_id: string) {
|
open(_id: string) {
|
||||||
//console.log("Try to open pop-in: '" + _id + "'");
|
// console.log("Try to open pop-in: '" + _id + "'");
|
||||||
// open popin specified by id
|
// open popin specified by id
|
||||||
for(let iii = 0; iii < this.popins.length; iii++) {
|
for(let iii = 0; iii < this.popins.length; iii++) {
|
||||||
if(this.popins[iii].id === _id) {
|
if(this.popins[iii].id === _id) {
|
||||||
//console.log(" ==>find it ...");
|
// console.log(" ==>find it ...");
|
||||||
this.popins[iii].open();
|
this.popins[iii].open();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Injectable, Output, EventEmitter } from '@angular/core';
|
import { Injectable, Output, EventEmitter } from '@angular/core';
|
||||||
|
import { CanActivate, Router } from '@angular/router';
|
||||||
|
|
||||||
export enum UserRoles222 {
|
export enum UserRoles222 {
|
||||||
admin = 10000,
|
admin = 10000,
|
||||||
@ -38,14 +39,19 @@ export class SessionService {
|
|||||||
* @param userAdmin -
|
* @param userAdmin -
|
||||||
* @param userAvatar -
|
* @param userAvatar -
|
||||||
*/
|
*/
|
||||||
create(sessionId,
|
create({ sessionId, userId, userLogin, userEMail, userAdmin, userAvatar, tokenJwt }: {
|
||||||
userId: string,
|
sessionId;
|
||||||
userLogin: string,
|
userId: string;
|
||||||
userEMail: string,
|
userLogin: string;
|
||||||
userAdmin: boolean,
|
userEMail: string;
|
||||||
userAvatar: string) {
|
userAdmin: boolean;
|
||||||
console.log(`Session Create: userId=${userId} userLogin=${userLogin} userEMail=${userEMail} userAdmin=${userAdmin} userAvatar=${userAvatar} sessionId = ${sessionId}`);
|
userBlocked: boolean;
|
||||||
this.tokenJwt = undefined;
|
userRemoved: boolean;
|
||||||
|
userAvatar: string;
|
||||||
|
tokenJwt: string;
|
||||||
|
}) {
|
||||||
|
console.log(`Session Create: userId=${userId} userLogin=${userLogin} userEMail=${userEMail} userAdmin=${userAdmin} userAvatar=${userAvatar} sessionId = ${sessionId} tokenJwt = ${tokenJwt}`);
|
||||||
|
this.tokenJwt = tokenJwt;
|
||||||
this.sessionId = sessionId;
|
this.sessionId = sessionId;
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
this.userLogin = userLogin;
|
this.userLogin = userLogin;
|
||||||
@ -70,9 +76,6 @@ export class SessionService {
|
|||||||
this.userAvatar = null;
|
this.userAvatar = null;
|
||||||
this.change.emit(false);
|
this.change.emit(false);
|
||||||
}
|
}
|
||||||
setToken(jwt: string) {
|
|
||||||
this.tokenJwt = jwt;
|
|
||||||
}
|
|
||||||
getToken(): string | undefined {
|
getToken(): string | undefined {
|
||||||
return this.tokenJwt;
|
return this.tokenJwt;
|
||||||
}
|
}
|
||||||
@ -110,3 +113,63 @@ export class SessionService {
|
|||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class OnlyUsersGuard implements CanActivate {
|
||||||
|
constructor(private sessionService: SessionService,
|
||||||
|
private router: Router) {};
|
||||||
|
|
||||||
|
canActivate() {
|
||||||
|
console.log("OnlyLoggedInUsers");
|
||||||
|
if (this.sessionService.hasRight(UserRoles222.user) || this.sessionService.hasRight(UserRoles222.admin) ) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.router.navigateByUrl('/forbidden');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class OnlyUsersGuardHome implements CanActivate {
|
||||||
|
constructor(private sessionService: SessionService,
|
||||||
|
private router: Router) {};
|
||||||
|
|
||||||
|
canActivate() {
|
||||||
|
if (this.sessionService.hasRight(UserRoles222.user) || this.sessionService.hasRight(UserRoles222.admin) ) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.router.navigateByUrl('/unregistered');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Injectable()
|
||||||
|
export class OnlyUnregisteredGuardHome implements CanActivate {
|
||||||
|
constructor(private sessionService: SessionService,
|
||||||
|
private router: Router) {};
|
||||||
|
|
||||||
|
canActivate() {
|
||||||
|
if (!this.sessionService.islogged() ) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.router.navigateByUrl('/home');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class OnlyAdminGuard implements CanActivate {
|
||||||
|
constructor(private sessionService: SessionService,
|
||||||
|
private router: Router) {};
|
||||||
|
|
||||||
|
canActivate() {
|
||||||
|
if (this.sessionService.hasRight(UserRoles222.user)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.router.navigateByUrl('/forbidden');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -6,51 +6,57 @@
|
|||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { environment } from 'environments/environment';
|
import { environment } from 'environments/environment';
|
||||||
|
import { getApplicationLocation, isInArray, isNullOrUndefined } from 'common/utils';
|
||||||
|
import { HTTPMimeType, HTTPRequestModel, HttpWrapperService, ModelResponseHttp } from 'common/service';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class SSOService {
|
export class SSOService {
|
||||||
|
signUpEnable: boolean = undefined;
|
||||||
|
|
||||||
constructor() {
|
constructor(
|
||||||
|
private http: HttpWrapperService,
|
||||||
|
) {
|
||||||
console.log('Start SSOService');
|
console.log('Start SSOService');
|
||||||
}
|
}
|
||||||
utf8_to_b64( str:string ): string {
|
utf8_to_b64( str:string ): string {
|
||||||
// remove unneeded "=" padding
|
// remove unneeded "=" padding
|
||||||
return window.btoa(unescape(encodeURIComponent( str ))).replace("=", "");
|
return window.btoa(encodeURIComponent( str )).replace("=", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
b64_to_utf8( str:string ): string {
|
b64_to_utf8( str:string ): string {
|
||||||
return decodeURIComponent(escape(window.atob( str )));
|
return decodeURIComponent(window.atob( str ));
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Request SSO connection
|
* Request SSO connection
|
||||||
*/
|
*/
|
||||||
hashLocalData(data?: string): string {
|
hashLocalData(data?: string): string {
|
||||||
if (data != undefined) {
|
if (!isNullOrUndefined(data) && !isInArray(data, ["", "null", "NULL", "undefined", "---", "unregistered", "unregistered/", "forbidden", "forbidden/"])) {
|
||||||
return this.utf8_to_b64(data);
|
return this.utf8_to_b64(data);
|
||||||
}
|
}
|
||||||
let pathName = window.location.pathname;
|
let pathName = getApplicationLocation();
|
||||||
console.log("start Path-name: '" + pathName + "'");
|
if (isInArray(pathName, ["sso", "/sso", "/sso/"])) {
|
||||||
console.log("check with: '" + environment.applName + "/sso/" + "'");
|
|
||||||
if (pathName.startsWith("/sso/") || pathName.startsWith(environment.applName + "/sso/")) {
|
|
||||||
return this.utf8_to_b64('home');
|
return this.utf8_to_b64('home');
|
||||||
}
|
}
|
||||||
if (pathName.startsWith('/' + environment.applName + '/')) {
|
if (!isNullOrUndefined(pathName) && !isInArray(pathName, ["", "null", "NULL", "undefined", "---", "unregistered", "unregistered/", "forbidden", "forbidden/"])) {
|
||||||
pathName = pathName.substring(environment.applName.length+2);
|
|
||||||
} else if (pathName.startsWith('/' + environment.applName)) {
|
|
||||||
pathName = pathName.substring(environment.applName.length + 1);
|
|
||||||
} else if (pathName.startsWith(environment.applName + '/')) {
|
|
||||||
pathName = pathName.substring(environment.applName.length+1);
|
|
||||||
} else if (pathName.startsWith(environment.applName)) {
|
|
||||||
pathName = pathName.substring(environment.applName.length);
|
|
||||||
}
|
|
||||||
return this.utf8_to_b64(pathName);
|
return this.utf8_to_b64(pathName);
|
||||||
}
|
}
|
||||||
|
return this.utf8_to_b64('home');
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Request SSO connection
|
* Request SSO connection
|
||||||
*/
|
*/
|
||||||
unHashLocalData(data: string): string {
|
unHashLocalData(data: string): string | undefined {
|
||||||
|
if (isNullOrUndefined(data) || isInArray(data, ["", "null", "NULL", "undefined", "---"])) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
try {
|
||||||
return this.b64_to_utf8(data);
|
return this.b64_to_utf8(data);
|
||||||
}
|
}
|
||||||
|
catch (ex) {
|
||||||
|
console.error(`Can not convert the data: ${data}`);
|
||||||
|
}
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Request SSO connection
|
* Request SSO connection
|
||||||
*/
|
*/
|
||||||
@ -61,9 +67,6 @@ export class SSOService {
|
|||||||
* Request SSO Disconnect
|
* Request SSO Disconnect
|
||||||
*/
|
*/
|
||||||
requestSignOut(name?: string): void {
|
requestSignOut(name?: string): void {
|
||||||
if (name === undefined) {
|
|
||||||
name = 'home';
|
|
||||||
}
|
|
||||||
window.location.href = environment.ssoSignOut + this.hashLocalData(name);
|
window.location.href = environment.ssoSignOut + this.hashLocalData(name);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -72,5 +75,32 @@ export class SSOService {
|
|||||||
requestSignUp(name?: string): void {
|
requestSignUp(name?: string): void {
|
||||||
window.location.href = environment.ssoSignUp + this.hashLocalData(name);
|
window.location.href = environment.ssoSignUp + this.hashLocalData(name);
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Checo if the signUp is authorized (generate by te SSO)
|
||||||
|
* @returns a promise of the State for sign-up
|
||||||
|
*/
|
||||||
|
checkSignUpEnable(): Promise<boolean> {
|
||||||
|
let self = this;
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (isNullOrUndefined(self.signUpEnable)) {
|
||||||
|
this.http.requestJson({
|
||||||
|
server: 'karauth',
|
||||||
|
endPoint: 'system_config/is_sign_up_availlable',
|
||||||
|
requestType: HTTPRequestModel.GET,
|
||||||
|
accept: HTTPMimeType.JSON,
|
||||||
|
contentType: HTTPMimeType.JSON,
|
||||||
|
}).then((response: ModelResponseHttp) =>{
|
||||||
|
self.signUpEnable = response.data.signup;
|
||||||
|
resolve(self.signUpEnable);
|
||||||
|
}).catch((error:any) => {
|
||||||
|
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resolve(self.signUpEnable);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,12 +5,14 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
|
import { Router } from '@angular/router';
|
||||||
import { environment } from 'environments/environment';
|
import { environment } from 'environments/environment';
|
||||||
|
|
||||||
import { HTTPMimeType, HTTPRequestModel, HttpWrapperService, ModelResponseHttp } from './http-wrapper';
|
import { HTTPMimeType, HTTPRequestModel, HttpWrapperService, ModelResponseHttp } from './http-wrapper';
|
||||||
import { StorageService } from 'common/service/local-storage';
|
import { StorageService } from 'common/service/local-storage';
|
||||||
import { SessionService } from './session';
|
import { SessionService } from './session';
|
||||||
import { SSOService } from './sso';
|
import { SSOService } from './sso';
|
||||||
|
import { getApplicationLocation, isNullOrUndefined, sha512 } from 'common/utils';
|
||||||
|
|
||||||
interface MessageLogIn {
|
interface MessageLogIn {
|
||||||
login: string;
|
login: string;
|
||||||
@ -27,7 +29,6 @@ interface MessageAnswer_USER_CONNECT {
|
|||||||
avatar: string
|
avatar: string
|
||||||
}
|
}
|
||||||
|
|
||||||
declare function SHA512(param1: any): any;
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserService {
|
export class UserService {
|
||||||
@ -37,6 +38,7 @@ export class UserService {
|
|||||||
private cookiesToken = 'token';
|
private cookiesToken = 'token';
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private router: Router,
|
||||||
private storageService: StorageService,
|
private storageService: StorageService,
|
||||||
private http: HttpWrapperService,
|
private http: HttpWrapperService,
|
||||||
private sessionService: SessionService,
|
private sessionService: SessionService,
|
||||||
@ -55,6 +57,7 @@ export class UserService {
|
|||||||
removeSession(): void {
|
removeSession(): void {
|
||||||
this.storageService.remove(this.cookiesRememberMe);
|
this.storageService.remove(this.cookiesRememberMe);
|
||||||
this.storageService.removeSession(this.cookiesToken);
|
this.storageService.removeSession(this.cookiesToken);
|
||||||
|
this.storageService.remove(this.cookiesToken);
|
||||||
this.sessionService.destroy();
|
this.sessionService.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,11 +70,11 @@ export class UserService {
|
|||||||
if (elems.length !== 3 ) {
|
if (elems.length !== 3 ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const tokenHeader = decodeURIComponent(escape(window.atob( elems[0] )));
|
//const tokenHeader = decodeURIComponent(window.atob( elems[0] ));
|
||||||
const tokenData = decodeURIComponent(escape(window.atob( elems[1] )));
|
const tokenData = decodeURIComponent(window.atob( elems[1] ));
|
||||||
console.error(`Retreive local token: \nheader=${tokenHeader} \ndata=${tokenData}`);
|
//console.error(`Retreive local token: \nheader=${tokenHeader} \ndata=${tokenData}`);
|
||||||
const parsedData = JSON.parse(tokenData);
|
const parsedData = JSON.parse(tokenData);
|
||||||
console.error(`Retreive exp data=${new Date(parsedData.exp*1000).toISOString()} < ${new Date().toISOString()}`);
|
console.debug(`Retreive token exp data=${new Date(parsedData.exp*1000).toISOString()} < ${new Date().toISOString()}`);
|
||||||
const expireIn = new Date(parsedData.exp*1000);
|
const expireIn = new Date(parsedData.exp*1000);
|
||||||
const nowTime = new Date();
|
const nowTime = new Date();
|
||||||
// TODO: set a marging of 2 hours...
|
// TODO: set a marging of 2 hours...
|
||||||
@ -81,6 +84,7 @@ export class UserService {
|
|||||||
* Check if the system can be connected
|
* Check if the system can be connected
|
||||||
*/
|
*/
|
||||||
checkAutoConnect(): Promise<void> {
|
checkAutoConnect(): Promise<void> {
|
||||||
|
let locationOrigin = getApplicationLocation();
|
||||||
let self = this;
|
let self = this;
|
||||||
return new Promise<void>((resolve, reject) => {
|
return new Promise<void>((resolve, reject) => {
|
||||||
// Need to use the windows global route to prevent the log in cycle ...
|
// Need to use the windows global route to prevent the log in cycle ...
|
||||||
@ -96,20 +100,29 @@ export class UserService {
|
|||||||
console.log(" ==> Check if need reconnect?");
|
console.log(" ==> Check if need reconnect?");
|
||||||
let rememberMe = self.storageService.get(self.cookiesRememberMe)==="true";
|
let rememberMe = self.storageService.get(self.cookiesRememberMe)==="true";
|
||||||
// TODO: in case of jest reload ==> no need to manage the SSO ==> just keep the token ... it in enought...
|
// TODO: in case of jest reload ==> no need to manage the SSO ==> just keep the token ... it in enought...
|
||||||
let token = self.storageService.getSession(self.cookiesToken);
|
let token = null;
|
||||||
|
if (isNullOrUndefined(environment.tokenStoredInPermanentStorage) || environment.tokenStoredInPermanentStorage !== true) {
|
||||||
|
token = self.storageService.getSession(self.cookiesToken);
|
||||||
|
} else {
|
||||||
|
token = self.storageService.get(self.cookiesToken);
|
||||||
|
}
|
||||||
// TODO: check validity of th eToken:
|
// TODO: check validity of th eToken:
|
||||||
if (self.isTokenUpToDate(token)) {
|
if (self.isTokenUpToDate(token)) {
|
||||||
// remove in case of fail !!!
|
// remove in case of fail !!!
|
||||||
this.storageService.removeSession(this.cookiesToken);
|
this.storageService.removeSession(this.cookiesToken);
|
||||||
|
this.storageService.remove(this.cookiesToken);
|
||||||
self.startSession(token, rememberMe).then(() => {
|
self.startSession(token, rememberMe).then(() => {
|
||||||
|
self.router.navigateByUrl(locationOrigin);
|
||||||
|
console.log(`update global URL = ${locationOrigin}`);
|
||||||
resolve();
|
resolve();
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
// jump in the sign-in page (automatically of request remember-me)
|
// jump in the sign-in page (automatically of request remember-me)
|
||||||
if(rememberMe) {
|
if(rememberMe) {
|
||||||
// jump to the sso !!! (remove local data to prevent login loop)
|
// jump to the sso !!! (remove local data to prevent login loop)
|
||||||
this.storageService.remove(this.cookiesRememberMe);
|
this.storageService.remove(this.cookiesRememberMe);
|
||||||
|
this.storageService.remove(this.cookiesToken);
|
||||||
this.storageService.removeSession(this.cookiesToken);
|
this.storageService.removeSession(this.cookiesToken);
|
||||||
self.ssoService.requestSignIn();
|
self.ssoService.requestSignIn(locationOrigin);
|
||||||
reject();
|
reject();
|
||||||
}
|
}
|
||||||
resolve();
|
resolve();
|
||||||
@ -119,8 +132,9 @@ export class UserService {
|
|||||||
if(rememberMe) {
|
if(rememberMe) {
|
||||||
// jump to the sso !!! (remove local data to prevent login loop)
|
// jump to the sso !!! (remove local data to prevent login loop)
|
||||||
this.storageService.remove(this.cookiesRememberMe);
|
this.storageService.remove(this.cookiesRememberMe);
|
||||||
|
this.storageService.remove(this.cookiesToken);
|
||||||
this.storageService.removeSession(this.cookiesToken);
|
this.storageService.removeSession(this.cookiesToken);
|
||||||
self.ssoService.requestSignIn();
|
self.ssoService.requestSignIn(locationOrigin);
|
||||||
reject();
|
reject();
|
||||||
}
|
}
|
||||||
resolve();
|
resolve();
|
||||||
@ -136,9 +150,11 @@ export class UserService {
|
|||||||
if(rememberMe === true) {
|
if(rememberMe === true) {
|
||||||
self.storageService.set(self.cookiesRememberMe, rememberMe?"true":"false");
|
self.storageService.set(self.cookiesRememberMe, rememberMe?"true":"false");
|
||||||
}
|
}
|
||||||
// transfer the session token property
|
if (isNullOrUndefined(environment.tokenStoredInPermanentStorage) || environment.tokenStoredInPermanentStorage !== true) {
|
||||||
self.sessionService.setToken(token);
|
|
||||||
self.storageService.setSession(self.cookiesToken, token);
|
self.storageService.setSession(self.cookiesToken, token);
|
||||||
|
} else {
|
||||||
|
self.storageService.set(self.cookiesToken, token);
|
||||||
|
}
|
||||||
resolve(self.sessionService.getLogin());
|
resolve(self.sessionService.getLogin());
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
reject('sdfsdfsdf');
|
reject('sdfsdfsdf');
|
||||||
@ -160,12 +176,17 @@ export class UserService {
|
|||||||
// TODO: check type ...
|
// TODO: check type ...
|
||||||
console.log(`loginWithToken : get some data to check: ${JSON.stringify(response.data)}`)
|
console.log(`loginWithToken : get some data to check: ${JSON.stringify(response.data)}`)
|
||||||
self.sessionService.create(
|
self.sessionService.create(
|
||||||
response.data.sessionId,
|
{
|
||||||
response.data.id,
|
sessionId: response.data.sessionId,
|
||||||
response.data.login,
|
userId: response.data.id,
|
||||||
response.data.email,
|
userLogin: response.data.login,
|
||||||
response.data.role,
|
userEMail: response.data.email,
|
||||||
response.data.avatar);
|
userAdmin: response.data.admin,
|
||||||
|
userBlocked: response.data.blocked,
|
||||||
|
userRemoved: response.data.removed,
|
||||||
|
userAvatar: response.data.avatar,
|
||||||
|
tokenJwt: token,
|
||||||
|
});
|
||||||
resolve(true);
|
resolve(true);
|
||||||
}).catch((error:any) => {
|
}).catch((error:any) => {
|
||||||
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
|
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
|
||||||
@ -174,7 +195,7 @@ export class UserService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
create(login : string, email : string, password : string) {
|
create(login : string, email : string, password : string) {
|
||||||
return this.createSha(login, email, SHA512(password));
|
return this.createSha(login, email, sha512(password));
|
||||||
}
|
}
|
||||||
createSha(login : string, email : string, password : string) {
|
createSha(login : string, email : string, password : string) {
|
||||||
let data = {
|
let data = {
|
||||||
|
17
front/src/common/utils/applPath.ts
Normal file
17
front/src/common/utils/applPath.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { environment } from "environments/environment";
|
||||||
|
|
||||||
|
export function getApplicationLocation(): string {
|
||||||
|
let pathName = location.pathname;
|
||||||
|
//console.log("start Path-name: '" + pathName + "'");
|
||||||
|
//console.log("check with: '" + environment.applName + "/sso/" + "'");
|
||||||
|
if (pathName.startsWith('/' + environment.applName + '/')) {
|
||||||
|
pathName = pathName.substring(environment.applName.length+2);
|
||||||
|
} else if (pathName.startsWith('/' + environment.applName)) {
|
||||||
|
pathName = pathName.substring(environment.applName.length + 1);
|
||||||
|
} else if (pathName.startsWith(environment.applName + '/')) {
|
||||||
|
pathName = pathName.substring(environment.applName.length+1);
|
||||||
|
} else if (pathName.startsWith(environment.applName)) {
|
||||||
|
pathName = pathName.substring(environment.applName.length);
|
||||||
|
}
|
||||||
|
return pathName;
|
||||||
|
}
|
@ -30,7 +30,6 @@ export interface SelectModel {
|
|||||||
* @breif Generic interface to access to the BDD (no BDD, direct file IO)
|
* @breif Generic interface to access to the BDD (no BDD, direct file IO)
|
||||||
*/
|
*/
|
||||||
export class DataInterface {
|
export class DataInterface {
|
||||||
|
|
||||||
static extractLimitOne(data: NodeData[], key: string): any[] {
|
static extractLimitOne(data: NodeData[], key: string): any[] {
|
||||||
const out = [];
|
const out = [];
|
||||||
for (let iii=0; iii<data.length; iii++) {
|
for (let iii=0; iii<data.length; iii++) {
|
||||||
@ -193,7 +192,7 @@ export class DataInterface {
|
|||||||
if(select.length === 0) {
|
if(select.length === 0) {
|
||||||
find = false;
|
find = false;
|
||||||
}
|
}
|
||||||
//console.log("Check : " + JSON.stringify(values[iiiElem], null, 2));
|
// console.log("Check : " + JSON.stringify(_values[iii_elem], null, 2));
|
||||||
for(let iiiSelect = 0; iiiSelect < select.length; iiiSelect++) {
|
for(let iiiSelect = 0; iiiSelect < select.length; iiiSelect++) {
|
||||||
let control = select[iiiSelect];
|
let control = select[iiiSelect];
|
||||||
let valueElement = values[iiiElem][control.key]
|
let valueElement = values[iiiElem][control.key]
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
|
|
||||||
|
|
||||||
|
import { getApplicationLocation } from "./applPath";
|
||||||
import { DataInterface, TypeCheck } from "./dataInterface";
|
import { DataInterface, TypeCheck } from "./dataInterface";
|
||||||
import { isArray, isArrayOf, isBoolean, isNull, isNullOrUndefined, isNumber, isNumberFinite, isObject, isOptionalOf, isOptionalArrayOf, isString, isUndefined, isArrayOfs } from "./validator";
|
import { sha512 } from "./sha512";
|
||||||
|
import { isArray, isArrayOf, isBoolean, isNull, isNullOrUndefined, isNumber, isNumberFinite, isObject, isOptionalOf, isOptionalArrayOf, isString, isUndefined, isArrayOfs, isInArray, isStringNullOrUndefined } from "./validator";
|
||||||
|
|
||||||
export {
|
export {
|
||||||
isNumber,
|
isNumber,
|
||||||
@ -17,7 +19,11 @@ export {
|
|||||||
isArrayOfs,
|
isArrayOfs,
|
||||||
isOptionalOf,
|
isOptionalOf,
|
||||||
isOptionalArrayOf,
|
isOptionalArrayOf,
|
||||||
|
isInArray,
|
||||||
|
isStringNullOrUndefined,
|
||||||
DataInterface,
|
DataInterface,
|
||||||
TypeCheck,
|
TypeCheck,
|
||||||
|
getApplicationLocation,
|
||||||
|
sha512,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,18 +2,18 @@
|
|||||||
* Secure Hash Algorithm (SHA512)
|
* Secure Hash Algorithm (SHA512)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function SHA512(str) {
|
export function sha512(str) {
|
||||||
function int64(msint_32, lsint_32) {
|
function int64(msint_32, lsint_32) {
|
||||||
this.highOrder = msint_32;
|
this.highOrder = msint_32;
|
||||||
this.lowOrder = lsint_32;
|
this.lowOrder = lsint_32;
|
||||||
}
|
}
|
||||||
|
|
||||||
var H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),
|
let H = [new int64(0x6a09e667, 0xf3bcc908), new int64(0xbb67ae85, 0x84caa73b),
|
||||||
new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),
|
new int64(0x3c6ef372, 0xfe94f82b), new int64(0xa54ff53a, 0x5f1d36f1),
|
||||||
new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),
|
new int64(0x510e527f, 0xade682d1), new int64(0x9b05688c, 0x2b3e6c1f),
|
||||||
new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];
|
new int64(0x1f83d9ab, 0xfb41bd6b), new int64(0x5be0cd19, 0x137e2179)];
|
||||||
|
|
||||||
var K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),
|
let K = [new int64(0x428a2f98, 0xd728ae22), new int64(0x71374491, 0x23ef65cd),
|
||||||
new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),
|
new int64(0xb5c0fbcf, 0xec4d3b2f), new int64(0xe9b5dba5, 0x8189dbbc),
|
||||||
new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),
|
new int64(0x3956c25b, 0xf348b538), new int64(0x59f111f1, 0xb605d019),
|
||||||
new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),
|
new int64(0x923f82a4, 0xaf194f9b), new int64(0xab1c5ed5, 0xda6d8118),
|
||||||
@ -54,21 +54,21 @@ function SHA512(str) {
|
|||||||
new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),
|
new int64(0x4cc5d4be, 0xcb3e42b6), new int64(0x597f299c, 0xfc657e2a),
|
||||||
new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];
|
new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)];
|
||||||
|
|
||||||
var W = new Array(64);
|
let W = new Array(64);
|
||||||
var a, b, c, d, e, f, g, h, i, j;
|
let a, b, c, d, e, f, g, h, i, j;
|
||||||
var T1, T2;
|
let T1, T2;
|
||||||
var charsize = 8;
|
let charsize = 8;
|
||||||
|
|
||||||
function utf8_encode(str) {
|
function utf8_encode(str) {
|
||||||
return unescape(encodeURIComponent(str));
|
return unescape(encodeURIComponent(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
function str2binb(str) {
|
function str2binb(str) {
|
||||||
var bin = [];
|
let bin = [];
|
||||||
var mask = (1 << charsize) - 1;
|
let mask = (1 << charsize) - 1;
|
||||||
var len = str.length * charsize;
|
let len = str.length * charsize;
|
||||||
|
|
||||||
for (var i = 0; i < len; i += charsize) {
|
for (let i = 0; i < len; i += charsize) {
|
||||||
bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 - charsize - (i % 32));
|
bin[i >> 5] |= (str.charCodeAt(i / charsize) & mask) << (32 - charsize - (i % 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,12 +76,12 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function binb2hex(binarray) {
|
function binb2hex(binarray) {
|
||||||
var hex_tab = "0123456789abcdef";
|
let hex_tab = "0123456789abcdef";
|
||||||
var str = "";
|
let str = "";
|
||||||
var length = binarray.length * 4;
|
let length = binarray.length * 4;
|
||||||
var srcByte;
|
let srcByte;
|
||||||
|
|
||||||
for (var i = 0; i < length; i += 1) {
|
for (let i = 0; i < length; i += 1) {
|
||||||
srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8);
|
srcByte = binarray[i >> 2] >> ((3 - (i % 4)) * 8);
|
||||||
str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);
|
str += hex_tab.charAt((srcByte >> 4) & 0xF) + hex_tab.charAt(srcByte & 0xF);
|
||||||
}
|
}
|
||||||
@ -90,7 +90,7 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function safe_add_2(x, y) {
|
function safe_add_2(x, y) {
|
||||||
var lsw, msw, lowOrder, highOrder;
|
let lsw, msw, lowOrder, highOrder;
|
||||||
|
|
||||||
lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);
|
lsw = (x.lowOrder & 0xFFFF) + (y.lowOrder & 0xFFFF);
|
||||||
msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);
|
msw = (x.lowOrder >>> 16) + (y.lowOrder >>> 16) + (lsw >>> 16);
|
||||||
@ -104,7 +104,7 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function safe_add_4(a, b, c, d) {
|
function safe_add_4(a, b, c, d) {
|
||||||
var lsw, msw, lowOrder, highOrder;
|
let lsw, msw, lowOrder, highOrder;
|
||||||
|
|
||||||
lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);
|
lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF);
|
||||||
msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);
|
msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (lsw >>> 16);
|
||||||
@ -118,7 +118,7 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function safe_add_5(a, b, c, d, e) {
|
function safe_add_5(a, b, c, d, e) {
|
||||||
var lsw, msw, lowOrder, highOrder;
|
let lsw, msw, lowOrder, highOrder;
|
||||||
|
|
||||||
lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);
|
lsw = (a.lowOrder & 0xFFFF) + (b.lowOrder & 0xFFFF) + (c.lowOrder & 0xFFFF) + (d.lowOrder & 0xFFFF) + (e.lowOrder & 0xFFFF);
|
||||||
msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);
|
msw = (a.lowOrder >>> 16) + (b.lowOrder >>> 16) + (c.lowOrder >>> 16) + (d.lowOrder >>> 16) + (e.lowOrder >>> 16) + (lsw >>> 16);
|
||||||
@ -160,9 +160,9 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sigma0(x) {
|
function sigma0(x) {
|
||||||
var rotr28 = rotr(x, 28);
|
let rotr28 = rotr(x, 28);
|
||||||
var rotr34 = rotr(x, 34);
|
let rotr34 = rotr(x, 34);
|
||||||
var rotr39 = rotr(x, 39);
|
let rotr39 = rotr(x, 39);
|
||||||
|
|
||||||
return new int64(
|
return new int64(
|
||||||
rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,
|
rotr28.highOrder ^ rotr34.highOrder ^ rotr39.highOrder,
|
||||||
@ -171,9 +171,9 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function sigma1(x) {
|
function sigma1(x) {
|
||||||
var rotr14 = rotr(x, 14);
|
let rotr14 = rotr(x, 14);
|
||||||
var rotr18 = rotr(x, 18);
|
let rotr18 = rotr(x, 18);
|
||||||
var rotr41 = rotr(x, 41);
|
let rotr41 = rotr(x, 41);
|
||||||
|
|
||||||
return new int64(
|
return new int64(
|
||||||
rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,
|
rotr14.highOrder ^ rotr18.highOrder ^ rotr41.highOrder,
|
||||||
@ -182,7 +182,7 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function gamma0(x) {
|
function gamma0(x) {
|
||||||
var rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);
|
let rotr1 = rotr(x, 1), rotr8 = rotr(x, 8), shr7 = shr(x, 7);
|
||||||
|
|
||||||
return new int64(
|
return new int64(
|
||||||
rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,
|
rotr1.highOrder ^ rotr8.highOrder ^ shr7.highOrder,
|
||||||
@ -191,9 +191,9 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function gamma1(x) {
|
function gamma1(x) {
|
||||||
var rotr19 = rotr(x, 19);
|
let rotr19 = rotr(x, 19);
|
||||||
var rotr61 = rotr(x, 61);
|
let rotr61 = rotr(x, 61);
|
||||||
var shr6 = shr(x, 6);
|
let shr6 = shr(x, 6);
|
||||||
|
|
||||||
return new int64(
|
return new int64(
|
||||||
rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,
|
rotr19.highOrder ^ rotr61.highOrder ^ shr6.highOrder,
|
||||||
@ -216,13 +216,13 @@ function SHA512(str) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
str = utf8_encode(str);
|
str = utf8_encode(str);
|
||||||
strlen = str.length*charsize;
|
let strlen = str.length*charsize;
|
||||||
str = str2binb(str);
|
str = str2binb(str);
|
||||||
|
|
||||||
str[strlen >> 5] |= 0x80 << (24 - strlen % 32);
|
str[strlen >> 5] |= 0x80 << (24 - strlen % 32);
|
||||||
str[(((strlen + 128) >> 10) << 5) + 31] = strlen;
|
str[(((strlen + 128) >> 10) << 5) + 31] = strlen;
|
||||||
|
|
||||||
for (var i = 0; i < str.length; i += 32) {
|
for (let i = 0; i < str.length; i += 32) {
|
||||||
a = H[0];
|
a = H[0];
|
||||||
b = H[1];
|
b = H[1];
|
||||||
c = H[2];
|
c = H[2];
|
||||||
@ -232,7 +232,7 @@ function SHA512(str) {
|
|||||||
g = H[6];
|
g = H[6];
|
||||||
h = H[7];
|
h = H[7];
|
||||||
|
|
||||||
for (var j = 0; j < 80; j++) {
|
for (let j = 0; j < 80; j++) {
|
||||||
if (j < 16) {
|
if (j < 16) {
|
||||||
W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);
|
W[j] = new int64(str[j*2 + i], str[j*2 + i + 1]);
|
||||||
} else {
|
} else {
|
||||||
@ -261,8 +261,8 @@ function SHA512(str) {
|
|||||||
H[7] = safe_add_2(h, H[7]);
|
H[7] = safe_add_2(h, H[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
var binarray = [];
|
let binarray = [];
|
||||||
for (var i = 0; i < H.length; i++) {
|
for (let i = 0; i < H.length; i++) {
|
||||||
binarray.push(H[i].highOrder);
|
binarray.push(H[i].highOrder);
|
||||||
binarray.push(H[i].lowOrder);
|
binarray.push(H[i].lowOrder);
|
||||||
}
|
}
|
@ -23,11 +23,22 @@ export function isUndefined(data: any): data is undefined {
|
|||||||
export function isNullOrUndefined(data: any): data is undefined | null {
|
export function isNullOrUndefined(data: any): data is undefined | null {
|
||||||
return data === undefined || data === null;
|
return data === undefined || data === null;
|
||||||
}
|
}
|
||||||
|
export function isStringNullOrUndefined(data: any): data is undefined | null {
|
||||||
|
return data === "undefined" || data === "null" || data === "";
|
||||||
|
}
|
||||||
export function isObject(data: any): data is any {
|
export function isObject(data: any): data is any {
|
||||||
return !isNullOrUndefined(data)
|
return !isNullOrUndefined(data)
|
||||||
&& typeof data === 'object'
|
&& typeof data === 'object'
|
||||||
&& !isArray(data);
|
&& !isArray(data);
|
||||||
}
|
}
|
||||||
|
export function isInArray(data: any, listElment: any[]): boolean {
|
||||||
|
for (let iii=0; iii<listElment.length; iii++) {
|
||||||
|
if (listElment[iii] === data) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
export function isArrayOf<TYPE>(data: any, typeChecker: (subData: any) => subData is TYPE, length?: number): data is TYPE[] {
|
export function isArrayOf<TYPE>(data: any, typeChecker: (subData: any) => subData is TYPE, length?: number): data is TYPE[] {
|
||||||
if (!isArray(data)) {
|
if (!isArray(data)) {
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
// The list of which env maps to which file can be found in `.angular-cli.json`.
|
// The list of which env maps to which file can be found in `.angular-cli.json`.
|
||||||
|
|
||||||
export const environment = {
|
export const environment = {
|
||||||
production: false,
|
production: true,
|
||||||
// URL of development API
|
// URL of development API
|
||||||
applName: "karusic",
|
applName: "karusic",
|
||||||
defaultServer: "karusic",
|
defaultServer: "karusic",
|
||||||
@ -16,5 +16,5 @@ export const environment = {
|
|||||||
ssoSignUp: `${location.origin}/karso/signup/karusic/`,
|
ssoSignUp: `${location.origin}/karso/signup/karusic/`,
|
||||||
ssoSignOut: `${location.origin}/karso/signout/karusic/`,
|
ssoSignOut: `${location.origin}/karso/signout/karusic/`,
|
||||||
frontBaseUrl: '',
|
frontBaseUrl: '',
|
||||||
apiMode: 'REWRITE'
|
tokenStoredInPermanentStorage: false,
|
||||||
};
|
};
|
@ -3,7 +3,7 @@
|
|||||||
// `ng build --env=prod` then `environment.prod.ts` will be used instead.
|
// `ng build --env=prod` then `environment.prod.ts` will be used instead.
|
||||||
// The list of which env maps to which file can be found in `.angular-cli.json`.
|
// The list of which env maps to which file can be found in `.angular-cli.json`.
|
||||||
|
|
||||||
export const environment_back_prod = {
|
const environment_back_prod = {
|
||||||
production: false,
|
production: false,
|
||||||
// URL of development API
|
// URL of development API
|
||||||
applName: "karusic",
|
applName: "karusic",
|
||||||
@ -16,10 +16,10 @@ export const environment_back_prod = {
|
|||||||
ssoSignUp: 'http://192.168.1.156/karso/signup/karusic-dev/',
|
ssoSignUp: 'http://192.168.1.156/karso/signup/karusic-dev/',
|
||||||
ssoSignOut: 'http://192.168.1.156/karso/signout/karusic-dev/',
|
ssoSignOut: 'http://192.168.1.156/karso/signout/karusic-dev/',
|
||||||
frontBaseUrl: '',
|
frontBaseUrl: '',
|
||||||
apiMode: 'REWRITE'
|
tokenStoredInPermanentStorage: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const environment_local = {
|
const environment_local = {
|
||||||
production: false,
|
production: false,
|
||||||
// URL of development API
|
// URL of development API
|
||||||
applName: "karusic",
|
applName: "karusic",
|
||||||
@ -32,10 +32,10 @@ export const environment_local = {
|
|||||||
ssoSignUp: 'http://192.168.1.156/karso/signup/karusic-dev/',
|
ssoSignUp: 'http://192.168.1.156/karso/signup/karusic-dev/',
|
||||||
ssoSignOut: 'http://192.168.1.156/karso/signout/karusic-dev/',
|
ssoSignOut: 'http://192.168.1.156/karso/signout/karusic-dev/',
|
||||||
frontBaseUrl: '',
|
frontBaseUrl: '',
|
||||||
apiMode: 'REWRITE'
|
tokenStoredInPermanentStorage: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const environment_full_local = {
|
const environment_full_local = {
|
||||||
production: false,
|
production: false,
|
||||||
// URL of development API
|
// URL of development API
|
||||||
applName: "karusic",
|
applName: "karusic",
|
||||||
@ -48,10 +48,10 @@ export const environment_full_local = {
|
|||||||
ssoSignUp: 'http://localhost:4200/signup/karusic-dev/',
|
ssoSignUp: 'http://localhost:4200/signup/karusic-dev/',
|
||||||
ssoSignOut: 'http://localhost:4200/signout/karusic-dev/',
|
ssoSignOut: 'http://localhost:4200/signout/karusic-dev/',
|
||||||
frontBaseUrl: '',
|
frontBaseUrl: '',
|
||||||
apiMode: 'REWRITE'
|
tokenStoredInPermanentStorage: false,
|
||||||
};
|
};
|
||||||
|
|
||||||
export const environment_hybrid = {
|
const environment_hybrid = {
|
||||||
production: false,
|
production: false,
|
||||||
// URL of development API
|
// URL of development API
|
||||||
applName: "karusic",
|
applName: "karusic",
|
||||||
@ -64,7 +64,7 @@ export const environment_hybrid = {
|
|||||||
ssoSignUp: 'http://localhost:4200/signup/karusic-dev/',
|
ssoSignUp: 'http://localhost:4200/signup/karusic-dev/',
|
||||||
ssoSignOut: 'http://localhost:4200/signout/karusic-dev/',
|
ssoSignOut: 'http://localhost:4200/signout/karusic-dev/',
|
||||||
frontBaseUrl: '',
|
frontBaseUrl: '',
|
||||||
apiMode: 'REWRITE'
|
tokenStoredInPermanentStorage: false,
|
||||||
};
|
};
|
||||||
export const environment = environment_full_local;
|
export const environment = environment_back_prod;
|
||||||
|
|
||||||
|
@ -18,10 +18,6 @@
|
|||||||
<!-- some generic sheets -->
|
<!-- some generic sheets -->
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&lang=en"/>
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:regular,bold,italic,thin,light,bolditalic,black,medium&lang=en"/>
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"/>
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons"/>
|
||||||
|
|
||||||
<!-- Some tools -->
|
|
||||||
<script src="assets/js_3rd_party/dateFormat.min.js"></script>
|
|
||||||
<script src="assets/js_3rd_party/sha512.js"></script>
|
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="full-back"> </div>
|
<div class="full-back"> </div>
|
||||||
|
@ -22,6 +22,9 @@ docker-compose up -d
|
|||||||
|
|
||||||
build the local image:
|
build the local image:
|
||||||
|
|
||||||
|
docker pull archlinux:base-devel
|
||||||
|
docker pull bellsoft/liberica-openjdk-alpine:latest
|
||||||
|
|
||||||
docker build -t gitea.atria-soft.org/kangaroo-and-rabbit/karusic:latest .
|
docker build -t gitea.atria-soft.org/kangaroo-and-rabbit/karusic:latest .
|
||||||
|
|
||||||
docker login gitea.atria-soft.org
|
docker login gitea.atria-soft.org
|
||||||
|
Loading…
Reference in New Issue
Block a user