EzyPlatform 0.3.6 được nâng cấp và bổ sung thêm các tính năng:
  1. Cập nhật tính năng import người dùng từ tập tin.
  2. Nâng cấp phiên bản các thư viện.
  3. Cho phép một admin xem được toàn bộ media hay không.
  4. Cập nhật lớp PaginationParameters.
  5. Bổ sung ngôn ngữ tiếng Trung.
  6. Cập nhật lớp Numbers.
  7. Bổ sung phương thức javascript flattenObject.
  8. Bổ sung phương thức javascript để đọc tập tin csv.
  9. Bổ sung lớp LocalDateTimeRangeModel.

Cập nhật tính năng import người dùng từ tập tin

Cho phép cập nhật thông tin địa chỉ của người dùng.

Screenshot 2024-12-15 at 20.57.07.png

Nâng cấp phiên bản các thư viện

  • Nâng cấp các thư viện thuộc hệ sinh thái ezyfox lên 1.2.9

Cho phép một admin xem được toàn bộ media hay không

Mặc định một quản trị viên sẽ không được phép truy cập vào toàn bộ media mà phải được cấp quyền.

Screenshot 2024-12-15 at 20.59.07.png

Cập nhật lớp PaginationParameters

Bổ sung 2 hàm mới:

public static String makeOrderBy(
    SortOrder sortOrder,
    boolean nextPage,
    String[] entityNames,
    String[] fieldNames
)

public static String makePaginationCondition(
    SortOrder sortOrder,
    boolean nextPage,
    String[] entityNames,
    String[] fieldNames,
    String[] parameterNames
)

Để cho phép truyền tên các tham số và entity thay vì mặc định là e.[field name].

Bổ sung ngôn ngữ tiếng Trung

Đã bổ sung ngôn ngữ tiếng trung cho phần core cho giao diện quản trị.

Screenshot 2024-12-15 at 21.03.07.png

Cập nhật lớp Numbers

Bổ sung thêm hai hàm mới:

public static String toRandomText(long number, int minLength) {
    String suffix = String.valueOf(number);
    if (suffix.length() >= minLength - 1) {
        return "0" + suffix;
    }
    int randomLength = minLength - suffix.length() - 1;
    if (randomLength > 9) {
        randomLength = 9;
    }
    StringBuilder randomNumber = new StringBuilder();
    for (int i = 0; i < randomLength; ++i) {
        randomNumber.append(
            ThreadLocalRandom.current().nextInt(1, 9)
        );
    }
    int zeroLength = minLength - randomLength - suffix.length() - 1;
    if (zeroLength > 0) {
        for (int i = 0; i < zeroLength; ++i) {
            randomNumber.append("0");
        }
    }
    return String.valueOf(randomLength) + randomNumber + suffix;
}

public static long fromRandomText(String randomText) {
    int randomLength = Integer.parseInt(
        randomText.substring(0, 1)
    );
    if (randomLength == 0) {
        return Long.parseLong(randomText);
    }
    return Long.parseLong(
        randomText.substring(randomLength + 1)
    );
}

Để cho phép tạo ra một chuỗi ngẫu nhiên có kiểm soát nhằm mục đích giữ nguyên được ý nghĩa của một chuỗi số với độ dài tối thiểu.

Bổ sung phương thức javascript flattenObject

Cho phép làm phẳng các đối tượng javascript lồng nhau thằng một đối tượng, ví dụ:

{
  "user": {
    "id": 1,
    "name": "Dzung",
    "address": {
      "street": "Do Duc Duc",
      "city": "Ha Noi",
      "country": {
        "name": "Viet Nam",
        "code": "VN"
      }
    }
  }
}

Sẽ được làm phẳng thông qua hàm flattenObject để trở thành:

{
  "user.id": 1,
  "user.name": "Dzung",
  "user.address.street": "Do Duc Duc",
  "user.address.city": "Ha Noi",
  "user.address.country.name": "Viet Nam",
  "user.address.country.code": "VN"
}

Bổ sung phương thức javascript để đọc tập tin csv

Bổ sung thêm các hàm:

ezyadmin.onCsvFileChanged = function(input, callback, includeFirstLine) {
    var file = input.files[0];
    if (file) {
        var reader = new FileReader();
        reader.onload = function(e) {
            var content = e.target.result;
            var rowsList = ezyadmin.parseCsvContent(
                content
            );
            callback(file, rowsList);
        };
        reader.readAsText(file);
    }
}

ezyadmin.parseCsvContent = function(content, includeFirstLine) {
    var lines = content.split('n');
    var rows = [];
    if (lines.length) {
        var firstLine = lines[0];
        var commas = firstLine.indexOf(',') >= 0 ? ',' : ';';
        if (!includeFirstLine) {
            lines = lines.slice(1);
        }
        lines.forEach((line) => {
            rows.push(ezyadmin.readCsvLine(line, commas));
        });
    }
    return rows;
}

ezyadmin.readCsvLine = function (line, commas) {
    var cells = [];
    var cell = '';
    var strs = line.split(commas);
    for (var i = 0; i < strs.length; ++i) {
        var str = strs[i].trim();
        if (cell.startsWith('"')) {
            if (str.endsWith('"')) {
                cell += strs[i].slice(0, strs[i].lastIndexOf('"') + 1);
                cell = cell.slice(1, cell.length - 1);
                cells.push(cell.trim());
                cell = '';
            } else {
                cell += strs[i] + commas;
            }
        } else {
            if (str.startsWith('"')) {
                cell = strs[i].slice(strs[i].indexOf('"'));
            } else {
                cells.push(str);
                cell = '';
            }
        }
    }
    return cells;
};

Để đọc và bóc tách dữ liệu từ tập tin csv.

Bổ sung lớp LocalDateTimeRangeModel

Lớp này cho phép phân tích các khoảng thời gian từ dạng chuỗi sang dạng LocalDateTime.