Skip to content

Commit

Permalink
Ne sequences panel
Browse files Browse the repository at this point in the history
  • Loading branch information
car031 committed Jul 26, 2024
1 parent eb2d9e2 commit 0df9fa7
Show file tree
Hide file tree
Showing 40 changed files with 574 additions and 167 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,39 +9,17 @@ public class GUISequence implements Serializable {

private long id;

private String frequency = "";

private String template = "";

private String folder = "";

private long value;

// If the current sequence year is = 0, it is not a year sequence.
private int year = 0;

// If the current sequence month is = 0, it is not a month sequence.
private int month = 0;

private String name;

private Date lastModified;

public String getFrequency() {
return frequency;
}

public void setFrequency(String frequency) {
this.frequency = frequency;
}

public String getTemplate() {
return template;
}

public void setTemplate(String template) {
this.template = template;
}

public long getValue() {
return value;
Expand Down Expand Up @@ -75,14 +53,6 @@ public void setId(long id) {
this.id = id;
}

public String getFolder() {
return folder;
}

public void setFolder(String folder) {
this.folder = folder;
}

public String getName() {
return name;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.logicaldoc.gui.common.client.data;

import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.fields.DataSourceIntegerField;
import com.smartgwt.client.data.fields.DataSourceTextField;

/**
* Datasource to retrieve all sequences. It is based on Xml parsing.
*
* @author Marco Meschieri - LogicalDOC
* @since 68.9.4
*/
public class SequencesDS extends DataSource {
public SequencesDS(String prefix) {
setTitleField("name");
setRecordXPath("/list/sequence");

DataSourceIntegerField id = new DataSourceIntegerField("id");
id.setPrimaryKey(true);
id.setHidden(true);

DataSourceTextField name = new DataSourceTextField("name");
DataSourceIntegerField value = new DataSourceIntegerField("value");

setFields(id, name, value);
setDataURL("data/sequences.xml?prefix=" + prefix);
setClientOnly(true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.logicaldoc.gui.common.client.Feature;
import com.logicaldoc.gui.common.client.beans.GUIScheme;
import com.logicaldoc.gui.common.client.beans.GUISequence;
import com.logicaldoc.gui.common.client.data.SequencesDS;
import com.logicaldoc.gui.common.client.i18n.I18N;
import com.logicaldoc.gui.common.client.log.GuiLog;
import com.logicaldoc.gui.common.client.util.LD;
import com.logicaldoc.gui.common.client.widgets.grid.RefreshableListGrid;
import com.logicaldoc.gui.frontend.client.administration.AdminPanel;
import com.logicaldoc.gui.frontend.client.services.SchemeService;
import com.smartgwt.client.types.ListGridFieldType;
Expand All @@ -35,10 +36,6 @@ public class CustomIdPanel extends AdminPanel {

private static final String VALUE = "value";

private static final String FOLDER = "folder";

private static final String FREQUENCY = "frequency";

private static final String TEMPLATE_ID = "templateId";

private static final String EVALUATE_AT_UPDATE = "evaluateAtUpdate";
Expand All @@ -49,7 +46,7 @@ public class CustomIdPanel extends AdminPanel {

private static final String TEMPLATE = "template";

private ListGrid sequences;
private RefreshableListGrid sequences;

private List<GUIScheme> schemesData;

Expand Down Expand Up @@ -183,7 +180,7 @@ private VLayout setupSequencesPanel() {

ToolStripButton refresh = new ToolStripButton(I18N.message("refresh"));
refresh.setAutoFit(true);
refresh.addClickHandler(event -> refreshSequences());
refresh.addClickHandler(event -> sequences.refresh(new SequencesDS("customid-")));
toolStrip.addButton(refresh);

ListGridField id = new ListGridField("id", I18N.message("id"));
Expand All @@ -192,40 +189,38 @@ private VLayout setupSequencesPanel() {
id.setHidden(true);

ListGridField name = new ListGridField("name", I18N.message("name"));
name.setWidth(150);
name.setWidth(200);
name.setCanEdit(false);
name.setHidden(true);

ListGridField frequency = new ListGridField(FREQUENCY, I18N.message(FREQUENCY));
frequency.setWidth(80);
frequency.setCanEdit(false);

ListGridField template = new ListGridField(TEMPLATE, I18N.message(TEMPLATE));
template.setWidth(200);
template.setCanEdit(false);

ListGridField folder = new ListGridField(FOLDER, I18N.message(FOLDER));
folder.setWidth(200);
folder.setCanEdit(false);
name.setRequired(true);
name.setCanFilter(true);
name.setCellFormatter((value, rec, rowNum, colNum) -> {
if (value.toString().startsWith("customid-"))
return value.toString().substring("customid-".length());
else
return value.toString();
});

final ListGridField value = new ListGridField(VALUE, I18N.message(VALUE));
value.setWidth(80);
value.setType(ListGridFieldType.INTEGER);
value.setRequired(true);
value.setCanFilter(true);

sequences = new ListGrid();
sequences = new RefreshableListGrid(new SequencesDS("customid-"));
sequences.setShowAllRecords(true);
sequences.setCanEdit(true);
sequences.setWidth100();
sequences.setHeight100();
sequences.setSelectionType(SelectionStyle.SINGLE);
sequences.setModalEditing(true);
sequences.setFields(id, name, frequency, template, folder, value);
sequences.setFilterOnKeypress(true);
sequences.setShowFilterEditor(true);
sequences.setFields(id, name, value);

sequences.addEditCompleteHandler(event -> {
ListGridRecord rec = sequences.getRecord(event.getRowNum());
SchemeService.Instance.get().resetSequence(Long.parseLong(rec.getAttribute("id")),
rec.getAttributeAsInt(VALUE), new AsyncCallback<>() {
SchemeService.Instance.get().resetSequence(rec.getAttributeAsLong("id"), rec.getAttributeAsInt(VALUE),
new AsyncCallback<>() {
@Override
public void onFailure(Throwable caught) {
GuiLog.serverError(caught);
Expand All @@ -238,46 +233,17 @@ public void onSuccess(Void ret) {
});
});

sequences.addCellContextClickHandler(event -> {
sequences.addCellContextClickHandler(ckick -> {
showSequencesContextMenu();
event.cancel();
ckick.cancel();
});

VLayout sequencesPanel = new VLayout();
sequencesPanel.setMembers(toolStrip, sequences);

refreshSequences();
return sequencesPanel;
}

private void refreshSequences() {
SchemeService.Instance.get().loadSequences(new AsyncCallback<>() {
@Override
public void onFailure(Throwable caught) {
GuiLog.serverError(caught);
}

@Override
public void onSuccess(List<GUISequence> data) {
List<ListGridRecord> records = new ArrayList<>();
if (data != null)
for (GUISequence cid : data) {
ListGridRecord rec = new ListGridRecord();
rec.setAttribute(TEMPLATE, cid.getTemplate());
rec.setAttribute(FREQUENCY, I18N.message(cid.getFrequency()));
rec.setAttribute("year", cid.getYear());
rec.setAttribute("month", cid.getMonth());
rec.setAttribute(FOLDER, cid.getFolder());
rec.setAttribute("id", cid.getId());
rec.setAttribute("name", cid.getName());
rec.setAttribute(VALUE, cid.getValue());
records.add(rec);
}
sequences.setData(records.toArray(new ListGridRecord[0]));
}
});
}

private void showSchemeContextMenu(final ListGrid schemes) {
Menu contextMenu = new Menu();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import com.logicaldoc.gui.common.client.LDRpcRequestBuilder;
import com.logicaldoc.gui.common.client.ServerException;
import com.logicaldoc.gui.common.client.beans.GUIScheme;
import com.logicaldoc.gui.common.client.beans.GUISequence;

/**
* The client side stub for the SchemeService Service. This service gives all
Expand Down Expand Up @@ -68,15 +67,6 @@ public interface SchemeService extends RemoteService {
*/
public void resetSequence(long sequenceId, long value) throws ServerException;

/**
* Loads the list of sequences
*
* @return all the sequences
*
* @throws ServerException an error happened in the server application
*/
public List<GUISequence> loadSequences() throws ServerException;

/**
* Deletes the given sequence
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.logicaldoc.gui.common.client.beans.GUIScheme;
import com.logicaldoc.gui.common.client.beans.GUISequence;

public interface SchemeServiceAsync {

Expand All @@ -18,8 +17,5 @@ public interface SchemeServiceAsync {

void resetSequence(long sequenceId, long value, AsyncCallback<Void> callback);

void loadSequences(AsyncCallback<List<GUISequence>> callback);

void deleteSequence(long sequenceId, AsyncCallback<Void> callback);

}
}
4 changes: 2 additions & 2 deletions logicaldoc-i18n/src/main/resources/i18n/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -620,7 +620,7 @@ confirmclean=Do you want to clean the selected elements?
sequences=Sequences
frequency=Frequency
value=Value
customidhint=The Scheme may be defined of the following tokens\: <br /> <b>&lt;id&gt;</b>, <b>&lt;customId&gt;</b>, <b>&lt;filename&gt;</b>, <b>&lt;title&gt;</b>, <b>&lt;extension&gt;</b>, <b>&lt;template&gt;</b>, <b>&lt;version&gt;</b>, <b>&lt;path&gt;</b>, <b>&lt;folder&gt;</b>, <b>&lt;year&gt;</b>, <b>&lt;month&gt;</b>, <b>&lt;yy&gt;</b>, <b>&lt;mm&gt;</b>, <b>&lt;dd&gt;</b>. <br /> <br /> You can call an automation routine with\: <b>&lt;automation\:routine_name&gt;</b> <br /> <br />You can also define special sequence tokens and these must end with <i>_seq</i> \: <br /> <b>&lt;standard_seq&gt;</b>, <b>&lt;year_seq&gt;</b>, <b>&lt;month_seq&gt;</b>, <b>&lt;template_seq&gt;</b>, <b>&lt;folder_seq&gt;</b>, <b>&lt;folder_template_seq&gt;</b>. <br /><br />You may use the format <i>&lt;name_seq\:padding&gt;</i>, where <i>padding</i> is a number by which the counter should be padded; for example, &lt;year&gt;-&lt;year_seq\:5&gt; will result in something like 2008-00001. <br /><br />Including <i>year</i> and <i>month</i> in a sequence name indicates that it should be reset yearly with <b>&lt;template_year_seq&gt;</b> or monthly with <b>&lt;template_month_seq&gt;</b>. <br /><br />To refer to extended attributes use the notation\: <b>&lt;name-of-the-attribute&gt;</b>
customidhint=The Scheme may be defined of the following tokens\: <br /> <b>&lt;id&gt;</b>, <b>&lt;customId&gt;</b>, <b>&lt;filename&gt;</b>, <b>&lt;title&gt;</b>, <b>&lt;extension&gt;</b>, <b>&lt;template&gt;</b>, <b>&lt;version&gt;</b>, <b>&lt;path&gt;</b>, <b>&lt;folder&gt;</b>, <b>&lt;year&gt;</b>, <b>&lt;month&gt;</b>, <b>&lt;yy&gt;</b>, <b>&lt;mm&gt;</b>, <b>&lt;dd&gt;</b>. <br /> <br /> You can call an automation routine with\: <b>&lt;automation\:routine_name&gt;</b> <br /> <br />You can also define special sequence tokens and these must end with <i>_seq</i> \: <br /> <b>&lt;standard_seq&gt;</b>, <b>&lt;year_seq&gt;</b>, <b>&lt;month_seq&gt;</b>, <b>&lt;template_seq&gt;</b>, <b>&lt;folder_seq&gt;</b>, <b>&lt;folder_template_seq&gt;</b>. <br /><br />You may use the format <i>&lt;name_seq\:padding&gt;</i>, where <i>padding</i> is a number by which the counter should be padded; for example, &lt;year&gt;-&lt;year_seq\:5&gt; will result in something like 2008-00001. <br /><br />Including <i>year</i> and <i>month</i> in a sequence name indicates that it should be reset yearly with <b>&lt;template_year_seq&gt;</b> or monthly with <b>&lt;template_month_seq&gt;</b>. <br /><br />You can also use your own sequence with: <b>&lt;sequence:name_of_your_sequence&gt;</b><br /><br />To refer to extended attributes use the notation\: <b>&lt;name-of-the-attribute&gt;</b><br />To refer to sequences bound to an extended attribute's value use the notation\: <b>&lt;name-of-the-attribute_seq&gt;</b>, <b>&lt;name-of-the-attribute_year_seq&gt;</b> or <b>&lt;name-of-the-attribute_month_seq&gt;</b>
task.name.Audit=Audit
task.name.NetworkBrowser=Network Discovery
searchinsubfolders2=Search in subfolders
Expand Down Expand Up @@ -2586,6 +2586,6 @@ createnewapikey = Create new API Key
createnewapikeymessage = This API key is tied to your user and can make requests against the system. Please give a name:
saveyourkey = Save your key
saveyourkeymessage = Please save this API Key somewhere safe and accessible. For security reasons, you won't be able to view it again through your account. If you lose this API Key, you'll need to generate a new one.
apikeyblockedwarn=Your ApiKey is temporarily blocked. Try after {0} minutes.
apikeyblockedwarn=Your API Key is temporarily blocked. Try after {0} minutes.
maxsameapikeyfailedattempts=Max. failed attempts with same API Key
sameapikeywait=Wait after failed attempts with same API Key
15 changes: 13 additions & 2 deletions logicaldoc-i18n/src/main/resources/i18n/messages_ar.properties
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,8 @@ event.user.disabled=The user has been disabled
event.user.disabled.short=User disabled
event.user.enabled=The user has been enabled
event.user.enabled.short=User enabled
event.user.newapikey = The user created a new API Key
event.user.newapikey.short = New API Key
event.chat.newmessage=\u062A\u0645 \u0646\u0634\u0631 \u0631\u0633\u0627\u0644\u0629 \u062C\u062F\u064A\u062F\u0629 \u0641\u064A \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629.
event.chat.newmessage.short=\u0631\u0633\u0627\u0644\u0629 \u0645\u062D\u0627\u062F\u062B\u0629 \u062C\u062F\u064A\u062F\u0629
event.webservice.call=\u062A\u0644\u0642\u064A \u0645\u0643\u0627\u0644\u0645\u0629 WebService
Expand Down Expand Up @@ -618,7 +620,7 @@ confirmclean=\u0647\u0644 \u062A\u0631\u063A\u0628 \u0641\u064A \u062A\u0646\u06
sequences=\u0645\u062A\u062A\u0627\u0644\u064A\u0627\u062A
frequency=\u0627\u0644\u062A\u0643\u0631\u0627\u0631
value=\u0627\u0644\u0642\u064A\u0645\u0629
customidhint=\u064A\u0645\u0643\u0646 \u062A\u0639\u0631\u064A\u0641 \u0627\u0644\u0646\u0638\u0627\u0645 \u0645\u0646 \u0627\u0644\u0631\u0645\u0648\u0632 \u0627\u0644\u0645\u0645\u064A\u0632\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629: <br /><b>&lt;&gt;&gt;&gt;</b>&lt;&gt;\u0647\u0648\u064A\u0629<b></b> <b>\u0627\u0633\u0645 \u0627\u0644\u0645\u0644\u0641 &lt;\u060C</b> <b>&lt;\u0627\u0644\u0639\u0646\u0627\u0648\u064A\u0646&gt;</b> <b>&lt;\u0627\u0644\u062A\u0645\u062F&gt;\u060C</b>&lt;&gt;&gt;&lt;\u0646\u0642\u0644\u0627\u0628&gt;\u060C <b></b> <b>&lt;&gt;&gt;\u060C</b> <b>&lt;&gt;&gt;&gt;</b>&lt; <b></b> <b>&lt;&gt;&gt;&lt;&gt;&gt;</b> <b>&lt;&gt;\u060C</b> <b>&lt;\u062F&gt;.</b> <b></b> <b></b><br /> <br /> \u064A\u0645\u0643\u0646\u0643 \u0627\u0633\u062A\u062F\u0639\u0627\u0621 \u0631\u0648\u062A\u064A\u0646 \u0623\u062A\u0645\u062A\u0629 \u0645\u0639: <b>&lt;automation:routine_name&gt;</b> <br /> <br />\u064A\u0645\u0643\u0646\u0643 \u0623\u064A\u0636\u0627 \u062A\u062D\u062F\u064A\u062F \u0631\u0645\u0648\u0632 \u062A\u0633\u0644\u0633\u0644 \u062E\u0627\u0635\u0629 \u0648\u064A\u062C\u0628 \u0623\u0646 \u062A\u0646\u062A\u0647\u064A \u0647\u0630\u0647 <i>_seq:</i><br /><b>&lt;standard_seq&gt;\u060C</b> <b>&lt;year_seq&gt;\u060C</b> <b>&lt;month_seq&gt;\u060C</b> <b>&lt;template_seq&gt;\u060C</b> <b>&lt;folder_seq&gt;\u060C</b> <b>&lt;folder_template_seq&gt;.</b><br /><br />\u064A\u0645\u0643\u0646\u0643 \u0627\u0633\u062A\u062E\u062F\u0627\u0645 \u0627\u0644\u062A\u0646\u0633\u064A\u0642 <i>&lt;name_seq:\u0627\u0644\u062D\u0634\u0648&gt;</i>\u060C \u062D\u064A\u062B <i>\u064A\u0643\u0648\u0646 \u0627\u0644\u062D\u0634\u0648</i> \u0631\u0642\u0645\u0627 \u064A\u062C\u0628 \u0623\u0646 \u062A\u062A\u0645 \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0639\u062F\u0627\u062F \u0628\u0647\u061B \u0639\u0644\u0649 \u0633\u0628\u064A\u0644 \u0627\u0644\u0645\u062B\u0627\u0644\u060C &lt;\u0627\u0644\u0633\u0646\u0629&gt;-&lt;year_seq:5&gt; \u0633\u0648\u0641 \u064A\u0646\u062A\u062C \u0634\u064A\u0621 \u0645\u062B\u0644 2008-00001. <br /><br />\u0628\u0645\u0627 \u0641\u064A \u0630\u0644\u0643 <i>\u0627\u0644\u0633\u0646\u0629</i> <i>\u0648\u0627\u0644\u0634\u0647\u0631</i> \u0641\u064A \u0627\u0633\u0645 \u062A\u0633\u0644\u0633\u0644 \u064A\u0634\u064A\u0631 \u0625\u0644\u0649 \u0623\u0646\u0647 \u064A\u062C\u0628 \u0625\u0639\u0627\u062F\u0629 \u062A\u0639\u064A\u064A\u0646 \u0633\u0646\u0648\u064A\u0627 \u0645\u0639 <b>&lt;template_year_seq&gt;</b> \u0623\u0648 \u0634\u0647\u0631\u064A\u0627 \u0645\u0639 <b>&lt;template_month_seq&gt;.</b><br /><br />\u0644\u0644\u0625\u0634\u0627\u0631\u0629 \u0625\u0644\u0649 \u0627\u0644\u0633\u0645\u0627\u062A \u0627\u0644\u0645\u0648\u0633\u0639\u0629 \u0627\u0633\u062A\u062E\u062F\u0645 notation:&lt; <b>\u0627\u0633\u0645 \u0627\u0644\u0633\u0645\u0629&gt;</b>
customidhint=The Scheme may be defined of the following tokens: <br /> <b>&lt;id&gt;</b>, <b>&lt;customId&gt;</b>, <b>&lt;filename&gt;</b>, <b>&lt;title&gt;</b>, <b>&lt;extension&gt;</b>, <b>&lt;template&gt;</b>, <b>&lt;version&gt;</b>, <b>&lt;path&gt;</b>, <b>&lt;folder&gt;</b>, <b>&lt;year&gt;</b>, <b>&lt;month&gt;</b>, <b>&lt;yy&gt;</b>, <b>&lt;mm&gt;</b>, <b>&lt;dd&gt;</b>. <br /> <br /> You can call an automation routine with: <b>&lt;automation:routine_name&gt;</b> <br /> <br />You can also define special sequence tokens and these must end with <i>_seq</i> : <br /> <b>&lt;standard_seq&gt;</b>, <b>&lt;year_seq&gt;</b>, <b>&lt;month_seq&gt;</b>, <b>&lt;template_seq&gt;</b>, <b>&lt;folder_seq&gt;</b>, <b>&lt;folder_template_seq&gt;</b>. <br /><br />You may use the format <i>&lt;name_seq:padding&gt;</i>, where <i>padding</i> is a number by which the counter should be padded; for example, &lt;year&gt;-&lt;year_seq:5&gt; will result in something like 2008-00001. <br /><br />Including <i>year</i> and <i>month</i> in a sequence name indicates that it should be reset yearly with <b>&lt;template_year_seq&gt;</b> or monthly with <b>&lt;template_month_seq&gt;</b>. <br /><br />You can also use your own sequence with: <b>&lt;sequence:name_of_your_sequence&gt;</b><br /><br />To refer to extended attributes use the notation: <b>&lt;name-of-the-attribute&gt;</b><br />To refer to sequences bound to an extended attribute's value use the notation: <b>&lt;name-of-the-attribute_seq&gt;</b>, <b>&lt;name-of-the-attribute_year_seq&gt;</b> or <b>&lt;name-of-the-attribute_month_seq&gt;</b>
task.name.Audit=\u0627\u0644\u062A\u062F\u0642\u064A\u0642 \u0648 \u0627\u0644\u0645\u0631\u0627\u062C\u0639\u0629
task.name.NetworkBrowser=\u0627\u0643\u062A\u0634\u0627\u0641 \u0627\u0644\u0634\u0628\u0643\u0629
searchinsubfolders2=\u0627\u0644\u0628\u062D\u062B \u0641\u064A \u0627\u0644\u0645\u062C\u0644\u062F\u0627\u062A \u0627\u0644\u0641\u0631\u0639\u064A\u0629
Expand Down Expand Up @@ -1555,7 +1557,7 @@ sameusernamewait=\u0627\u0646\u062A\u0638\u0631 \u0628\u0639\u062F \u0645\u062D\
maxsameipfailedattempts=\u0623\u0642\u0635\u0649 \u0645\u062D\u0627\u0648\u0644\u0627\u062A \u0641\u0627\u0634\u0644\u0629 \u0645\u0646 \u0646\u0641\u0633 IP
sameipwait=\u0627\u0646\u062A\u0638\u0631 \u0628\u0639\u062F \u0645\u062D\u0627\u0648\u0644\u0627\u062A \u0641\u0627\u0634\u0644\u0629 \u0645\u0646 \u0646\u0641\u0633 IP
attempts=\u0645\u062D\u0627\u0648\u0644\u0627\u062A
blockedusernameip=\u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062A\u062E\u062F\u0645/IP \u0627\u0644\u0645\u062D\u0638\u0648\u0631\u0629
blockedusernameip=Blocked username/IP/API Key
lastattempt=\u0622\u062E\u0631 \u0645\u062D\u0627\u0648\u0644\u0629
makemandatory=\u062C\u0639\u0644\u0647\u0627 \u0625\u0644\u0632\u0627\u0645\u064A\u0629
makeoptional=\u062C\u0639\u0644\u0647\u0627 \u0627\u062E\u062A\u064A\u0627\u0631\u064A
Expand Down Expand Up @@ -2578,3 +2580,12 @@ chatgpt = ChatGPT
apikey = API Key
model = Model
nodocsselected = No documents have been selected
apikeys = API Keys
lastused = Last used
createnewapikey = Create new API Key
createnewapikeymessage = This API key is tied to your user and can make requests against the system. Please give a name:
saveyourkey = Save your key
saveyourkeymessage = Please save this API Key somewhere safe and accessible. For security reasons, you won't be able to view it again through your account. If you lose this API Key, you'll need to generate a new one.
apikeyblockedwarn=Your ApiKey is temporarily blocked. Try after {0} minutes.
maxsameapikeyfailedattempts=Max. failed attempts with same API Key
sameapikeywait=Wait after failed attempts with same API Key
Loading

0 comments on commit 0df9fa7

Please sign in to comment.