mirror of https://github.com/procxx/kepka.git
Add middle_name support to passport.
Also allow editing document without its details.
This commit is contained in:
parent
7c173bd63f
commit
36fcf2c60e
|
@ -1617,10 +1617,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
"lng_passport_reupload_main_page" = "Reupload a scan of the main page";
|
"lng_passport_reupload_main_page" = "Reupload a scan of the main page";
|
||||||
"lng_passport_personal_details" = "Personal details";
|
"lng_passport_personal_details" = "Personal details";
|
||||||
"lng_passport_personal_details_enter" = "Enter your personal details";
|
"lng_passport_personal_details_enter" = "Enter your personal details";
|
||||||
|
"lng_passport_document_details" = "Document details";
|
||||||
"lng_passport_choose_image" = "Choose scan image";
|
"lng_passport_choose_image" = "Choose scan image";
|
||||||
"lng_passport_delete_scan_undo" = "Undo";
|
"lng_passport_delete_scan_undo" = "Undo";
|
||||||
"lng_passport_scan_uploaded" = "Uploaded on {date}";
|
"lng_passport_scan_uploaded" = "Uploaded on {date}";
|
||||||
"lng_passport_first_name" = "Name";
|
"lng_passport_first_name" = "Name";
|
||||||
|
"lng_passport_middle_name" = "Middle name";
|
||||||
"lng_passport_last_name" = "Surname";
|
"lng_passport_last_name" = "Surname";
|
||||||
"lng_passport_birth_date" = "Date of birth";
|
"lng_passport_birth_date" = "Date of birth";
|
||||||
"lng_passport_gender" = "Gender";
|
"lng_passport_gender" = "Gender";
|
||||||
|
|
|
@ -224,13 +224,15 @@ QString ComputeScopeRowReadyString(const Scope &scope) {
|
||||||
list,
|
list,
|
||||||
keyForAttachmentTo,
|
keyForAttachmentTo,
|
||||||
[](const std::pair<QString, QString> &value) {
|
[](const std::pair<QString, QString> &value) {
|
||||||
return value.first;
|
return value.first;
|
||||||
});
|
});
|
||||||
Assert(i != end(list));
|
Assert(i != end(list));
|
||||||
if (i->second.isEmpty()) {
|
if (const auto data = value.trimmed(); !data.isEmpty()) {
|
||||||
i->second = value.trimmed();
|
if (i->second.isEmpty()) {
|
||||||
} else {
|
i->second = data;
|
||||||
i->second += ' ' + value.trimmed();
|
} else {
|
||||||
|
i->second += ' ' + data;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,12 +98,19 @@ EditDocumentScheme GetDocumentScheme(
|
||||||
const auto CountryValidate = FromBoolean([=](const QString &value) {
|
const auto CountryValidate = FromBoolean([=](const QString &value) {
|
||||||
return !CountryFormat(value).isEmpty();
|
return !CountryFormat(value).isEmpty();
|
||||||
});
|
});
|
||||||
|
const auto NameOrEmptyValidate = [=](const QString &value) -> Result {
|
||||||
|
if (value.isEmpty()) {
|
||||||
|
return base::none;
|
||||||
|
}
|
||||||
|
return NameValidate(value);
|
||||||
|
};
|
||||||
|
|
||||||
// #TODO passport scheme
|
// #TODO passport scheme
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Scope::Type::Identity: {
|
case Scope::Type::Identity: {
|
||||||
auto result = Scheme();
|
auto result = Scheme();
|
||||||
result.rowsHeader = lang(lng_passport_personal_details);
|
result.detailsHeader = lang(lng_passport_personal_details);
|
||||||
|
result.fieldsHeader = lang(lng_passport_document_details);
|
||||||
if (scansType) {
|
if (scansType) {
|
||||||
switch (*scansType) {
|
switch (*scansType) {
|
||||||
case Value::Type::Passport:
|
case Value::Type::Passport:
|
||||||
|
@ -132,6 +139,16 @@ EditDocumentScheme GetDocumentScheme(
|
||||||
DontFormat,
|
DontFormat,
|
||||||
kMaxNameSize,
|
kMaxNameSize,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ValueClass::Fields,
|
||||||
|
PanelDetailsType::Text,
|
||||||
|
qsl("middle_name"),
|
||||||
|
lang(lng_passport_middle_name),
|
||||||
|
NameOrEmptyValidate,
|
||||||
|
DontFormat,
|
||||||
|
kMaxNameSize,
|
||||||
|
qsl("first_name")
|
||||||
|
},
|
||||||
{
|
{
|
||||||
ValueClass::Fields,
|
ValueClass::Fields,
|
||||||
PanelDetailsType::Text,
|
PanelDetailsType::Text,
|
||||||
|
@ -197,7 +214,7 @@ EditDocumentScheme GetDocumentScheme(
|
||||||
|
|
||||||
case Scope::Type::Address: {
|
case Scope::Type::Address: {
|
||||||
auto result = Scheme();
|
auto result = Scheme();
|
||||||
result.rowsHeader = lang(lng_passport_address);
|
result.detailsHeader = lang(lng_passport_address);
|
||||||
if (scansType) {
|
if (scansType) {
|
||||||
switch (*scansType) {
|
switch (*scansType) {
|
||||||
case Value::Type::UtilityBill:
|
case Value::Type::UtilityBill:
|
||||||
|
@ -1048,12 +1065,16 @@ void PanelController::editScope(int index, int documentIndex) {
|
||||||
_editDocument->scanMissingError,
|
_editDocument->scanMissingError,
|
||||||
valueFiles(*_editDocument),
|
valueFiles(*_editDocument),
|
||||||
valueSpecialFiles(*_editDocument))
|
valueSpecialFiles(*_editDocument))
|
||||||
// #TODO passport document without details
|
|
||||||
: object_ptr<PanelEditDocument>(
|
: object_ptr<PanelEditDocument>(
|
||||||
_panel->widget(),
|
_panel->widget(),
|
||||||
this,
|
this,
|
||||||
GetDocumentScheme(_editScope->type),
|
GetDocumentScheme(
|
||||||
_editValue->data.parsedInEdit);
|
_editScope->type,
|
||||||
|
_editDocument->type),
|
||||||
|
_editDocument->data.parsedInEdit,
|
||||||
|
_editDocument->scanMissingError,
|
||||||
|
valueFiles(*_editDocument),
|
||||||
|
valueSpecialFiles(*_editDocument));
|
||||||
const auto weak = make_weak(result.data());
|
const auto weak = make_weak(result.data());
|
||||||
_panelHasUnsavedChanges = [=] {
|
_panelHasUnsavedChanges = [=] {
|
||||||
return weak ? weak->hasUnsavedChanges() : false;
|
return weak ? weak->hasUnsavedChanges() : false;
|
||||||
|
|
|
@ -224,7 +224,32 @@ PanelEditDocument::PanelEditDocument(
|
||||||
langFactory(lng_passport_save_value),
|
langFactory(lng_passport_save_value),
|
||||||
st::passportPanelSaveValue) {
|
st::passportPanelSaveValue) {
|
||||||
setupControls(
|
setupControls(
|
||||||
data,
|
&data,
|
||||||
|
&scanData,
|
||||||
|
missingScansError,
|
||||||
|
std::move(files),
|
||||||
|
std::move(specialFiles));
|
||||||
|
}
|
||||||
|
|
||||||
|
PanelEditDocument::PanelEditDocument(
|
||||||
|
QWidget*,
|
||||||
|
not_null<PanelController*> controller,
|
||||||
|
Scheme scheme,
|
||||||
|
const ValueMap &scanData,
|
||||||
|
const QString &missingScansError,
|
||||||
|
std::vector<ScanInfo> &&files,
|
||||||
|
std::map<SpecialFile, ScanInfo> &&specialFiles)
|
||||||
|
: _controller(controller)
|
||||||
|
, _scheme(std::move(scheme))
|
||||||
|
, _scroll(this, st::passportPanelScroll)
|
||||||
|
, _topShadow(this)
|
||||||
|
, _bottomShadow(this)
|
||||||
|
, _done(
|
||||||
|
this,
|
||||||
|
langFactory(lng_passport_save_value),
|
||||||
|
st::passportPanelSaveValue) {
|
||||||
|
setupControls(
|
||||||
|
nullptr,
|
||||||
&scanData,
|
&scanData,
|
||||||
missingScansError,
|
missingScansError,
|
||||||
std::move(files),
|
std::move(files),
|
||||||
|
@ -245,11 +270,11 @@ PanelEditDocument::PanelEditDocument(
|
||||||
this,
|
this,
|
||||||
langFactory(lng_passport_save_value),
|
langFactory(lng_passport_save_value),
|
||||||
st::passportPanelSaveValue) {
|
st::passportPanelSaveValue) {
|
||||||
setupControls(data, nullptr, QString(), {}, {});
|
setupControls(&data, nullptr, QString(), {}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
void PanelEditDocument::setupControls(
|
void PanelEditDocument::setupControls(
|
||||||
const ValueMap &data,
|
const ValueMap *data,
|
||||||
const ValueMap *scanData,
|
const ValueMap *scanData,
|
||||||
const QString &missingScansError,
|
const QString &missingScansError,
|
||||||
std::vector<ScanInfo> &&files,
|
std::vector<ScanInfo> &&files,
|
||||||
|
@ -273,7 +298,7 @@ void PanelEditDocument::setupControls(
|
||||||
}
|
}
|
||||||
|
|
||||||
not_null<Ui::RpWidget*> PanelEditDocument::setupContent(
|
not_null<Ui::RpWidget*> PanelEditDocument::setupContent(
|
||||||
const ValueMap &data,
|
const ValueMap *data,
|
||||||
const ValueMap *scanData,
|
const ValueMap *scanData,
|
||||||
const QString &missingScansError,
|
const QString &missingScansError,
|
||||||
std::vector<ScanInfo> &&files,
|
std::vector<ScanInfo> &&files,
|
||||||
|
@ -308,14 +333,6 @@ not_null<Ui::RpWidget*> PanelEditDocument::setupContent(
|
||||||
st::passportFormDividerHeight));
|
st::passportFormDividerHeight));
|
||||||
}
|
}
|
||||||
|
|
||||||
inner->add(
|
|
||||||
object_ptr<Ui::FlatLabel>(
|
|
||||||
inner,
|
|
||||||
_scheme.rowsHeader,
|
|
||||||
Ui::FlatLabel::InitType::Simple,
|
|
||||||
st::passportFormHeader),
|
|
||||||
st::passportDetailsHeaderPadding);
|
|
||||||
|
|
||||||
const auto valueOrEmpty = [&](
|
const auto valueOrEmpty = [&](
|
||||||
const ValueMap &values,
|
const ValueMap &values,
|
||||||
const QString &key) {
|
const QString &key) {
|
||||||
|
@ -330,7 +347,7 @@ not_null<Ui::RpWidget*> PanelEditDocument::setupContent(
|
||||||
for (auto i = 0, count = int(_scheme.rows.size()); i != count; ++i) {
|
for (auto i = 0, count = int(_scheme.rows.size()); i != count; ++i) {
|
||||||
const auto &row = _scheme.rows[i];
|
const auto &row = _scheme.rows[i];
|
||||||
auto fields = (row.valueClass == Scheme::ValueClass::Fields)
|
auto fields = (row.valueClass == Scheme::ValueClass::Fields)
|
||||||
? &data
|
? data
|
||||||
: scanData;
|
: scanData;
|
||||||
if (!fields) {
|
if (!fields) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -347,24 +364,33 @@ not_null<Ui::RpWidget*> PanelEditDocument::setupContent(
|
||||||
maxLabelWidth,
|
maxLabelWidth,
|
||||||
PanelDetailsRow::LabelWidth(row.label));
|
PanelDetailsRow::LabelWidth(row.label));
|
||||||
});
|
});
|
||||||
enumerateRows([&](
|
if (maxLabelWidth > 0) {
|
||||||
int i,
|
inner->add(
|
||||||
const EditDocumentScheme::Row &row,
|
object_ptr<Ui::FlatLabel>(
|
||||||
const ValueMap &fields) {
|
inner,
|
||||||
const auto current = valueOrEmpty(fields, row.key);
|
data ? _scheme.detailsHeader : _scheme.fieldsHeader,
|
||||||
_details.emplace(i, inner->add(PanelDetailsRow::Create(
|
Ui::FlatLabel::InitType::Simple,
|
||||||
inner,
|
st::passportFormHeader),
|
||||||
row.inputType,
|
st::passportDetailsHeaderPadding);
|
||||||
_controller,
|
enumerateRows([&](
|
||||||
row.label,
|
int i,
|
||||||
maxLabelWidth,
|
const EditDocumentScheme::Row &row,
|
||||||
current.text,
|
const ValueMap &fields) {
|
||||||
current.error,
|
const auto current = valueOrEmpty(fields, row.key);
|
||||||
row.lengthLimit)));
|
_details.emplace(i, inner->add(PanelDetailsRow::Create(
|
||||||
});
|
inner,
|
||||||
|
row.inputType,
|
||||||
|
_controller,
|
||||||
|
row.label,
|
||||||
|
maxLabelWidth,
|
||||||
|
current.text,
|
||||||
|
current.error,
|
||||||
|
row.lengthLimit)));
|
||||||
|
});
|
||||||
|
|
||||||
inner->add(
|
inner->add(
|
||||||
object_ptr<Ui::FixedHeightWidget>(inner, st::passportDetailsSkip));
|
object_ptr<Ui::FixedHeightWidget>(inner, st::passportDetailsSkip));
|
||||||
|
}
|
||||||
if (auto text = _controller->deleteValueLabel()) {
|
if (auto text = _controller->deleteValueLabel()) {
|
||||||
inner->add(
|
inner->add(
|
||||||
object_ptr<Info::Profile::Button>(
|
object_ptr<Info::Profile::Button>(
|
||||||
|
|
|
@ -49,7 +49,8 @@ struct EditDocumentScheme {
|
||||||
QString keyForAttachmentTo; // attach last_name to first_name
|
QString keyForAttachmentTo; // attach last_name to first_name
|
||||||
};
|
};
|
||||||
std::vector<Row> rows;
|
std::vector<Row> rows;
|
||||||
QString rowsHeader;
|
QString fieldsHeader;
|
||||||
|
QString detailsHeader;
|
||||||
QString scansHeader;
|
QString scansHeader;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -67,6 +68,14 @@ public:
|
||||||
const QString &missingScansError,
|
const QString &missingScansError,
|
||||||
std::vector<ScanInfo> &&files,
|
std::vector<ScanInfo> &&files,
|
||||||
std::map<SpecialFile, ScanInfo> &&specialFiles);
|
std::map<SpecialFile, ScanInfo> &&specialFiles);
|
||||||
|
PanelEditDocument(
|
||||||
|
QWidget *parent,
|
||||||
|
not_null<PanelController*> controller,
|
||||||
|
Scheme scheme,
|
||||||
|
const ValueMap &scanData,
|
||||||
|
const QString &missingScansError,
|
||||||
|
std::vector<ScanInfo> &&files,
|
||||||
|
std::map<SpecialFile, ScanInfo> &&specialFiles);
|
||||||
PanelEditDocument(
|
PanelEditDocument(
|
||||||
QWidget *parent,
|
QWidget *parent,
|
||||||
not_null<PanelController*> controller,
|
not_null<PanelController*> controller,
|
||||||
|
@ -82,13 +91,13 @@ protected:
|
||||||
private:
|
private:
|
||||||
struct Result;
|
struct Result;
|
||||||
void setupControls(
|
void setupControls(
|
||||||
const ValueMap &data,
|
const ValueMap *data,
|
||||||
const ValueMap *scanData,
|
const ValueMap *scanData,
|
||||||
const QString &missingScansError,
|
const QString &missingScansError,
|
||||||
std::vector<ScanInfo> &&files,
|
std::vector<ScanInfo> &&files,
|
||||||
std::map<SpecialFile, ScanInfo> &&specialFiles);
|
std::map<SpecialFile, ScanInfo> &&specialFiles);
|
||||||
not_null<Ui::RpWidget*> setupContent(
|
not_null<Ui::RpWidget*> setupContent(
|
||||||
const ValueMap &data,
|
const ValueMap *data,
|
||||||
const ValueMap *scanData,
|
const ValueMap *scanData,
|
||||||
const QString &missingScansError,
|
const QString &missingScansError,
|
||||||
std::vector<ScanInfo> &&files,
|
std::vector<ScanInfo> &&files,
|
||||||
|
|
Loading…
Reference in New Issue