Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 591f5dd3af | |||
| a6983780f5 | |||
| 1db28b5bc0 | |||
| 285343218b | |||
| f402122d0c | |||
| 4339e4fd98 | |||
| 16cbcdff60 | |||
| 8dc77f52e4 | |||
| b04b9b92a6 | |||
| 8d66ed4cbe | |||
| b0ee825e0a | |||
| a321c813de | |||
| fda40d72f8 | |||
| 2375746d91 | |||
| cf0cf2f5e9 | |||
| 3e71ecc6cb | |||
| 1302165ab2 | |||
| d08138c9e1 | |||
| 4cd1ea3277 | |||
| 1059164b4a | |||
| f438bea4cc | |||
| 9394ca597c | |||
| 53fe79fbbd | |||
| d62534b3eb | |||
| 18e8e3ffd1 | |||
| ae55a76ca7 | |||
| cf485055a6 | |||
| 968e5bfb95 | |||
| 6de5f1f660 |
+15
-10
@@ -1,15 +1,15 @@
|
|||||||
FROM alpine:3.22 AS svelte_build
|
FROM alpine:3.22 AS svelte_build
|
||||||
RUN apk add npm
|
RUN apk add npm
|
||||||
RUN adduser -Dh /home/svelte svelte
|
RUN adduser -Dh /home/svelte svelte
|
||||||
ADD . /home/svelte/Umbrella
|
ADD frontend /home/svelte/Umbrella/frontend
|
||||||
RUN chown -R svelte /home/svelte/Umbrella
|
RUN chown -R svelte /home/svelte/Umbrella
|
||||||
USER svelte
|
USER svelte
|
||||||
WORKDIR /home/svelte/Umbrella/frontend
|
WORKDIR /home/svelte/Umbrella/frontend
|
||||||
RUN npm install && npm run build
|
RUN npm install && npm run build
|
||||||
|
|
||||||
|
|
||||||
FROM alpine AS java_build
|
FROM alpine:3.22 AS java_build
|
||||||
RUN apk add gradle fontconfig font-opensans openjdk21-jre
|
RUN apk add gradle
|
||||||
ADD . /Umbrella
|
ADD . /Umbrella
|
||||||
WORKDIR /Umbrella
|
WORKDIR /Umbrella
|
||||||
COPY --from=svelte_build /home/svelte/Umbrella/frontend/dist web/src/main/resources/web
|
COPY --from=svelte_build /home/svelte/Umbrella/frontend/dist web/src/main/resources/web
|
||||||
@@ -17,13 +17,18 @@ RUN gradle --no-daemon build
|
|||||||
|
|
||||||
|
|
||||||
FROM alpine
|
FROM alpine
|
||||||
RUN apk add bash fontconfig font-opensans graphviz openjdk21-jre weasyprint
|
RUN apk --no-cache add bash fontconfig font-opensans graphviz openjdk21-jre tzdata weasyprint \
|
||||||
RUN adduser -D umbrella
|
&& adduser -D umbrella
|
||||||
COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/
|
|
||||||
RUN chown -R umbrella /home/umbrella
|
|
||||||
ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar
|
|
||||||
USER umbrella
|
|
||||||
WORKDIR /home/umbrella
|
WORKDIR /home/umbrella
|
||||||
RUN mkdir .config && ln -s /host/config.json .config/Umbrella.json
|
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
CMD java -jar jar/backend.jar
|
CMD java -jar jar/backend.jar
|
||||||
|
|
||||||
|
ADD https://github.com/plantuml/plantuml/releases/download/v1.2025.10/plantuml-1.2025.10.jar /home/umbrella/plantuml.jar
|
||||||
|
COPY --from=java_build /Umbrella/backend/build/libs/backend.jar /home/umbrella/jar/
|
||||||
|
RUN mkdir .config \
|
||||||
|
&& ln -s /host/config.json .config/Umbrella.json \
|
||||||
|
&& chmod a+rx plantuml.jar \
|
||||||
|
&& chown -R umbrella . \
|
||||||
|
&& ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime
|
||||||
|
USER umbrella
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
FROM alpine:3.22
|
FROM alpine:3.22
|
||||||
LABEL Maintainer "Stephan Richter <s.richter@srsoftware.de>"
|
LABEL Maintainer "Stephan Richter"
|
||||||
ARG UID=1000
|
ARG UID=1000
|
||||||
ARG GID=1000
|
ARG GID=1000
|
||||||
RUN apk add bash npm
|
RUN apk add bash npm
|
||||||
|
|||||||
@@ -35,11 +35,12 @@ import org.json.JSONObject;
|
|||||||
|
|
||||||
public class Util {
|
public class Util {
|
||||||
public static final System.Logger LOG = System.getLogger("Util");
|
public static final System.Logger LOG = System.getLogger("Util");
|
||||||
private static final Pattern UML_PATTERN = Pattern.compile("@start(\\w+)(.*)@end(\\1)",Pattern.DOTALL);
|
private static final Pattern UML_PATTERN = Pattern.compile("@start(\\w+)(.*?)@end(\\1)",Pattern.DOTALL);
|
||||||
private static File plantumlJar = null;
|
private static File plantumlJar = null;
|
||||||
private static final JParsedown MARKDOWN = new JParsedown();
|
private static final JParsedown MARKDOWN = new JParsedown();
|
||||||
public static final String SHA1 = "SHA-1";
|
public static final String SHA1 = "SHA-1";
|
||||||
private static final MessageDigest SHA1_DIGEST;
|
private static final MessageDigest SHA1_DIGEST;
|
||||||
|
private static final Map<Integer,String> umlCache = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
try {
|
try {
|
||||||
@@ -79,11 +80,22 @@ public class Util {
|
|||||||
try {
|
try {
|
||||||
if (plantumlJar != null && plantumlJar.exists()) {
|
if (plantumlJar != null && plantumlJar.exists()) {
|
||||||
var matcher = UML_PATTERN.matcher(source);
|
var matcher = UML_PATTERN.matcher(source);
|
||||||
if (matcher.find()) {
|
while (matcher.find()) {
|
||||||
var uml = matcher.group(0).trim();
|
var uml = matcher.group(0).trim();
|
||||||
var start = matcher.start(0);
|
var start = matcher.start(0);
|
||||||
var end = matcher.end(0);
|
var end = matcher.end(0);
|
||||||
|
|
||||||
|
var umlHash = uml.hashCode();
|
||||||
|
LOG.log(DEBUG,"Hash of Plantuml code: {0}",umlHash);
|
||||||
|
var svg = umlCache.get(umlHash);
|
||||||
|
if (svg != null){
|
||||||
|
LOG.log(DEBUG,"Serving Plantuml generated SVG from cache…");
|
||||||
|
source = source.substring(0, start) + svg + source.substring(end);
|
||||||
|
matcher = UML_PATTERN.matcher(source);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG.log(DEBUG,"Cache miss. Generating SVG from plantuml code…");
|
||||||
ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", plantumlJar.getAbsolutePath(), "-tsvg", "-pipe");
|
ProcessBuilder processBuilder = new ProcessBuilder("java", "-jar", plantumlJar.getAbsolutePath(), "-tsvg", "-pipe");
|
||||||
var ignored = processBuilder.redirectErrorStream();
|
var ignored = processBuilder.redirectErrorStream();
|
||||||
var process = processBuilder.start();
|
var process = processBuilder.start();
|
||||||
@@ -94,8 +106,11 @@ public class Util {
|
|||||||
|
|
||||||
try (InputStream is = process.getInputStream()) {
|
try (InputStream is = process.getInputStream()) {
|
||||||
byte[] out = is.readAllBytes();
|
byte[] out = is.readAllBytes();
|
||||||
var svg = new String(out, UTF_8);
|
LOG.log(DEBUG,"Generated SVG. Pushing to cache…");
|
||||||
|
svg = new String(out, UTF_8);
|
||||||
|
umlCache.put(umlHash,svg);
|
||||||
source = source.substring(0, start) + svg + source.substring(end);
|
source = source.substring(0, start) + svg + source.substring(end);
|
||||||
|
matcher = UML_PATTERN.matcher(source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,15 +9,15 @@ public class Constants {
|
|||||||
private Constants(){
|
private Constants(){
|
||||||
// prevent instantiation
|
// prevent instantiation
|
||||||
}
|
}
|
||||||
public static final String FALLBACK_LANG = "de";
|
public static final String FALLBACK_LANG = "de";
|
||||||
public static final String HOME = "home";
|
public static final String HOME = "home";
|
||||||
public static final String JSONARRAY = "json array";
|
public static final String JSONARRAY = "json array";
|
||||||
public static final String JSONOBJECT = "json object";
|
public static final String JSONOBJECT = "json object";
|
||||||
public static final String KEEP_ALIVE = "keep-alive";
|
public static final String KEEP_ALIVE = "keep-alive";
|
||||||
public static final String NO_CACHE = "no-cache";
|
public static final String NO_CACHE = "no-cache";
|
||||||
public static final String NONE = "none";
|
public static final String NONE = "none";
|
||||||
public static final String TABLE_SETTINGS = "settings";
|
public static final String TABLE_SETTINGS = "settings";
|
||||||
public static final String UMBRELLA = "Umbrella";
|
public static final String UMBRELLA = "Umbrella";
|
||||||
public static final String UTF8 = UTF_8.displayName();
|
public static final String UTF8 = UTF_8.displayName();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,170 +2,170 @@
|
|||||||
package de.srsoftware.umbrella.core.constants;
|
package de.srsoftware.umbrella.core.constants;
|
||||||
|
|
||||||
public class Field {
|
public class Field {
|
||||||
public static final String ADDRESS = "address";
|
public static final String ADDRESS = "address";
|
||||||
public static final String ALLOWED_STATES = "allowed_states";
|
public static final String ALLOWED_STATES = "allowed_states";
|
||||||
public static final String AMOUNT = "amount";
|
public static final String AMOUNT = "amount";
|
||||||
public static final String ATTACHMENTS = "attachments";
|
public static final String ATTACHMENTS = "attachments";
|
||||||
public static final String AUTHORIZATION = "Authorization";
|
public static final String AUTHORIZATION = "Authorization";
|
||||||
|
|
||||||
public static final String BANK_ACCOUNT = "bank_account";
|
public static final String BANK_ACCOUNT = "bank_account";
|
||||||
public static final String BODY = "body";
|
public static final String BODY = "body";
|
||||||
|
|
||||||
public static final String CACHE_CONTROL = "Cache-Control";
|
public static final String CACHE_CONTROL = "Cache-Control";
|
||||||
public static final String CODE = "code";
|
public static final String CODE = "code";
|
||||||
public static final String COMMENT = "comment";
|
public static final String COMMENT = "comment";
|
||||||
public static final String COMPANY = "company";
|
public static final String COMPANY = "company";
|
||||||
public static final String COMPANY_ID = "company_id";
|
public static final String COMPANY_ID = "company_id";
|
||||||
public static final String CONNECTION = "Connection";
|
public static final String CONNECTION = "Connection";
|
||||||
public static final String CONTENT = "content";
|
public static final String CONTENT = "content";
|
||||||
public static final String CONTENT_DISPOSITION = "Content-Disposition";
|
public static final String CONTENT_DISPOSITION = "Content-Disposition";
|
||||||
public static final String CONTENT_ENCODING = "Content-Encoding";
|
public static final String CONTENT_ENCODING = "Content-Encoding";
|
||||||
public static final String CONTENT_TYPE = "Content-Type";
|
public static final String CONTENT_TYPE = "Content-Type";
|
||||||
public static final String COURT = "court";
|
public static final String COURT = "court";
|
||||||
public static final String CURRENCY = "currency";
|
public static final String CURRENCY = "currency";
|
||||||
public static final String CUSTOMER = "customer";
|
public static final String CUSTOMER = "customer";
|
||||||
public static final String CUSTOMER_EMAIL = "customer_email";
|
public static final String CUSTOMER_EMAIL = "customer_email";
|
||||||
public static final String CUSTOMER_NUMBER = "customer_number";
|
public static final String CUSTOMER_NUMBER = "customer_number";
|
||||||
public static final String CUSTOMER_NUMBER_PREFIX = "customer_number_prefix";
|
public static final String CUSTOMER_NUMBER_PREFIX = "customer_number_prefix";
|
||||||
public static final String CUSTOMER_TAX_NUMBER = "customer_tax_number";
|
public static final String CUSTOMER_TAX_NUMBER = "customer_tax_number";
|
||||||
|
|
||||||
public static final String DATA = "data";
|
public static final String DATA = "data";
|
||||||
public static final String DB_VERSION = "db_version";
|
public static final String DB_VERSION = "db_version";
|
||||||
public static final String DATE = "date";
|
public static final String DATE = "date";
|
||||||
public static final String DECIMALS = "decimals";
|
public static final String DECIMALS = "decimals";
|
||||||
public static final String DECIMAL_SEPARATOR = "decimal_separator";
|
public static final String DECIMAL_SEPARATOR = "decimal_separator";
|
||||||
public static final String DEFAULT_HEADER = "default_header";
|
public static final String DEFAULT_HEADER = "default_header";
|
||||||
public static final String DEFAULT_FOOTER = "default_footer";
|
public static final String DEFAULT_FOOTER = "default_footer";
|
||||||
public static final String DEFAULT_MAIL = "type_mail_text";
|
public static final String DEFAULT_MAIL = "type_mail_text";
|
||||||
public static final String DELETED = "deleted";
|
public static final String DELETED = "deleted";
|
||||||
public static final String DELIVERY = "delivery";
|
public static final String DELIVERY = "delivery";
|
||||||
public static final String DELIVERY_DATE = "delivery_date";
|
public static final String DELIVERY_DATE = "delivery_date";
|
||||||
public static final String DESCRIPTION = "description";
|
public static final String DESCRIPTION = "description";
|
||||||
public static final String DOCUMENT = "document";
|
public static final String DOCUMENT = "document";
|
||||||
public static final String DOCUMENT_ID = "document_id";
|
public static final String DOCUMENT_ID = "document_id";
|
||||||
public static final String DOC_TYPE_ID = "document_type_id";
|
public static final String DOC_TYPE_ID = "document_type_id";
|
||||||
public static final String DOMAIN = "domain";
|
public static final String DOMAIN = "domain";
|
||||||
public static final String DROP_MEMBER = "drop_member";
|
public static final String DROP_MEMBER = "drop_member";
|
||||||
public static final String DUE_DATE = "due_date";
|
public static final String DUE_DATE = "due_date";
|
||||||
public static final String DURATION = "duration";
|
public static final String DURATION = "duration";
|
||||||
|
|
||||||
public static final String EMAIL = "email";
|
public static final String EMAIL = "email";
|
||||||
public static final String END_TIME = "end_time";
|
public static final String END_TIME = "end_time";
|
||||||
public static final String ENTITY_ID = "entity_id";
|
public static final String ENTITY_ID = "entity_id";
|
||||||
public static final String EST_TIME = "est_time";
|
public static final String EST_TIME = "est_time";
|
||||||
public static final String EXPECTED = "expected";
|
public static final String EXPECTED = "expected";
|
||||||
public static final String EXPIRATION = "expiration";
|
public static final String EXPIRATION = "expiration";
|
||||||
|
|
||||||
public static final String FIELD = "field";
|
public static final String FIELD = "field";
|
||||||
public static final String FOOTER = "footer";
|
public static final String FOOTER = "footer";
|
||||||
public static final String FROM = "from";
|
public static final String FROM = "from";
|
||||||
public static final String FULLTEXT = "fulltext";
|
public static final String FULLTEXT = "fulltext";
|
||||||
|
|
||||||
public static final String GROSS_SUM = "gross_sum";
|
public static final String GROSS_SUM = "gross_sum";
|
||||||
public static final String GUEST_ALLOWED = "guest_allowed";
|
public static final String GUEST_ALLOWED = "guest_allowed";
|
||||||
|
|
||||||
public static final String HASH = "hash";
|
public static final String HASH = "hash";
|
||||||
public static final String HEAD = "head";
|
public static final String HEAD = "head";
|
||||||
|
|
||||||
public static final String ID = "id";
|
public static final String ID = "id";
|
||||||
public static final String ITEM = "item";
|
public static final String ITEM = "item";
|
||||||
public static final String ITEM_CODE = "item_code";
|
public static final String ITEM_CODE = "item_code";
|
||||||
|
|
||||||
public static final String KEY = "key";
|
public static final String KEY = "key";
|
||||||
|
|
||||||
public static final String LANGUAGE = "language";
|
public static final String LANGUAGE = "language";
|
||||||
public static final String LAST_CUSTOMER_NUMBER = "last_customer_number";
|
public static final String LAST_CUSTOMER_NUMBER = "last_customer_number";
|
||||||
public static final String LIMIT = "limit";
|
public static final String LIMIT = "limit";
|
||||||
public static final String LOCATION = "location";
|
public static final String LOCATION = "location";
|
||||||
public static final String LOCATION_ID = "location_id";
|
public static final String LOCATION_ID = "location_id";
|
||||||
public static final String LOCATIONS = "locations";
|
public static final String LOCATIONS = "locations";
|
||||||
public static final String LOGIN = "login";
|
public static final String LOGIN = "login";
|
||||||
public static final String MEMBERS = "members";
|
public static final String MEMBERS = "members";
|
||||||
public static final String MIME = "mime";
|
public static final String MIME = "mime";
|
||||||
public static final String MODULE = "module";
|
public static final String MODULE = "module";
|
||||||
|
|
||||||
public static final String NAME = "name";
|
public static final String NAME = "name";
|
||||||
public static final String NEW_MEMBER = "new_member";
|
public static final String NEW_MEMBER = "new_member";
|
||||||
public static final String NET_PRICE = "net_price";
|
public static final String NET_PRICE = "net_price";
|
||||||
public static final String NET_SUM = "net_sum";
|
public static final String NET_SUM = "net_sum";
|
||||||
public static final String NEXT_TYPE = "next_type_id";
|
public static final String NEXT_TYPE = "next_type_id";
|
||||||
public static final String NO_INDEX = "no_index";
|
public static final String NO_INDEX = "no_index";
|
||||||
public static final String NOTE = "note";
|
public static final String NOTE = "note";
|
||||||
public static final String NUMBER = "number";
|
public static final String NUMBER = "number";
|
||||||
|
|
||||||
public static final String OBJECT = "object";
|
public static final String OBJECT = "object";
|
||||||
public static final String OFFSET = "offset";
|
public static final String OFFSET = "offset";
|
||||||
public static final String OPTIONAL = "optional";
|
public static final String OPTIONAL = "optional";
|
||||||
public static final String OWNER = "owner";
|
public static final String OWNER = "owner";
|
||||||
public static final String OWNER_NUMBER = "owner_number";
|
public static final String OWNER_NUMBER = "owner_number";
|
||||||
|
|
||||||
public static final String PARENT_LOCATION_ID = "parent_location_id";
|
public static final String PARENT_LOCATION_ID = "parent_location_id";
|
||||||
public static final String PARENT_TASK_ID = "parent_task_id";
|
public static final String PARENT_TASK_ID = "parent_task_id";
|
||||||
public static final String PASS = "pass";
|
public static final String PASS = "pass";
|
||||||
public static final String PASSWORD = "password";
|
public static final String PASSWORD = "password";
|
||||||
public static final String PATH = "path";
|
public static final String PATH = "path";
|
||||||
public static final String PERMISSION = "permission";
|
public static final String PERMISSION = "permission";
|
||||||
public static final String PHONE = "phone";
|
public static final String PHONE = "phone";
|
||||||
public static final String POS = "pos";
|
public static final String POS = "pos";
|
||||||
public static final String POSITIONS = "positions";
|
public static final String POSITIONS = "positions";
|
||||||
public static final String PRICE = "single_price";
|
public static final String PRICE = "single_price";
|
||||||
public static final String PRICE_FORMAT = "price_format";
|
public static final String PRICE_FORMAT = "price_format";
|
||||||
public static final String PRIORITY = "priority";
|
public static final String PRIORITY = "priority";
|
||||||
public static final String PROJECT_ID = "project_id";
|
public static final String PROJECT_ID = "project_id";
|
||||||
public static final String PROPERTIES = "properties";
|
public static final String PROPERTIES = "properties";
|
||||||
|
|
||||||
public static final String RECEIVERS = "receivers";
|
public static final String RECEIVERS = "receivers";
|
||||||
public static final String REDIRECT = "redirect";
|
public static final String REDIRECT = "redirect";
|
||||||
public static final String RENDERED = "rendered";
|
public static final String RENDERED = "rendered";
|
||||||
public static final String REQUIRED_TASKS_IDS = "required_tasks_ids";
|
public static final String REQUIRED_TASKS_IDS = "required_tasks_ids";
|
||||||
|
|
||||||
public static final String SENDER = "sender";
|
public static final String SENDER = "sender";
|
||||||
public static final String SETTINGS = "settings";
|
public static final String SETTINGS = "settings";
|
||||||
public static final String SHOW_CLOSED = "show_closed";
|
public static final String SHOW_CLOSED = "show_closed";
|
||||||
public static final String SOURCE = "source";
|
public static final String SOURCE = "source";
|
||||||
public static final String START_DATE = "start_date";
|
public static final String START_DATE = "start_date";
|
||||||
public static final String START_TIME = "start_time";
|
public static final String START_TIME = "start_time";
|
||||||
public static final String STATE = "state";
|
public static final String STATE = "state";
|
||||||
public static final String STATUS = "status";
|
public static final String STATUS = "status";
|
||||||
public static final String STATUS_CODE = "code";
|
public static final String STATUS_CODE = "code";
|
||||||
public static final String SUBJECT = "subject";
|
public static final String SUBJECT = "subject";
|
||||||
|
|
||||||
public static final String TABLE = "table";
|
public static final String TABLE = "table";
|
||||||
public static final String TAGS = "tags";
|
public static final String TAGS = "tags";
|
||||||
public static final String TAG_COLORS = "tag_colors";
|
public static final String TAG_COLORS = "tag_colors";
|
||||||
public static final String TASK = "task";
|
public static final String TASK = "task";
|
||||||
public static final String TASK_IDS = "task_ids";
|
public static final String TASK_IDS = "task_ids";
|
||||||
public static final String TASKS = "tasks";
|
public static final String TASKS = "tasks";
|
||||||
public static final String TAX = "tax";
|
public static final String TAX = "tax";
|
||||||
public static final String TAX_ID = "tax_id";
|
public static final String TAX_ID = "tax_id";
|
||||||
public static final String TAX_NUMBER = "tax_number";
|
public static final String TAX_NUMBER = "tax_number";
|
||||||
public static final String TAX_RATE = "tax_rate";
|
public static final String TAX_RATE = "tax_rate";
|
||||||
public static final String TEMPLATE = "template";
|
public static final String TEMPLATE = "template";
|
||||||
public static final String TEMPLATE_ID = "template_id";
|
public static final String TEMPLATE_ID = "template_id";
|
||||||
public static final String TEXT = "text";
|
public static final String TEXT = "text";
|
||||||
public static final String THOUSANDS_SEPARATOR = "thousands_separator";
|
public static final String THOUSANDS_SEPARATOR = "thousands_separator";
|
||||||
public static final String THEME = "theme";
|
public static final String THEME = "theme";
|
||||||
public static final String TIME_ID = "time_id";
|
public static final String TIME_ID = "time_id";
|
||||||
public static final String TIMESTAMP = "timestamp";
|
public static final String TIMESTAMP = "timestamp";
|
||||||
public static final String TITLE = "title";
|
public static final String TITLE = "title";
|
||||||
public static final String TO = "to";
|
public static final String TO = "to";
|
||||||
public static final String TOKEN = "token";
|
public static final String TOKEN = "token";
|
||||||
public static final String TOTAL_PRIO = "total_prio";
|
public static final String TOTAL_PRIO = "total_prio";
|
||||||
public static final String TYPE = "type";
|
public static final String TYPE = "type";
|
||||||
public static final String TYPE_ID = "type_id";
|
public static final String TYPE_ID = "type_id";
|
||||||
|
|
||||||
public static final String UNIT = "unit";
|
public static final String UNIT = "unit";
|
||||||
public static final String UNIT_PRICE = "unit_price";
|
public static final String UNIT_PRICE = "unit_price";
|
||||||
public static final String URI = "uri";
|
public static final String URI = "uri";
|
||||||
public static final String URL = "url";
|
public static final String URL = "url";
|
||||||
public static final String USER = "user";
|
public static final String USER = "user";
|
||||||
public static final String USERS = "users";
|
public static final String USERS = "users";
|
||||||
public static final String USER_ID = "user_id";
|
public static final String USER_ID = "user_id";
|
||||||
public static final String USER_LIST = "user_list";
|
public static final String USER_LIST = "user_list";
|
||||||
|
|
||||||
public static final String VALUE = "value";
|
public static final String VALUE = "value";
|
||||||
public static final String VCARD = "vcard";
|
public static final String VCARD = "vcard";
|
||||||
public static final String VERSION = "version";
|
public static final String VERSION = "version";
|
||||||
public static final String VERSIONS = "versions";
|
public static final String VERSIONS = "versions";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package de.srsoftware.umbrella.core.constants;
|
|||||||
|
|
||||||
public class Module {
|
public class Module {
|
||||||
public static final String BOOKMARK = "bookmark";
|
public static final String BOOKMARK = "bookmark";
|
||||||
public static final String COMPANY = "company";
|
public static final String COMPANY = "company";
|
||||||
public static final String PROJECT = "project";
|
public static final String PROJECT = "project";
|
||||||
public static final String TASK = "task";
|
public static final String TASK = "task";
|
||||||
public static final String USER = "user";
|
public static final String USER = "user";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,46 +4,43 @@ package de.srsoftware.umbrella.core.constants;
|
|||||||
public class Path {
|
public class Path {
|
||||||
private Path(){};
|
private Path(){};
|
||||||
|
|
||||||
public static final String ADD = "add";
|
public static final String ADD = "add";
|
||||||
public static final String AVAILABLE = "available";
|
public static final String AVAILABLE = "available";
|
||||||
public static final String CSS = "css";
|
public static final String CSS = "css";
|
||||||
public static final String COMMON_TEMPLATES = "common_templates";
|
public static final String COMMON_TEMPLATES = "common_templates";
|
||||||
public static final String COMPANY = "company";
|
public static final String COMPANY = "company";
|
||||||
public static final String CONNECTED = "connected";
|
public static final String CONNECTED = "connected";
|
||||||
|
|
||||||
public static final String ITEM = "item";
|
public static final String ITEM = "item";
|
||||||
|
|
||||||
public static final String JSON = "json";
|
public static final String JSON = "json";
|
||||||
|
|
||||||
public static final String LEGACY = "legacy";
|
public static final String LEGACY = "legacy";
|
||||||
public static final String LIST = "list";
|
public static final String LIST = "list";
|
||||||
public static final String LOCATION = "location";
|
public static final String LOCATION = "location";
|
||||||
public static final String LOCATIONS = "locations";
|
public static final String LOCATIONS = "locations";
|
||||||
public static final String LOGIN = "login";
|
public static final String LOGIN = "login";
|
||||||
|
|
||||||
public static final String LOGOUT = "logout";
|
public static final String LOGOUT = "logout";
|
||||||
public static final String PAGE = "page";
|
public static final String PAGE = "page";
|
||||||
public static final String PASSWORD = "password";
|
public static final String PASSWORD = "password";
|
||||||
public static final String PROJECT = "project";
|
public static final String PROJECT = "project";
|
||||||
public static final String PROPERTIES = "properties";
|
public static final String PROPERTIES = "properties";
|
||||||
public static final String PROPERTY = "property";
|
public static final String PROPERTY = "property";
|
||||||
|
|
||||||
public static final String REDIRECT = "redirect";
|
public static final String REDIRECT = "redirect";
|
||||||
|
|
||||||
public static final String SEARCH = "search";
|
public static final String SEARCH = "search";
|
||||||
public static final String SERVICE = "service";
|
|
||||||
public static final String SETTINGS = "settings";
|
public static final String SETTINGS = "settings";
|
||||||
public static final String STATES = "states";
|
public static final String STATES = "states";
|
||||||
public static final String STARTED = "started";
|
public static final String STARTED = "started";
|
||||||
public static final String STATE = "state";
|
public static final String STATE = "state";
|
||||||
public static final String STOP = "stop";
|
public static final String STOP = "stop";
|
||||||
public static final String SUBMIT = "submit";
|
|
||||||
|
|
||||||
public static final String TAGGED = "tagged";
|
public static final String TAGGED = "tagged";
|
||||||
public static final String TOKEN = "token";
|
public static final String TOKEN = "token";
|
||||||
|
|
||||||
public static final String USER = "user";
|
public static final String USER = "user";
|
||||||
public static final String USES = "uses";
|
public static final String USES = "uses";
|
||||||
public static final String VIEW = "view";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,51 +5,62 @@ package de.srsoftware.umbrella.core.constants;
|
|||||||
* This is a collection of messages that appear throughout the project
|
* This is a collection of messages that appear throughout the project
|
||||||
*/
|
*/
|
||||||
public class Text {
|
public class Text {
|
||||||
public static final String BOOLEAN = "Boolean";
|
|
||||||
public static final String BOOKMARK = "bookmark";
|
public static final String BOOKMARK = "bookmark";
|
||||||
public static final String COMPANIES = "companies";
|
public static final String BOOLEAN = "Boolean";
|
||||||
public static final String COMPANY = "company";
|
|
||||||
public static final String COMPANY_WITH_ID = "company ({id})";
|
public static final String COMPANIES = "companies";
|
||||||
public static final String CONTACT = "Contact";
|
public static final String COMPANY = "company";
|
||||||
public static final String CONTACTS = "contacts";
|
public static final String COMPANY_WITH_ID = "company ({id})";
|
||||||
public static final String CONTACT_WITH_ID = "contact ({id})";
|
public static final String CONTACT = "Contact";
|
||||||
public static final String CUSTOMER = "customer";
|
public static final String CONTACTS = "contacts";
|
||||||
|
public static final String CONTACT_WITH_ID = "contact ({id})";
|
||||||
|
public static final String CUSTOMER = "customer";
|
||||||
public static final String CUSTOMER_SETTINGS = "customer settings";
|
public static final String CUSTOMER_SETTINGS = "customer settings";
|
||||||
public static final String DOCUMENT = "document";
|
|
||||||
public static final String DOCUMENTS = "documents";
|
public static final String DOCUMENT = "document";
|
||||||
|
public static final String DOCUMENTS = "documents";
|
||||||
public static final String DOCUMENT_TYPE_ID = "document type id";
|
public static final String DOCUMENT_TYPE_ID = "document type id";
|
||||||
public static final String DOCUMENT_WITH_ID = "document ({id})";
|
public static final String DOCUMENT_WITH_ID = "document ({id})";
|
||||||
|
|
||||||
public static final String INVALID_DB_CODE = "Encountered invalid dbCode: {code}";
|
public static final String INVALID_DB_CODE = "Encountered invalid dbCode: {code}";
|
||||||
public static final String ITEM = "item";
|
public static final String ITEM = "item";
|
||||||
public static final String ITEMS = "items";
|
public static final String ITEMS = "items";
|
||||||
public static final String LOCATION = "location";
|
|
||||||
public static final String LOCATIONS = "locations";
|
public static final String LOCATION = "location";
|
||||||
|
public static final String LOCATIONS = "locations";
|
||||||
public static final String LOGIN_SERVICE = "login service";
|
public static final String LOGIN_SERVICE = "login service";
|
||||||
public static final String LONG = "Long";
|
public static final String LONG = "Long";
|
||||||
public static final String NOTE = "note";
|
|
||||||
|
public static final String NOTE = "note";
|
||||||
public static final String NOTE_WITH_ID = "note ({id})";
|
public static final String NOTE_WITH_ID = "note ({id})";
|
||||||
public static final String NUMBER = "number";
|
public static final String NUMBER = "number";
|
||||||
public static final String PATH = "path";
|
|
||||||
public static final String PROJECT = "project";
|
public static final String PATH = "path";
|
||||||
public static final String PROPERTIES = "properties";
|
public static final String PROJECT = "project";
|
||||||
public static final String PROJECT_WITH_ID = "project ({id})";
|
public static final String PROJECT_WITH_ID = "project ({id})";
|
||||||
public static final String PROPERTY = "property";
|
public static final String PROPERTIES = "properties";
|
||||||
public static final String SENDER = "sender";
|
public static final String PROPERTY = "property";
|
||||||
public static final String SESSION = "session";
|
|
||||||
|
public static final String SENDER = "sender";
|
||||||
public static final String SERVICE_WITH_ID = "service ({id})";
|
public static final String SERVICE_WITH_ID = "service ({id})";
|
||||||
public static final String SETTINGS = "settings";
|
public static final String SESSION = "session";
|
||||||
public static final String STRING = "string";
|
public static final String SETTINGS = "settings";
|
||||||
|
public static final String STRING = "string";
|
||||||
|
|
||||||
public static final String TABLE_WITH_NAME = "table {name}";
|
public static final String TABLE_WITH_NAME = "table {name}";
|
||||||
public static final String TAGS = "tags";
|
public static final String TAGS = "tags";
|
||||||
public static final String TASK = "task";
|
public static final String TASK = "task";
|
||||||
public static final String TASKS = "tasks";
|
public static final String TASKS = "tasks";
|
||||||
public static final String TIME_WITH_ID = "time ({id})";
|
public static final String TIME_WITH_ID = "time ({id})";
|
||||||
public static final String TYPE = "type";
|
public static final String TYPE = "type";
|
||||||
|
|
||||||
|
public static final String UNIT = "unit";
|
||||||
public static final String USER_WITH_ID = "user ({id})";
|
public static final String USER_WITH_ID = "user ({id})";
|
||||||
public static final String WIKI_PAGE = "wiki page";
|
|
||||||
|
public static final String WIKI_PAGE = "wiki page";
|
||||||
public static final String WIKI_PAGES = "wiki pages";
|
public static final String WIKI_PAGES = "wiki pages";
|
||||||
public static final String UNIT = "unit";
|
|
||||||
public static final String T_UNIT_PRICE = "unit price";
|
public static final String UNIT_PRICE = "unit price";
|
||||||
public static final String USER = "user";
|
public static final String USER = "user";
|
||||||
public static final String USERS = "users";
|
public static final String USERS = "users";
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import static de.srsoftware.umbrella.core.constants.Field.SENDER;
|
|||||||
import static de.srsoftware.umbrella.core.constants.Field.STATE;
|
import static de.srsoftware.umbrella.core.constants.Field.STATE;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.TYPE;
|
import static de.srsoftware.umbrella.core.constants.Field.TYPE;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.UNIT;
|
import static de.srsoftware.umbrella.core.constants.Field.UNIT;
|
||||||
|
import static de.srsoftware.umbrella.core.constants.Field.UNIT_PRICE;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.USER;
|
import static de.srsoftware.umbrella.core.constants.Field.USER;
|
||||||
import static de.srsoftware.umbrella.core.constants.Path.*;
|
import static de.srsoftware.umbrella.core.constants.Path.*;
|
||||||
import static de.srsoftware.umbrella.core.constants.Text.*;
|
import static de.srsoftware.umbrella.core.constants.Text.*;
|
||||||
@@ -540,6 +541,11 @@ public class DocumentApi extends BaseHandler implements DocumentService {
|
|||||||
var userCompanyIds = companyService().listCompaniesOf(user).keySet();
|
var userCompanyIds = companyService().listCompaniesOf(user).keySet();
|
||||||
|
|
||||||
var documents = db.find(userCompanyIds,keys,fulltext);
|
var documents = db.find(userCompanyIds,keys,fulltext);
|
||||||
|
try {
|
||||||
|
Thread.sleep(5000);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
return sendContent(ex,mapValues(documents));
|
return sendContent(ex,mapValues(documents));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import static de.srsoftware.umbrella.core.constants.Field.NUMBER;
|
|||||||
import static de.srsoftware.umbrella.core.constants.Field.SENDER;
|
import static de.srsoftware.umbrella.core.constants.Field.SENDER;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.TYPE;
|
import static de.srsoftware.umbrella.core.constants.Field.TYPE;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.UNIT;
|
import static de.srsoftware.umbrella.core.constants.Field.UNIT;
|
||||||
|
import static de.srsoftware.umbrella.core.constants.Field.UNIT_PRICE;
|
||||||
import static de.srsoftware.umbrella.core.constants.Text.*;
|
import static de.srsoftware.umbrella.core.constants.Text.*;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
||||||
import static de.srsoftware.umbrella.core.model.Document.DEFAULT_THOUSANDS_SEPARATOR;
|
import static de.srsoftware.umbrella.core.model.Document.DEFAULT_THOUSANDS_SEPARATOR;
|
||||||
|
|||||||
@@ -2,13 +2,14 @@
|
|||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { useTinyRouter } from 'svelte-tiny-router';
|
import { useTinyRouter } from 'svelte-tiny-router';
|
||||||
import { api } from '../../urls.svelte';
|
import { api } from '../../urls.svelte';
|
||||||
import { error, yikes } from '../../warn.svelte';
|
import { error, warn, yikes } from '../../warn.svelte';
|
||||||
import { t } from '../../translations.svelte';
|
import { t } from '../../translations.svelte';
|
||||||
import { user } from '../../user.svelte';
|
import { user } from '../../user.svelte';
|
||||||
|
|
||||||
const image_extensions = ['jpg','jpeg','gif','png','svg','webp'];
|
const image_extensions = ['jpg','jpeg','gif','png','svg','webp'];
|
||||||
const router = useTinyRouter();
|
const router = useTinyRouter();
|
||||||
let children = $state({});
|
let children = $state({});
|
||||||
|
|
||||||
let new_dir = $state(null);
|
let new_dir = $state(null);
|
||||||
let files = $state();
|
let files = $state();
|
||||||
let parent = $state(false);
|
let parent = $state(false);
|
||||||
@@ -17,23 +18,6 @@
|
|||||||
let delete_allowed = $state(false);
|
let delete_allowed = $state(false);
|
||||||
let available = $derived.by(isAvailable);
|
let available = $derived.by(isAvailable);
|
||||||
|
|
||||||
function isAvailable(){
|
|
||||||
if (!new_dir) return false;
|
|
||||||
if (children){
|
|
||||||
if (children.dirs) {
|
|
||||||
for (let key of Object.values(children.dirs)){
|
|
||||||
if (key == new_dir) return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (children.files) {
|
|
||||||
for (let key of Object.values(children.files)){
|
|
||||||
if (key == new_dir) return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function create_dir(ev){
|
async function create_dir(ev){
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
ev.stopPropagation();
|
ev.stopPropagation();
|
||||||
@@ -74,13 +58,30 @@
|
|||||||
|
|
||||||
async function handleDirectory(res){
|
async function handleDirectory(res){
|
||||||
let json = await res.json();
|
let json = await res.json();
|
||||||
children.dirs = json.dirs ? json.dirs : {};
|
children.dirs = json.dirs ? val_sort(json.dirs) : {};
|
||||||
children.files = json.files ? json.files : {};
|
children.files = json.files ? val_sort(json.files) : {};
|
||||||
children.title = json.title ? json.title : path;
|
children.title = json.title ? json.title : path;
|
||||||
delete_allowed = json.delete;
|
delete_allowed = json.delete;
|
||||||
yikes();
|
yikes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isAvailable(){
|
||||||
|
if (!new_dir) return false;
|
||||||
|
if (children){
|
||||||
|
if (children.dirs) {
|
||||||
|
for (let key of Object.values(children.dirs)){
|
||||||
|
if (key == new_dir) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (children.files) {
|
||||||
|
for (let key of Object.values(children.files)){
|
||||||
|
if (key == new_dir) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
function is_image(file){
|
function is_image(file){
|
||||||
let parts = file.toLowerCase().split('.');
|
let parts = file.toLowerCase().split('.');
|
||||||
let ext = parts.pop();
|
let ext = parts.pop();
|
||||||
@@ -90,12 +91,15 @@
|
|||||||
async function loadChildren(p){
|
async function loadChildren(p){
|
||||||
p = p.substring(6);
|
p = p.substring(6);
|
||||||
if (p == '') p = '/';
|
if (p == '') p = '/';
|
||||||
children = { dirs : {}, files : {}, title : p};
|
children = { dirs : [], files : [], title : p};
|
||||||
path = p;
|
path = p;
|
||||||
if (p == '/'){
|
if (p == '/'){
|
||||||
children.dirs[`/user/${user.id}`] = t('my_files');
|
children.dirs = [
|
||||||
children.dirs['/project'] = t('projects')
|
{ path : `/user/${user.id}`, name : t('my files') },
|
||||||
children.dirs['/company'] = t('companies');
|
{ path : '/project', name : t('projects')},
|
||||||
|
{ path : '/company', name : t('companies')},
|
||||||
|
]
|
||||||
|
|
||||||
parent = false;
|
parent = false;
|
||||||
form = false;
|
form = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -114,8 +118,12 @@
|
|||||||
|
|
||||||
function markdown(file){
|
function markdown(file){
|
||||||
let parts = file.split('/');
|
let parts = file.split('/');
|
||||||
let md = ``;
|
let path = `/api/files${file}`;
|
||||||
|
path = encodeURI(path);
|
||||||
|
let md = ``;
|
||||||
navigator.clipboard.writeText(md);
|
navigator.clipboard.writeText(md);
|
||||||
|
warn(t('Markdown has been copied to clipboard!'));
|
||||||
|
setTimeout(yikes, 2500);
|
||||||
}
|
}
|
||||||
|
|
||||||
function onclick(ev){
|
function onclick(ev){
|
||||||
@@ -153,6 +161,12 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function val_sort(map){
|
||||||
|
return Object.entries(map)
|
||||||
|
.map(item => ({name:item[1],path:item[0]}))
|
||||||
|
.sort((a,b) => a.name.localeCompare(b.name));
|
||||||
|
}
|
||||||
|
|
||||||
onMount(() => loadChildren(window.location.pathname));
|
onMount(() => loadChildren(window.location.pathname));
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -166,12 +180,12 @@
|
|||||||
</li>
|
</li>
|
||||||
{/if}
|
{/if}
|
||||||
{#if children?.dirs}
|
{#if children?.dirs}
|
||||||
{#each Object.entries(children.dirs) as [k,v]}
|
{#each children.dirs as dir}
|
||||||
<li class="dir">
|
<li class="dir">
|
||||||
<span class="symbol"></span>
|
<span class="symbol"></span>
|
||||||
<a href={'/files'+k} {onclick}>{v}</a>
|
<a href={'/files'+dir.path} {onclick}>{dir.name}</a>
|
||||||
{#if delete_allowed}
|
{#if delete_allowed}
|
||||||
<button class="symbol" onclick={e => dropDir(`/api/files${k}`,v)}></button>
|
<button class="symbol" onclick={e => dropDir(`/api/files${dir.path}`,dir.name)}></button>
|
||||||
{/if}
|
{/if}
|
||||||
</li>
|
</li>
|
||||||
{/each}
|
{/each}
|
||||||
@@ -186,15 +200,15 @@
|
|||||||
</li>
|
</li>
|
||||||
{/if}
|
{/if}
|
||||||
{#if children.files}
|
{#if children.files}
|
||||||
{#each Object.entries(children.files) as [k,v]}
|
{#each children.files as file}
|
||||||
<li class="file">
|
<li class="file">
|
||||||
<span class="symbol"></span>
|
<span class="symbol"></span>
|
||||||
<a href={`/api/files${k}`} target="_blank">{v}</a>
|
<a href={`/api/files${file.path}`} target="_blank">{file.name}</a>
|
||||||
{#if is_image(k)}
|
{#if is_image(file.path)}
|
||||||
<button class="symbol" title={'markdown_code'} onclick={e => markdown(k)}></button>
|
<button class="symbol" title={'markdown_code'} onclick={e => markdown(file.path)}></button>
|
||||||
{/if}
|
{/if}
|
||||||
{#if delete_allowed}
|
{#if delete_allowed}
|
||||||
<button class="symbol" title={t('delete_object',{'object':t('file')})} onclick={e => dropFile(`/api/files${k}`,v)}></button>
|
<button class="symbol" title={t('delete_object',{'object':t('file')})} onclick={e => dropFile(`/api/files${file.path}`,file.name)}></button>
|
||||||
{/if}
|
{/if}
|
||||||
</li>
|
</li>
|
||||||
{/each}
|
{/each}
|
||||||
|
|||||||
@@ -222,7 +222,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div>{t('state')}</div>
|
<div>{t('state')}</div>
|
||||||
<div>
|
<div>
|
||||||
<StateSelector selected={project.status} onchange={val => update({status:val})} {project} />
|
<StateSelector selected={project.status} onchange={val => update({status:+val})} {project} />
|
||||||
</div>
|
</div>
|
||||||
{#if project.company}
|
{#if project.company}
|
||||||
<div>{t('company')}</div>
|
<div>{t('company')}</div>
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
<script>
|
<script>
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { useTinyRouter } from 'svelte-tiny-router';
|
import { useTinyRouter } from 'svelte-tiny-router';
|
||||||
import { api, post, target } from '../../urls.svelte.js';
|
import { api, get, post, target } from '../../urls.svelte.js';
|
||||||
import { error, yikes } from '../../warn.svelte';
|
import { error, warn, yikes } from '../../warn.svelte';
|
||||||
import { t } from '../../translations.svelte.js';
|
import { t } from '../../translations.svelte.js';
|
||||||
import { display } from '../../time.svelte';
|
import { display } from '../../time.svelte';
|
||||||
|
|
||||||
import Bookmark from '../bookmark/Template.svelte';
|
import Bookmark from '../bookmark/Template.svelte';
|
||||||
|
|
||||||
const router = useTinyRouter();
|
const router = useTinyRouter();
|
||||||
|
let counter = 9;
|
||||||
let bookmarks = $state(null);
|
let bookmarks = $state(null);
|
||||||
let companies = $state(null);
|
let companies = $state(null);
|
||||||
let documents = $state(null);
|
let documents = $state(null);
|
||||||
@@ -34,12 +35,12 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
function doSearch(ignored){
|
function doSearch(ignored){
|
||||||
|
warn(t('searching…'));
|
||||||
let url = window.location.origin + window.location.pathname;
|
let url = window.location.origin + window.location.pathname;
|
||||||
if (key) url += '?key=' + encodeURI(key);
|
if (key) url += '?key=' + encodeURI(key);
|
||||||
window.history.replaceState(history.state, '', url);
|
window.history.replaceState(history.state, '', url);
|
||||||
|
|
||||||
const data = { key : key, fulltext : fulltext };
|
const data = { key : key, fulltext : fulltext };
|
||||||
|
|
||||||
post(api('bookmark/search'),data).then(handleBookmarks);
|
post(api('bookmark/search'),data).then(handleBookmarks);
|
||||||
post(api('company/search '),data).then(handleCompanies);
|
post(api('company/search '),data).then(handleCompanies);
|
||||||
post(api('document/search'),data).then(handleDocuments);
|
post(api('document/search'),data).then(handleDocuments);
|
||||||
@@ -51,6 +52,22 @@
|
|||||||
post(api('wiki/search' ),data).then(handleWikiPages);
|
post(api('wiki/search' ),data).then(handleWikiPages);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function getTitle(key,module,entity_id){
|
||||||
|
get(api(module+'/'+entity_id)).then(res => setTitle(res,key,module))
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setTitle(resp,key,module){
|
||||||
|
if (resp.ok){
|
||||||
|
const json = await resp.json();
|
||||||
|
if (json.name) notes[key].title = t(module)+": "+json.name;
|
||||||
|
if (json.title) notes[key].title = t(module)+": "+json.title;
|
||||||
|
if (module == 'document'){
|
||||||
|
notes[key].title = t(json.type)+" "+json.number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function onclick(e){
|
function onclick(e){
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var target = e.target;
|
var target = e.target;
|
||||||
@@ -61,6 +78,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleBookmarks(resp){
|
async function handleBookmarks(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const res = await resp.json();
|
const res = await resp.json();
|
||||||
bookmarks = Object.keys(res).length ? res : null;
|
bookmarks = Object.keys(res).length ? res : null;
|
||||||
@@ -70,6 +88,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleCompanies(resp){
|
async function handleCompanies(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const json = await resp.json();
|
const json = await resp.json();
|
||||||
companies = Object.keys(json).length ? json : null;
|
companies = Object.keys(json).length ? json : null;
|
||||||
@@ -79,6 +98,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleDocuments(resp){
|
async function handleDocuments(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const json = await resp.json();
|
const json = await resp.json();
|
||||||
documents = Object.keys(json).length ? json : null;
|
documents = Object.keys(json).length ? json : null;
|
||||||
@@ -88,15 +108,25 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleNotes(resp){
|
async function handleNotes(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const json = await resp.json();
|
const json = await resp.json();
|
||||||
notes = Object.keys(json).length ? json : null;
|
if ( Object.keys(json).length ) {
|
||||||
|
for (let key of Object.keys(json)){
|
||||||
|
let module = json[key].module;
|
||||||
|
let entity_id = json[key].entity_id;
|
||||||
|
json[key].title = t(module)+' '+entity_id;
|
||||||
|
getTitle(key,module,entity_id);
|
||||||
|
}
|
||||||
|
notes = json;
|
||||||
|
} else notes = null;
|
||||||
} else {
|
} else {
|
||||||
error(resp);
|
error(resp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleProjects(resp){
|
async function handleProjects(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const res = await resp.json();
|
const res = await resp.json();
|
||||||
projects = Object.keys(res).length ? res : null;
|
projects = Object.keys(res).length ? res : null;
|
||||||
@@ -106,6 +136,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleStock(resp){
|
async function handleStock(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const res = await resp.json();
|
const res = await resp.json();
|
||||||
stock = Object.keys(res).length ? res : null;
|
stock = Object.keys(res).length ? res : null;
|
||||||
@@ -115,6 +146,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleTasks(resp){
|
async function handleTasks(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const res = await resp.json();
|
const res = await resp.json();
|
||||||
tasks = Object.keys(res).length ? res : null;
|
tasks = Object.keys(res).length ? res : null;
|
||||||
@@ -124,6 +156,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleTimes(resp){
|
async function handleTimes(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const res = await resp.json();
|
const res = await resp.json();
|
||||||
times = Object.keys(res).length ? res : null;
|
times = Object.keys(res).length ? res : null;
|
||||||
@@ -133,6 +166,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function handleWikiPages(resp){
|
async function handleWikiPages(resp){
|
||||||
|
quitOne();
|
||||||
if (resp.ok){
|
if (resp.ok){
|
||||||
const res = await resp.json();
|
const res = await resp.json();
|
||||||
pages = Object.keys(res).length ? res : null;
|
pages = Object.keys(res).length ? res : null;
|
||||||
@@ -140,6 +174,13 @@
|
|||||||
error(resp);
|
error(resp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function quitOne(){
|
||||||
|
counter--;
|
||||||
|
if (counter > 0) {
|
||||||
|
warn(t('searching…')+" "+counter);
|
||||||
|
} else yikes();
|
||||||
|
}
|
||||||
|
|
||||||
$effect(() => doSearch(key))
|
$effect(() => doSearch(key))
|
||||||
</script>
|
</script>
|
||||||
@@ -236,23 +277,6 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
{/if}
|
{/if}
|
||||||
{#if notes}
|
|
||||||
<fieldset>
|
|
||||||
<legend>
|
|
||||||
{t('notes')}
|
|
||||||
</legend>
|
|
||||||
<ul>
|
|
||||||
{#each Object.values(notes) as note}
|
|
||||||
<li>
|
|
||||||
<b>
|
|
||||||
<a href="/{note.module}/{note.entity_id}/view" {onclick} >{t(note.module)} {note.entity_id}:</a>
|
|
||||||
</b>
|
|
||||||
{@html target(note.text.rendered)}
|
|
||||||
</li>
|
|
||||||
{/each}
|
|
||||||
</ul>
|
|
||||||
</fieldset>
|
|
||||||
{/if}
|
|
||||||
{#if times}
|
{#if times}
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>
|
<legend>
|
||||||
@@ -308,3 +332,20 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
{/if}
|
{/if}
|
||||||
|
{#if notes}
|
||||||
|
<fieldset>
|
||||||
|
<legend>
|
||||||
|
{t('notes')}
|
||||||
|
</legend>
|
||||||
|
<ul>
|
||||||
|
{#each Object.values(notes) as note}
|
||||||
|
<li>
|
||||||
|
<b>
|
||||||
|
<a href="/{note.module}/{note.entity_id}/view" {onclick} >{note.title}</a>
|
||||||
|
</b>
|
||||||
|
{@html target(note.text.rendered)}
|
||||||
|
</li>
|
||||||
|
{/each}
|
||||||
|
</ul>
|
||||||
|
</fieldset>
|
||||||
|
{/if}
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ export async function warn(msg){
|
|||||||
|
|
||||||
export function yikes(){
|
export function yikes(){
|
||||||
messages.error = null;
|
messages.error = null;
|
||||||
messages.warn = null;
|
messages.warning = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
|||||||
import static de.srsoftware.umbrella.core.ModuleRegistry.companyService;
|
import static de.srsoftware.umbrella.core.ModuleRegistry.companyService;
|
||||||
import static de.srsoftware.umbrella.core.ModuleRegistry.translator;
|
import static de.srsoftware.umbrella.core.ModuleRegistry.translator;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.*;
|
import static de.srsoftware.umbrella.core.constants.Field.*;
|
||||||
import static de.srsoftware.umbrella.core.constants.Text.T_UNIT_PRICE;
|
|
||||||
import static de.srsoftware.umbrella.core.constants.Text.UNIT;
|
import static de.srsoftware.umbrella.core.constants.Text.UNIT;
|
||||||
|
import static de.srsoftware.umbrella.core.constants.Text.UNIT_PRICE;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
|
||||||
import static de.srsoftware.umbrella.stock.Constants.TABLE_ITEMS;
|
import static de.srsoftware.umbrella.stock.Constants.TABLE_ITEMS;
|
||||||
import static java.lang.System.Logger.Level.DEBUG;
|
import static java.lang.System.Logger.Level.DEBUG;
|
||||||
@@ -75,7 +75,7 @@ public class ItemDb {
|
|||||||
LOG.log(DEBUG, " using location: {0}",location.resolve().name());
|
LOG.log(DEBUG, " using location: {0}",location.resolve().name());
|
||||||
var stockItem = new Item(0,company,0,location,code,name,description);
|
var stockItem = new Item(0,company,0,location,code,name,description);
|
||||||
var props = stockItem.properties();
|
var props = stockItem.properties();
|
||||||
var keyUnitPrice = translator().translate(lang,T_UNIT_PRICE);
|
var keyUnitPrice = translator().translate(lang, Text.UNIT_PRICE);
|
||||||
var keyUnit = translator().translate(lang, Text.UNIT);
|
var keyUnit = translator().translate(lang, Text.UNIT);
|
||||||
var keyTax = translator().translate(lang,TAX_RATE);
|
var keyTax = translator().translate(lang,TAX_RATE);
|
||||||
var keyLegacyId = translator().translate(lang,"legacy_id");
|
var keyLegacyId = translator().translate(lang,"legacy_id");
|
||||||
|
|||||||
@@ -132,7 +132,23 @@ public class StockModule extends BaseHandler implements StockService {
|
|||||||
yield super.doGet(path,ex);
|
yield super.doGet(path,ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case null, default -> super.doGet(path,ex);
|
case null -> super.doGet(path,ex);
|
||||||
|
default -> {
|
||||||
|
try {
|
||||||
|
var id = Long.parseLong(head);
|
||||||
|
Item item = stockDb.loadItem(id);
|
||||||
|
Owner owner = item.owner().resolve();
|
||||||
|
if (owner instanceof Company company) {
|
||||||
|
if (!companyService().membership(company.id(),user.get().id())) throw forbidden("You are not allowed to access {0}",OBJECT);
|
||||||
|
}
|
||||||
|
if (owner instanceof UmbrellaUser u){
|
||||||
|
if (u.id() != user.get().id()) throw forbidden("You are not allowed to access {0}",OBJECT);
|
||||||
|
}
|
||||||
|
yield sendContent(ex,item);
|
||||||
|
} catch (NumberFormatException nfe){
|
||||||
|
yield super.doGet(path,ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} catch (UmbrellaException e){
|
} catch (UmbrellaException e){
|
||||||
return send(ex,e);
|
return send(ex,e);
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ public class SqliteDb extends BaseDb implements TagDB{
|
|||||||
public SqliteDb(Connection tagDb, Connection bmDb) {
|
public SqliteDb(Connection tagDb, Connection bmDb) {
|
||||||
super(tagDb);
|
super(tagDb);
|
||||||
bookmarks = new de.srsoftware.umbrella.bookmarks.SqliteDb(bmDb);
|
bookmarks = new de.srsoftware.umbrella.bookmarks.SqliteDb(bmDb);
|
||||||
|
createTables();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ public class Translations extends PathHandler implements Translator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private JSONObject loadTranslations(String lang) throws IOException {
|
private JSONObject loadTranslations(String lang) throws IOException {
|
||||||
LOG.log(WARNING,"loadTranslations({0}) not implemented!",lang);
|
|
||||||
var filename = lang + ".json";
|
var filename = lang + ".json";
|
||||||
URL url = getClass().getClassLoader().getResource(filename);
|
URL url = getClass().getClassLoader().getResource(filename);
|
||||||
if (url == null) return new JSONObject();
|
if (url == null) return new JSONObject();
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
"basic_data": "Basis-Daten",
|
"basic_data": "Basis-Daten",
|
||||||
"bookmark": "Lesezeichen",
|
"bookmark": "Lesezeichen",
|
||||||
"bookmarks": "Lesezeichen",
|
"bookmarks": "Lesezeichen",
|
||||||
|
"Boolean": "Boolean",
|
||||||
"by": "von",
|
"by": "von",
|
||||||
|
|
||||||
"cancel": "abbrechen",
|
"cancel": "abbrechen",
|
||||||
@@ -30,6 +31,7 @@
|
|||||||
"confirm_state": "Status wirklich ändern?",
|
"confirm_state": "Status wirklich ändern?",
|
||||||
"companies": "Firmen",
|
"companies": "Firmen",
|
||||||
"company": "Firma",
|
"company": "Firma",
|
||||||
|
"company ({id})": "Firma ({id})",
|
||||||
"company_optional": "Firma (optional)",
|
"company_optional": "Firma (optional)",
|
||||||
"confirmation": "Bestätigung",
|
"confirmation": "Bestätigung",
|
||||||
"complete": "abschließen",
|
"complete": "abschließen",
|
||||||
@@ -53,6 +55,7 @@
|
|||||||
"customer_address": "Adresse",
|
"customer_address": "Adresse",
|
||||||
"customer_email": "Emailadresse des Kunden",
|
"customer_email": "Emailadresse des Kunden",
|
||||||
"customer_id": "Kundennummer",
|
"customer_id": "Kundennummer",
|
||||||
|
"customer settings": "Kunden-Einstellungen",
|
||||||
"custom_tag_colors": "Nutzerdefinierte Tag-Farben",
|
"custom_tag_colors": "Nutzerdefinierte Tag-Farben",
|
||||||
|
|
||||||
"data_sent": "Daten übermittelt",
|
"data_sent": "Daten übermittelt",
|
||||||
@@ -72,6 +75,8 @@
|
|||||||
"document": "Dokument",
|
"document": "Dokument",
|
||||||
"document_list": "Dokumente",
|
"document_list": "Dokumente",
|
||||||
"documents": "Dokumente",
|
"documents": "Dokumente",
|
||||||
|
"document type id": "Dokumenten-Typ-ID",
|
||||||
|
"document ({id})": "Dokument ({id})",
|
||||||
"do_login" : "anmelden",
|
"do_login" : "anmelden",
|
||||||
"do_open" : "öffnen",
|
"do_open" : "öffnen",
|
||||||
"do_send" : "versenden",
|
"do_send" : "versenden",
|
||||||
@@ -87,6 +92,7 @@
|
|||||||
"edit_service": "Login-Service \"{name}\" bearbeiten",
|
"edit_service": "Login-Service \"{name}\" bearbeiten",
|
||||||
"email": "E-Mail",
|
"email": "E-Mail",
|
||||||
"email_or_username": "Email oder Nutzername",
|
"email_or_username": "Email oder Nutzername",
|
||||||
|
"Encountered invalid dbCode: {code}": "Ungültiger dbCode aufgetreten: {code}",
|
||||||
"end": "Ende",
|
"end": "Ende",
|
||||||
"estimated_time": "geschätzte Zeit",
|
"estimated_time": "geschätzte Zeit",
|
||||||
"estimated_times": "geschätzte Zeiten",
|
"estimated_times": "geschätzte Zeiten",
|
||||||
@@ -167,12 +173,16 @@
|
|||||||
"local_court": "Amtsgericht",
|
"local_court": "Amtsgericht",
|
||||||
"locality": "Ort",
|
"locality": "Ort",
|
||||||
"location": "Ort",
|
"location": "Ort",
|
||||||
|
"locations": "Orte",
|
||||||
"login" : "Anmeldung",
|
"login" : "Anmeldung",
|
||||||
|
"login service": "Login-Service",
|
||||||
"login_services": "Login-Services",
|
"login_services": "Login-Services",
|
||||||
"logout": "Abmelden",
|
"logout": "Abmelden",
|
||||||
"logout_user": "{user} abmelden",
|
"logout_user": "{user} abmelden",
|
||||||
|
"Long": "Ganzzahl",
|
||||||
|
|
||||||
"markdown_code": "Markdown-Code",
|
"markdown_code": "Markdown-Code",
|
||||||
|
"Markdown has been copied to clipboard!": "Markdown wurde in die Zwischenablage kopiert!",
|
||||||
"markdown_supported": "Markdown & <a target=\"_blank\" href=\"https://plantuml.com\">Plantuml</a> nutzbar!",
|
"markdown_supported": "Markdown & <a target=\"_blank\" href=\"https://plantuml.com\">Plantuml</a> nutzbar!",
|
||||||
"MANAGE_LOGIN_SERVICES": "Login-Services verwalten",
|
"MANAGE_LOGIN_SERVICES": "Login-Services verwalten",
|
||||||
"member": "Mitarbeiter",
|
"member": "Mitarbeiter",
|
||||||
@@ -205,6 +215,7 @@
|
|||||||
"month": "Monat",
|
"month": "Monat",
|
||||||
"move_to_top": "nach ganz oben bewegen",
|
"move_to_top": "nach ganz oben bewegen",
|
||||||
"must_not_be_empty": "darf nicht leer sein",
|
"must_not_be_empty": "darf nicht leer sein",
|
||||||
|
"my files": "Meine Dateien",
|
||||||
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"net_price": "Nettopreis",
|
"net_price": "Nettopreis",
|
||||||
@@ -218,6 +229,7 @@
|
|||||||
"no_project_for_id": "Kein Projekt mit ID {0} gefunden!",
|
"no_project_for_id": "Kein Projekt mit ID {0} gefunden!",
|
||||||
"no_task_for_id": "Keine Aufgabe mit ID {0} gefunden!",
|
"no_task_for_id": "Keine Aufgabe mit ID {0} gefunden!",
|
||||||
"note": "Notiz",
|
"note": "Notiz",
|
||||||
|
"note ({id})": "Notiz ({id})",
|
||||||
"notes": "Notizen",
|
"notes": "Notizen",
|
||||||
"not_recent_version": "Die ist nicht die neuste Version dieser Seite!",
|
"not_recent_version": "Die ist nicht die neuste Version dieser Seite!",
|
||||||
"number": "Nummer",
|
"number": "Nummer",
|
||||||
@@ -230,6 +242,7 @@
|
|||||||
"page": "Seite",
|
"page": "Seite",
|
||||||
"parent_task": "übergeordnete Aufgabe",
|
"parent_task": "übergeordnete Aufgabe",
|
||||||
"password" : "Passwort",
|
"password" : "Passwort",
|
||||||
|
"path": "Pfad",
|
||||||
"permission": {
|
"permission": {
|
||||||
"EDIT": "lesen/schreiben",
|
"EDIT": "lesen/schreiben",
|
||||||
"OWNER": "Besitzer"
|
"OWNER": "Besitzer"
|
||||||
@@ -250,7 +263,10 @@
|
|||||||
"priority": "Priorität",
|
"priority": "Priorität",
|
||||||
"processing_code": "Code wird verarbeitet…",
|
"processing_code": "Code wird verarbeitet…",
|
||||||
"project": "Projekt",
|
"project": "Projekt",
|
||||||
|
"project ({id})": "Projekt ({id})",
|
||||||
"projects": "Projekte",
|
"projects": "Projekte",
|
||||||
|
"properties": "Eigenschaften",
|
||||||
|
"property": "Eigenschaft",
|
||||||
|
|
||||||
"record": "Eintrag",
|
"record": "Eintrag",
|
||||||
"region": "Bundesland",
|
"region": "Bundesland",
|
||||||
@@ -262,6 +278,7 @@
|
|||||||
"saved": "gespeichert",
|
"saved": "gespeichert",
|
||||||
"save_object": "{object} speichern",
|
"save_object": "{object} speichern",
|
||||||
"search": "Suche",
|
"search": "Suche",
|
||||||
|
"searching…": "suche…",
|
||||||
"select_company" : "Wählen Sie eine ihrer Firmen:",
|
"select_company" : "Wählen Sie eine ihrer Firmen:",
|
||||||
"select_customer": "Kunde auswählen",
|
"select_customer": "Kunde auswählen",
|
||||||
"select_property": "Eigenschaft auswählen",
|
"select_property": "Eigenschaft auswählen",
|
||||||
@@ -274,6 +291,8 @@
|
|||||||
"sender_tax_id": "Steuernummer",
|
"sender_tax_id": "Steuernummer",
|
||||||
"sent_email": "Email gesendet",
|
"sent_email": "Email gesendet",
|
||||||
"service": "Service",
|
"service": "Service",
|
||||||
|
"service ({id})": "Service ({id})",
|
||||||
|
"session": "Sitzung",
|
||||||
"settings" : "Einstellungen",
|
"settings" : "Einstellungen",
|
||||||
"share_with": "Teilen mit:",
|
"share_with": "Teilen mit:",
|
||||||
"show": "anzeigen",
|
"show": "anzeigen",
|
||||||
@@ -301,12 +320,14 @@
|
|||||||
},
|
},
|
||||||
"stock": "Inventar",
|
"stock": "Inventar",
|
||||||
"street": "Straße",
|
"street": "Straße",
|
||||||
|
"string": "Text",
|
||||||
"subject": "Betreff",
|
"subject": "Betreff",
|
||||||
"subtask": "Unteraufgabe",
|
"subtask": "Unteraufgabe",
|
||||||
"subtasks": "Unteraufgaben",
|
"subtasks": "Unteraufgaben",
|
||||||
"succeeding_document": "Nachfolge-Dokument",
|
"succeeding_document": "Nachfolge-Dokument",
|
||||||
"sum_of_records": "Summe der ausgewählten Einträge",
|
"sum_of_records": "Summe der ausgewählten Einträge",
|
||||||
|
|
||||||
|
"table {name}": "Tabelle {name}",
|
||||||
"tag_name": "Tag-Name",
|
"tag_name": "Tag-Name",
|
||||||
"tag_uses": "Verwendung des Tags „{tag}“",
|
"tag_uses": "Verwendung des Tags „{tag}“",
|
||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
@@ -319,6 +340,7 @@
|
|||||||
"tax_rate": "Steuersatz",
|
"tax_rate": "Steuersatz",
|
||||||
"template": "Vorlage",
|
"template": "Vorlage",
|
||||||
"theme": "Design",
|
"theme": "Design",
|
||||||
|
"time ({id})": "Zeit ({id})",
|
||||||
"times": "Zeiten",
|
"times": "Zeiten",
|
||||||
"timetracking": "Zeiterfassung",
|
"timetracking": "Zeiterfassung",
|
||||||
"title_not_available": "„{title}“ ist als Seitenname nicht mehr verfügbar!",
|
"title_not_available": "„{title}“ ist als Seitenname nicht mehr verfügbar!",
|
||||||
@@ -333,6 +355,7 @@
|
|||||||
|
|
||||||
"unexpected_item_id_format": "Alte Artikel-ID sollte die Form tt:zz:zz haben, habe aber {0} gefunden!",
|
"unexpected_item_id_format": "Alte Artikel-ID sollte die Form tt:zz:zz haben, habe aber {0} gefunden!",
|
||||||
"unit": "Einheit",
|
"unit": "Einheit",
|
||||||
|
"unit price": "Preis/Einheit",
|
||||||
"unit_price": "Preis/Einheit",
|
"unit_price": "Preis/Einheit",
|
||||||
"unknown_item_location": "Artikel {0} von {1} {2} ist verknüpft mit unbekanntem Lagerort {3}!",
|
"unknown_item_location": "Artikel {0} von {1} {2} ist verknüpft mit unbekanntem Lagerort {3}!",
|
||||||
"unlink": "Trennen",
|
"unlink": "Trennen",
|
||||||
@@ -340,6 +363,7 @@
|
|||||||
"UPDATE_USERS" : "Nutzer aktualisieren",
|
"UPDATE_USERS" : "Nutzer aktualisieren",
|
||||||
"upload_file": "Datei hochladen",
|
"upload_file": "Datei hochladen",
|
||||||
"user": "Benutzer",
|
"user": "Benutzer",
|
||||||
|
"user ({id})": "Benutzer ({id})",
|
||||||
"user_list": "Benutzer-Liste",
|
"user_list": "Benutzer-Liste",
|
||||||
"user_module" : "Umbrella User-Verwaltung",
|
"user_module" : "Umbrella User-Verwaltung",
|
||||||
"users": "Benutzer",
|
"users": "Benutzer",
|
||||||
@@ -351,6 +375,8 @@
|
|||||||
"welcome" : "Willkommen, {0}",
|
"welcome" : "Willkommen, {0}",
|
||||||
"wiki": "Wiki",
|
"wiki": "Wiki",
|
||||||
"wikis": "Wiki-Seiten",
|
"wikis": "Wiki-Seiten",
|
||||||
|
"wiki page": "Wiki-Seite",
|
||||||
|
"wiki pages": "Wiki-Seiten",
|
||||||
"wiki_pages": "Wiki-Seiten",
|
"wiki_pages": "Wiki-Seiten",
|
||||||
|
|
||||||
"value": "Wert",
|
"value": "Wert",
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
"basic_data": "basic data",
|
"basic_data": "basic data",
|
||||||
"bookmark": "bookmark",
|
"bookmark": "bookmark",
|
||||||
"bookmarks": "bookmarks",
|
"bookmarks": "bookmarks",
|
||||||
|
"Boolean": "Boolean",
|
||||||
"by": "by",
|
"by": "by",
|
||||||
|
|
||||||
"cancel": "cancel",
|
"cancel": "cancel",
|
||||||
@@ -30,6 +31,7 @@
|
|||||||
"confirm_state": "Really change state?",
|
"confirm_state": "Really change state?",
|
||||||
"companies": "companies",
|
"companies": "companies",
|
||||||
"company": "company",
|
"company": "company",
|
||||||
|
"company ({id})": "company ({id})",
|
||||||
"company_optional": "company (optional)",
|
"company_optional": "company (optional)",
|
||||||
"confirmation": "confirmation",
|
"confirmation": "confirmation",
|
||||||
"complete": "complete",
|
"complete": "complete",
|
||||||
@@ -53,6 +55,7 @@
|
|||||||
"customer_address": "address",
|
"customer_address": "address",
|
||||||
"customer_email": "customer email address",
|
"customer_email": "customer email address",
|
||||||
"customer_id": "customer ID",
|
"customer_id": "customer ID",
|
||||||
|
"customer settings": "customer settings",
|
||||||
"custom_tag_colors": "custom tag colors",
|
"custom_tag_colors": "custom tag colors",
|
||||||
|
|
||||||
"data_sent": "data sent",
|
"data_sent": "data sent",
|
||||||
@@ -72,6 +75,8 @@
|
|||||||
"document": "document",
|
"document": "document",
|
||||||
"document_list": "document list",
|
"document_list": "document list",
|
||||||
"documents": "documents",
|
"documents": "documents",
|
||||||
|
"document type id": "document type id",
|
||||||
|
"document ({id})":"document ({id})",
|
||||||
"do_login" : "do login",
|
"do_login" : "do login",
|
||||||
"do_open" : "open",
|
"do_open" : "open",
|
||||||
"do_send" : "send",
|
"do_send" : "send",
|
||||||
@@ -87,6 +92,7 @@
|
|||||||
"edit_service": "edit login service \"{name}\"",
|
"edit_service": "edit login service \"{name}\"",
|
||||||
"email": "email",
|
"email": "email",
|
||||||
"email_or_username": "email or username",
|
"email_or_username": "email or username",
|
||||||
|
"Encountered invalid dbCode: {code}": "Encountered invalid dbCode: {code}",
|
||||||
"end": "end",
|
"end": "end",
|
||||||
"estimated_time": "estimated duration",
|
"estimated_time": "estimated duration",
|
||||||
"estimated_times": "estimated durations",
|
"estimated_times": "estimated durations",
|
||||||
@@ -167,12 +173,16 @@
|
|||||||
"local_court": "local court",
|
"local_court": "local court",
|
||||||
"locality": "locality",
|
"locality": "locality",
|
||||||
"location": "location",
|
"location": "location",
|
||||||
|
"locations": "locations",
|
||||||
"login" : "login",
|
"login" : "login",
|
||||||
|
"login service": "login service",
|
||||||
"login_services": "login service",
|
"login_services": "login service",
|
||||||
"logout": "logout",
|
"logout": "logout",
|
||||||
"logout_user": "logout {user}",
|
"logout_user": "logout {user}",
|
||||||
|
"Long": "Long",
|
||||||
|
|
||||||
"markdown_code": "Markdown-Code",
|
"markdown_code": "Markdown-Code",
|
||||||
|
"Markdown has been copied to clipboard!": "Markdown has been copied to clipboard!",
|
||||||
"markdown_supported": "Markdown & <a target=\"_blank\" href=\"https://plantuml.com\">Plantuml</a> supported!",
|
"markdown_supported": "Markdown & <a target=\"_blank\" href=\"https://plantuml.com\">Plantuml</a> supported!",
|
||||||
"MANAGE_LOGIN_SERVICES": "manage login services",
|
"MANAGE_LOGIN_SERVICES": "manage login services",
|
||||||
"member": "member",
|
"member": "member",
|
||||||
@@ -205,6 +215,7 @@
|
|||||||
"month": "month",
|
"month": "month",
|
||||||
"move_to_top": "move to top level",
|
"move_to_top": "move to top level",
|
||||||
"must_not_be_empty": "must not be empty",
|
"must_not_be_empty": "must not be empty",
|
||||||
|
"my files": "my files",
|
||||||
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"net_price": "net price",
|
"net_price": "net price",
|
||||||
@@ -218,6 +229,7 @@
|
|||||||
"no_project_for_id": "No project found for id {0}",
|
"no_project_for_id": "No project found for id {0}",
|
||||||
"no_task_for_id": "No task found for id {0}",
|
"no_task_for_id": "No task found for id {0}",
|
||||||
"note": "note",
|
"note": "note",
|
||||||
|
"note ({id})":"note ({id})",
|
||||||
"notes": "notes",
|
"notes": "notes",
|
||||||
"not_recent_version": "This is not the current version of this page!",
|
"not_recent_version": "This is not the current version of this page!",
|
||||||
"number": "number",
|
"number": "number",
|
||||||
@@ -230,6 +242,7 @@
|
|||||||
"page": "page",
|
"page": "page",
|
||||||
"parent_task": "parent task",
|
"parent_task": "parent task",
|
||||||
"password" : "password",
|
"password" : "password",
|
||||||
|
"path": "path",
|
||||||
"permission": {
|
"permission": {
|
||||||
"EDIT": "read/write",
|
"EDIT": "read/write",
|
||||||
"OWNER": "owner"
|
"OWNER": "owner"
|
||||||
@@ -250,7 +263,10 @@
|
|||||||
"priority": "priority",
|
"priority": "priority",
|
||||||
"processing_code": "processing code…",
|
"processing_code": "processing code…",
|
||||||
"project": "project",
|
"project": "project",
|
||||||
|
"project ({id})": "project ({id})",
|
||||||
"projects": "projects",
|
"projects": "projects",
|
||||||
|
"properties": "properties",
|
||||||
|
"property": "property",
|
||||||
|
|
||||||
"record": "record",
|
"record": "record",
|
||||||
"region": "region",
|
"region": "region",
|
||||||
@@ -262,6 +278,7 @@
|
|||||||
"saved": "saved",
|
"saved": "saved",
|
||||||
"save_object": "save {object}",
|
"save_object": "save {object}",
|
||||||
"search": "search",
|
"search": "search",
|
||||||
|
"searching…": "searhcing…",
|
||||||
"select_company" : "select on of you companies:",
|
"select_company" : "select on of you companies:",
|
||||||
"select_customer": "select customer",
|
"select_customer": "select customer",
|
||||||
"select_property": "select property",
|
"select_property": "select property",
|
||||||
@@ -274,6 +291,8 @@
|
|||||||
"sender_tax_id": "tax ID",
|
"sender_tax_id": "tax ID",
|
||||||
"sent_email": "email sent",
|
"sent_email": "email sent",
|
||||||
"service": "service",
|
"service": "service",
|
||||||
|
"service ({id})": "service ({id})",
|
||||||
|
"session": "session",
|
||||||
"settings" : "settings",
|
"settings" : "settings",
|
||||||
"share_with": "share with:",
|
"share_with": "share with:",
|
||||||
"show": "show",
|
"show": "show",
|
||||||
@@ -301,12 +320,14 @@
|
|||||||
},
|
},
|
||||||
"stock": "stock",
|
"stock": "stock",
|
||||||
"street": "street",
|
"street": "street",
|
||||||
|
"string": "string",
|
||||||
"subject": "subject",
|
"subject": "subject",
|
||||||
"subtask": "subtask",
|
"subtask": "subtask",
|
||||||
"subtasks": "subtasks",
|
"subtasks": "subtasks",
|
||||||
"succeeding_document": "succeeding document",
|
"succeeding_document": "succeeding document",
|
||||||
"sum_of_records": "sum of records",
|
"sum_of_records": "sum of records",
|
||||||
|
|
||||||
|
"table {name}": "table {name}",
|
||||||
"tag_name": "tag name",
|
"tag_name": "tag name",
|
||||||
"tag_uses": "usage of tag „{tag}“",
|
"tag_uses": "usage of tag „{tag}“",
|
||||||
"tags": "tags",
|
"tags": "tags",
|
||||||
@@ -319,13 +340,14 @@
|
|||||||
"tax_rate": "tax rate",
|
"tax_rate": "tax rate",
|
||||||
"template": "template",
|
"template": "template",
|
||||||
"theme": "design",
|
"theme": "design",
|
||||||
|
"time ({id})": "time ({id})",
|
||||||
"times": "times",
|
"times": "times",
|
||||||
"timetracking": "time tracking",
|
"timetracking": "time tracking",
|
||||||
"title_not_available": "„{title}“ is not available as page name!",
|
"title_not_available": "„{title}“ is not available as page name!",
|
||||||
"title_or_desc": "title/description",
|
"title_or_desc": "title/description",
|
||||||
"toggle_objects": "toggle {objects}",
|
"toggle_objects": "toggle {objects}",
|
||||||
"tutorial": "tutorial",
|
"tutorial": "tutorial",
|
||||||
"type": "document type",
|
"type": "type",
|
||||||
"type_confirmation": "confirmation",
|
"type_confirmation": "confirmation",
|
||||||
"type_invoice": "invoice",
|
"type_invoice": "invoice",
|
||||||
"type_offer": "offer",
|
"type_offer": "offer",
|
||||||
@@ -333,6 +355,7 @@
|
|||||||
|
|
||||||
"unexpected_item_id_format": "Expected old item ID to be of the form ss:dd:dd, encountered {0}!",
|
"unexpected_item_id_format": "Expected old item ID to be of the form ss:dd:dd, encountered {0}!",
|
||||||
"unit": "unit",
|
"unit": "unit",
|
||||||
|
"unit price": "unit price",
|
||||||
"unit_price": "price/unit",
|
"unit_price": "price/unit",
|
||||||
"unknown_item_location": "Item {0} of {1} {2} refers to location {3}, which is unknown!",
|
"unknown_item_location": "Item {0} of {1} {2} refers to location {3}, which is unknown!",
|
||||||
"unlink": "unlink",
|
"unlink": "unlink",
|
||||||
@@ -340,14 +363,20 @@
|
|||||||
"UPDATE_USERS" : "update users",
|
"UPDATE_USERS" : "update users",
|
||||||
"upload_file": "upload file",
|
"upload_file": "upload file",
|
||||||
"user": "user",
|
"user": "user",
|
||||||
|
"user ({id})": "user ({id})",
|
||||||
"user_list": "user list",
|
"user_list": "user list",
|
||||||
"user_module" : "Umbrella user management",
|
"user_module" : "Umbrella user management",
|
||||||
"users": "users",
|
"users": "users",
|
||||||
|
"user_created_entity": "{user} created \"{entity}\"",
|
||||||
|
"user_deleted_entity": "{user} deleted \"{entity}\"",
|
||||||
|
"user_updated_entity": "{user} updated \"{entity}\"",
|
||||||
|
|
||||||
"website": "website",
|
"website": "website",
|
||||||
"welcome" : "Welcome, {0}",
|
"welcome" : "Welcome, {0}",
|
||||||
"wiki": "Wiki",
|
"wiki": "Wiki",
|
||||||
"wikis": "wiki pages",
|
"wikis": "wiki pages",
|
||||||
|
"wiki page": "wiki page",
|
||||||
|
"wiki pages": "wiki pages",
|
||||||
"wiki_pages": "wiki pages",
|
"wiki_pages": "wiki pages",
|
||||||
|
|
||||||
"value": "value",
|
"value": "value",
|
||||||
|
|||||||
@@ -9,4 +9,5 @@ tasks.processResources {
|
|||||||
from("../frontend/dist") {
|
from("../frontend/dist") {
|
||||||
into("web")
|
into("web")
|
||||||
}
|
}
|
||||||
}
|
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||||
|
}
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ footer {
|
|||||||
margin: 5px;
|
margin: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img, svg {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
height: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav {
|
nav {
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ footer {
|
|||||||
margin: 5px;
|
margin: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img, svg {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
height: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav {
|
nav {
|
||||||
|
|||||||
@@ -57,17 +57,18 @@ footer {
|
|||||||
margin: 5px;
|
margin: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img, svg {
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
height: auto !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
nav {
|
nav {
|
||||||
position: sticky;
|
position: sticky;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
top: 0;
|
top: 0;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
margin: 0 0 10px 0;
|
margin: 0 0 10px 0;
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
td, tr{
|
td, tr{
|
||||||
|
|||||||
@@ -152,15 +152,27 @@ public class SqliteDb extends BaseDb implements WikiDb {
|
|||||||
@Override
|
@Override
|
||||||
public Map<Long, WikiPage> find(long userId, List<String> keys, boolean fulltext) {
|
public Map<Long, WikiPage> find(long userId, List<String> keys, boolean fulltext) {
|
||||||
try {
|
try {
|
||||||
var query = select(ALL).from(TABLE_PAGES).leftJoin(ID,TABLE_PAGES_USERS,PAGE_ID).where(USER_ID,equal(userId));
|
|
||||||
for (var key : keys) query.where(TITLE,like("%"+key+"%"));
|
|
||||||
var rs = query.exec(db);
|
|
||||||
var map = new HashMap<Long,WikiPage>();
|
var map = new HashMap<Long,WikiPage>();
|
||||||
while (rs.next()) {
|
{
|
||||||
var page = WikiPage.of(rs);
|
var query = select(ALL).from(TABLE_PAGES).leftJoin(ID, TABLE_PAGES_USERS, PAGE_ID).where(USER_ID, equal(userId));
|
||||||
map.put(page.id(),page);
|
for (var key : keys) query.where(TITLE, like("%" + key.replaceAll("[ÄäÖöÜüß]", "%") + "%"));
|
||||||
|
var rs = query.exec(db);
|
||||||
|
while (rs.next()) {
|
||||||
|
var page = WikiPage.of(rs);
|
||||||
|
map.put(page.id(), page);
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
}
|
||||||
|
if (fulltext) {
|
||||||
|
var query = select(ALL).from(TABLE_PAGES).leftJoin(ID, TABLE_PAGES_USERS, PAGE_ID).where(USER_ID, equal(userId));
|
||||||
|
for (var key : keys) query.where(CONTENT, like("%" + key.replaceAll("[ÄäÖöÜüß]", "%") + "%"));
|
||||||
|
var rs = query.exec(db);
|
||||||
|
while (rs.next()) {
|
||||||
|
var page = WikiPage.of(rs);
|
||||||
|
map.put(page.id(), page);
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
}
|
}
|
||||||
rs.close();
|
|
||||||
return map;
|
return map;
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
throw failedToSearchDb(t(WIKI_PAGES)).causedBy(e);
|
throw failedToSearchDb(t(WIKI_PAGES)).causedBy(e);
|
||||||
|
|||||||
Reference in New Issue
Block a user