Fix subscription bugs

This commit is contained in:
Yang Luo 2023-05-31 11:33:01 +08:00
parent f4b69cad9b
commit 7caa885131
19 changed files with 116 additions and 84 deletions

View File

@ -29,15 +29,14 @@ type Subscription struct {
Name string `xorm:"varchar(100) notnull pk" json:"name"` Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
DisplayName string `xorm:"varchar(100)" json:"displayName"` DisplayName string `xorm:"varchar(100)" json:"displayName"`
Duration int `json:"duration"`
Description string `xorm:"varchar(100)" json:"description"` StartDate time.Time `json:"startDate"`
Plan string `xorm:"varchar(100)" json:"plan"` EndDate time.Time `json:"endDate"`
Duration int `json:"duration"`
StartDate time.Time `json:"startDate"` Description string `xorm:"varchar(100)" json:"description"`
EndDate time.Time `json:"endDate"`
User string `xorm:"mediumtext" json:"user"` User string `xorm:"mediumtext" json:"user"`
Plan string `xorm:"varchar(100)" json:"plan"`
IsEnabled bool `json:"isEnabled"` IsEnabled bool `json:"isEnabled"`
Submitter string `xorm:"varchar(100)" json:"submitter"` Submitter string `xorm:"varchar(100)" json:"submitter"`

View File

@ -585,11 +585,11 @@ class App extends Component {
<Route exact path="/messages" render={(props) => this.renderLoginIfNotLoggedIn(<MessageListPage account={this.state.account} {...props} />)} /> <Route exact path="/messages" render={(props) => this.renderLoginIfNotLoggedIn(<MessageListPage account={this.state.account} {...props} />)} />
<Route exact path="/messages/:messageName" render={(props) => this.renderLoginIfNotLoggedIn(<MessageEditPage account={this.state.account} {...props} />)} /> <Route exact path="/messages/:messageName" render={(props) => this.renderLoginIfNotLoggedIn(<MessageEditPage account={this.state.account} {...props} />)} />
<Route exact path="/plans" render={(props) => this.renderLoginIfNotLoggedIn(<PlanListPage account={this.state.account} {...props} />)} /> <Route exact path="/plans" render={(props) => this.renderLoginIfNotLoggedIn(<PlanListPage account={this.state.account} {...props} />)} />
<Route exact path="/plan/:organizationName/:planName" render={(props) => this.renderLoginIfNotLoggedIn(<PlanEditPage account={this.state.account} {...props} />)} /> <Route exact path="/plans/:organizationName/:planName" render={(props) => this.renderLoginIfNotLoggedIn(<PlanEditPage account={this.state.account} {...props} />)} />
<Route exact path="/pricings" render={(props) => this.renderLoginIfNotLoggedIn(<PricingListPage account={this.state.account} {...props} />)} /> <Route exact path="/pricings" render={(props) => this.renderLoginIfNotLoggedIn(<PricingListPage account={this.state.account} {...props} />)} />
<Route exact path="/pricing/:organizationName/:pricingName" render={(props) => this.renderLoginIfNotLoggedIn(<PricingEditPage account={this.state.account} {...props} />)} /> <Route exact path="/pricings/:organizationName/:pricingName" render={(props) => this.renderLoginIfNotLoggedIn(<PricingEditPage account={this.state.account} {...props} />)} />
<Route exact path="/subscriptions" render={(props) => this.renderLoginIfNotLoggedIn(<SubscriptionListPage account={this.state.account} {...props} />)} /> <Route exact path="/subscriptions" render={(props) => this.renderLoginIfNotLoggedIn(<SubscriptionListPage account={this.state.account} {...props} />)} />
<Route exact path="/subscription/:organizationName/:subscriptionName" render={(props) => this.renderLoginIfNotLoggedIn(<SubscriptionEditPage account={this.state.account} {...props} />)} /> <Route exact path="/subscriptions/:organizationName/:subscriptionName" render={(props) => this.renderLoginIfNotLoggedIn(<SubscriptionEditPage account={this.state.account} {...props} />)} />
<Route exact path="/products" render={(props) => this.renderLoginIfNotLoggedIn(<ProductListPage account={this.state.account} {...props} />)} /> <Route exact path="/products" render={(props) => this.renderLoginIfNotLoggedIn(<ProductListPage account={this.state.account} {...props} />)} />
<Route exact path="/products/:productName" render={(props) => this.renderLoginIfNotLoggedIn(<ProductEditPage account={this.state.account} {...props} />)} /> <Route exact path="/products/:productName" render={(props) => this.renderLoginIfNotLoggedIn(<ProductEditPage account={this.state.account} {...props} />)} />
<Route exact path="/products/:productName/buy" render={(props) => this.renderLoginIfNotLoggedIn(<ProductBuyPage account={this.state.account} {...props} />)} /> <Route exact path="/products/:productName/buy" render={(props) => this.renderLoginIfNotLoggedIn(<ProductBuyPage account={this.state.account} {...props} />)} />

View File

@ -146,7 +146,7 @@ class PlanEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("role:Sub roles"), i18next.t("plan:Sub roles - Tooltip"))} : {Setting.getLabel(i18next.t("general:Role"), i18next.t("general:Role - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.plan.role} onChange={(value => {this.updatePlanField("role", value);})} <Select virtual={false} style={{width: "100%"}} value={this.state.plan.role} onChange={(value => {this.updatePlanField("role", value);})}
@ -228,7 +228,7 @@ class PlanEditPage extends React.Component {
if (willExist) { if (willExist) {
this.props.history.push("/plans"); this.props.history.push("/plans");
} else { } else {
this.props.history.push(`/plan/${this.state.plan.owner}/${this.state.plan.name}`); this.props.history.push(`/plans/${this.state.plan.owner}/${this.state.plan.name}`);
} }
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`);

View File

@ -43,7 +43,7 @@ class PlanListPage extends BaseListPage {
PlanBackend.addPlan(newPlan) PlanBackend.addPlan(newPlan)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
this.props.history.push({pathname: `/plan/${newPlan.owner}/${newPlan.name}`, mode: "add"}); this.props.history.push({pathname: `/plans/${newPlan.owner}/${newPlan.name}`, mode: "add"});
Setting.showMessage("success", i18next.t("general:Successfully added")); Setting.showMessage("success", i18next.t("general:Successfully added"));
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`);
@ -84,7 +84,7 @@ class PlanListPage extends BaseListPage {
...this.getColumnSearchProps("name"), ...this.getColumnSearchProps("name"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/plans/${text}`}> <Link to={`/plans/${record.owner}/${record.name}`}>
{text} {text}
</Link> </Link>
); );
@ -138,11 +138,18 @@ class PlanListPage extends BaseListPage {
...this.getColumnSearchProps("pricePerYear"), ...this.getColumnSearchProps("pricePerYear"),
}, },
{ {
title: i18next.t("plan:Sub role"), title: i18next.t("general:Role"),
dataIndex: "role", dataIndex: "role",
key: "role", key: "role",
width: "140px", width: "140px",
...this.getColumnSearchProps("role"), ...this.getColumnSearchProps("role"),
render: (text, record, index) => {
return (
<Link to={`/roles/${text}`}>
{text}
</Link>
);
},
}, },
{ {
title: i18next.t("general:Is enabled"), title: i18next.t("general:Is enabled"),
@ -165,7 +172,7 @@ class PlanListPage extends BaseListPage {
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/plan/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/plans/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deletePlan(index)} onConfirm={() => this.deletePlan(index)}

View File

@ -244,7 +244,7 @@ class PricingEditPage extends React.Component {
if (willExist) { if (willExist) {
this.props.history.push("/pricings"); this.props.history.push("/pricings");
} else { } else {
this.props.history.push(`/pricing/${this.state.pricing.owner}/${this.state.pricing.name}`); this.props.history.push(`/pricings/${this.state.pricing.owner}/${this.state.pricing.name}`);
} }
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`);

View File

@ -44,7 +44,7 @@ class PricingListPage extends BaseListPage {
PricingBackend.addPricing(newPricing) PricingBackend.addPricing(newPricing)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
this.props.history.push({pathname: `/pricing/${newPricing.owner}/${newPricing.name}`, mode: "add"}); this.props.history.push({pathname: `/pricings/${newPricing.owner}/${newPricing.name}`, mode: "add"});
Setting.showMessage("success", i18next.t("general:Successfully added")); Setting.showMessage("success", i18next.t("general:Successfully added"));
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`);
@ -85,7 +85,7 @@ class PricingListPage extends BaseListPage {
...this.getColumnSearchProps("name"), ...this.getColumnSearchProps("name"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/pricing/${record.owner}/${text}`}> <Link to={`/pricings/${record.owner}/${text}`}>
{text} {text}
</Link> </Link>
); );
@ -120,7 +120,7 @@ class PricingListPage extends BaseListPage {
title: i18next.t("general:Display name"), title: i18next.t("general:Display name"),
dataIndex: "displayName", dataIndex: "displayName",
key: "displayName", key: "displayName",
width: "170px", // width: "170px",
sorter: true, sorter: true,
...this.getColumnSearchProps("displayName"), ...this.getColumnSearchProps("displayName"),
}, },
@ -146,7 +146,7 @@ class PricingListPage extends BaseListPage {
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/pricing/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/pricings/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deletePricing(index)} onConfirm={() => this.deletePricing(index)}

View File

@ -156,7 +156,7 @@ class SubscriptionEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("subscription:Start Date"), i18next.t("subscription:Start Date - Tooltip"))} {Setting.getLabel(i18next.t("subscription:Start date"), i18next.t("subscription:Start date - Tooltip"))}
</Col> </Col>
<Col span={22} > <Col span={22} >
<DatePicker value={dayjs(this.state.subscription.startDate)} onChange={value => { <DatePicker value={dayjs(this.state.subscription.startDate)} onChange={value => {
@ -166,7 +166,7 @@ class SubscriptionEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("subscription:End Date"), i18next.t("subscription:End Date - Tooltip"))} {Setting.getLabel(i18next.t("subscription:End date"), i18next.t("subscription:End date - Tooltip"))}
</Col> </Col>
<Col span={22} > <Col span={22} >
<DatePicker value={dayjs(this.state.subscription.endDate)} onChange={value => { <DatePicker value={dayjs(this.state.subscription.endDate)} onChange={value => {
@ -176,7 +176,7 @@ class SubscriptionEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("subscription:Sub users"), i18next.t("subscription:Sub users - Tooltip"))} : {Setting.getLabel(i18next.t("general:User"), i18next.t("general:User - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select style={{width: "100%"}} value={this.state.subscription.user} <Select style={{width: "100%"}} value={this.state.subscription.user}
@ -188,7 +188,7 @@ class SubscriptionEditPage extends React.Component {
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("subscription:Sub plan"), i18next.t("subscription:Sub plan - Tooltip"))} : {Setting.getLabel(i18next.t("subscription:Plan"), i18next.t("subscription:Plan - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.subscription.plan} onChange={(value => {this.updateSubscriptionField("plan", value);})} <Select virtual={false} style={{width: "100%"}} value={this.state.subscription.plan} onChange={(value => {this.updateSubscriptionField("plan", value);})}
@ -218,7 +218,7 @@ class SubscriptionEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Submitter"), i18next.t("general:Submitter - Tooltip"))} : {Setting.getLabel(i18next.t("permission:Submitter"), i18next.t("permission:Submitter - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input disabled={true} value={this.state.subscription.submitter} onChange={e => { <Input disabled={true} value={this.state.subscription.submitter} onChange={e => {
@ -228,7 +228,7 @@ class SubscriptionEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Approver"), i18next.t("general:Approver - Tooltip"))} : {Setting.getLabel(i18next.t("permission:Approver"), i18next.t("permission:Approver - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input disabled={true} value={this.state.subscription.approver} onChange={e => { <Input disabled={true} value={this.state.subscription.approver} onChange={e => {
@ -238,7 +238,7 @@ class SubscriptionEditPage extends React.Component {
</Row> </Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Approve time"), i18next.t("general:Approve time - Tooltip"))} : {Setting.getLabel(i18next.t("permission:Approve time"), i18next.t("permission:Approve time - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input disabled={true} value={Setting.getFormattedDate(this.state.subscription.approveTime)} onChange={e => { <Input disabled={true} value={Setting.getFormattedDate(this.state.subscription.approveTime)} onChange={e => {
@ -288,7 +288,7 @@ class SubscriptionEditPage extends React.Component {
if (willExist) { if (willExist) {
this.props.history.push("/subscriptions"); this.props.history.push("/subscriptions");
} else { } else {
this.props.history.push(`/subscription/${this.state.subscription.owner}/${this.state.subscription.name}`); this.props.history.push(`/subscriptions/${this.state.subscription.owner}/${this.state.subscription.name}`);
} }
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`);

View File

@ -32,16 +32,18 @@ class SubscriptionListPage extends BaseListPage {
owner: owner, owner: owner,
name: `subscription_${randomName}`, name: `subscription_${randomName}`,
createdTime: moment().format(), createdTime: moment().format(),
displayName: `New Subscription - ${randomName}`,
startDate: moment().format(), startDate: moment().format(),
endDate: moment().add(defaultDuration, "d").format(), endDate: moment().add(defaultDuration, "d").format(),
displayName: `New Subscription - ${randomName}`, duration: defaultDuration,
tag: "", description: "",
users: [], user: "",
expireInDays: defaultDuration, plan: "",
isEnabled: true,
submitter: this.props.account.name, submitter: this.props.account.name,
approver: "", approver: this.props.account.name,
approveTime: "", approveTime: moment().format(),
state: "Pending", state: "Approved",
}; };
} }
@ -50,7 +52,7 @@ class SubscriptionListPage extends BaseListPage {
SubscriptionBackend.addSubscription(newSubscription) SubscriptionBackend.addSubscription(newSubscription)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
this.props.history.push({pathname: `/subscription/${newSubscription.owner}/${newSubscription.name}`, mode: "add"}); this.props.history.push({pathname: `/subscriptions/${newSubscription.owner}/${newSubscription.name}`, mode: "add"});
Setting.showMessage("success", i18next.t("general:Successfully added")); Setting.showMessage("success", i18next.t("general:Successfully added"));
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`);
@ -91,7 +93,7 @@ class SubscriptionListPage extends BaseListPage {
...this.getColumnSearchProps("name"), ...this.getColumnSearchProps("name"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/subscriptions/${text}`}> <Link to={`/subscriptions/${record.owner}/${record.name}`}>
{text} {text}
</Link> </Link>
); );
@ -138,18 +140,32 @@ class SubscriptionListPage extends BaseListPage {
...this.getColumnSearchProps("duration"), ...this.getColumnSearchProps("duration"),
}, },
{ {
title: i18next.t("subscription:Sub plane"), title: i18next.t("subscription:Plan"),
dataIndex: "plan", dataIndex: "plan",
key: "plan", key: "plan",
width: "140px", width: "140px",
...this.getColumnSearchProps("plan"), ...this.getColumnSearchProps("plan"),
render: (text, record, index) => {
return (
<Link to={`/plans/${text}`}>
{text}
</Link>
);
},
}, },
{ {
title: i18next.t("subscription:Sub user"), title: i18next.t("general:User"),
dataIndex: "user", dataIndex: "user",
key: "user", key: "user",
width: "140px", width: "140px",
...this.getColumnSearchProps("user"), ...this.getColumnSearchProps("user"),
render: (text, record, index) => {
return (
<Link to={`/users/${text}`}>
{text}
</Link>
);
},
}, },
{ {
title: i18next.t("general:State"), title: i18next.t("general:State"),
@ -158,6 +174,16 @@ class SubscriptionListPage extends BaseListPage {
width: "120px", width: "120px",
sorter: true, sorter: true,
...this.getColumnSearchProps("state"), ...this.getColumnSearchProps("state"),
render: (text, record, index) => {
switch (text) {
case "Approved":
return Setting.getTag("success", i18next.t("permission:Approved"));
case "Pending":
return Setting.getTag("error", i18next.t("permission:Pending"));
default:
return null;
}
},
}, },
{ {
title: i18next.t("general:Action"), title: i18next.t("general:Action"),
@ -168,7 +194,7 @@ class SubscriptionListPage extends BaseListPage {
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/subscription/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/subscriptions/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deleteSubscription(index)} onConfirm={() => this.deleteSubscription(index)}

View File

@ -776,12 +776,12 @@
"Duration": "Laufzeit", "Duration": "Laufzeit",
"Duration - Tooltip": "Laufzeit des Abonnements", "Duration - Tooltip": "Laufzeit des Abonnements",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Enddatum", "End date": "Enddatum",
"End Date - Tooltip": "Enddatum", "End date - Tooltip": "Enddatum",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Startdatum", "Start date": "Startdatum",
"Start Date - Tooltip": "Startdatum", "Start date - Tooltip": "Startdatum",
"Sub plan": "Abonnementplan", "Sub plan": "Abonnementplan",
"Sub plan - Tooltip": "Abonnementplan", "Sub plan - Tooltip": "Abonnementplan",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Duration", "Duration": "Duration",
"Duration - Tooltip": "Subscription duration", "Duration - Tooltip": "Subscription duration",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "End Date", "End date": "End date",
"End Date - Tooltip": "End Date", "End date - Tooltip": "End date",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Start Date", "Start date": "Start date",
"Start Date - Tooltip": "Start Date", "Start date - Tooltip": "Start date",
"Sub plan": "Sub plan", "Sub plan": "Sub plan",
"Sub plan - Tooltip": "Sub plan", "Sub plan - Tooltip": "Sub plan",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Duración", "Duration": "Duración",
"Duration - Tooltip": "Duración de la suscripción", "Duration - Tooltip": "Duración de la suscripción",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Fecha de finalización", "End date": "Fecha de finalización",
"End Date - Tooltip": "Fecha de finalización", "End date - Tooltip": "Fecha de finalización",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Fecha de inicio", "Start date": "Fecha de inicio",
"Start Date - Tooltip": "Fecha de inicio", "Start date - Tooltip": "Fecha de inicio",
"Sub plan": "Plan de suscripción", "Sub plan": "Plan de suscripción",
"Sub plan - Tooltip": "Plan de suscripción", "Sub plan - Tooltip": "Plan de suscripción",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Durée", "Duration": "Durée",
"Duration - Tooltip": "Durée de l'abonnement", "Duration - Tooltip": "Durée de l'abonnement",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Date de fin", "End date": "Date de fin",
"End Date - Tooltip": "Date de fin", "End date - Tooltip": "Date de fin",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Date de début", "Start date": "Date de début",
"Start Date - Tooltip": "Date de début", "Start date - Tooltip": "Date de début",
"Sub plan": "Plan de l'abonnement", "Sub plan": "Plan de l'abonnement",
"Sub plan - Tooltip": "Plan de l'abonnement", "Sub plan - Tooltip": "Plan de l'abonnement",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Durasi", "Duration": "Durasi",
"Duration - Tooltip": "Durasi langganan", "Duration - Tooltip": "Durasi langganan",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Tanggal Berakhir", "End date": "Tanggal Berakhir",
"End Date - Tooltip": "Tanggal Berakhir", "End date - Tooltip": "Tanggal Berakhir",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Tanggal Mulai", "Start date": "Tanggal Mulai",
"Start Date - Tooltip": "Tanggal Mulai", "Start date - Tooltip": "Tanggal Mulai",
"Sub plan": "Rencana Langganan", "Sub plan": "Rencana Langganan",
"Sub plan - Tooltip": "Rencana Langganan", "Sub plan - Tooltip": "Rencana Langganan",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "期間", "Duration": "期間",
"Duration - Tooltip": "購読の期間", "Duration - Tooltip": "購読の期間",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "終了日", "End date": "終了日",
"End Date - Tooltip": "終了日", "End date - Tooltip": "終了日",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "開始日", "Start date": "開始日",
"Start Date - Tooltip": "開始日", "Start date - Tooltip": "開始日",
"Sub plan": "購読プラン", "Sub plan": "購読プラン",
"Sub plan - Tooltip": "購読プラン", "Sub plan - Tooltip": "購読プラン",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "기간", "Duration": "기간",
"Duration - Tooltip": "구독 기간", "Duration - Tooltip": "구독 기간",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "종료일", "End date": "종료일",
"End Date - Tooltip": "종료일", "End date - Tooltip": "종료일",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "시작일", "Start date": "시작일",
"Start Date - Tooltip": "시작일", "Start date - Tooltip": "시작일",
"Sub plan": "구독 플랜", "Sub plan": "구독 플랜",
"Sub plan - Tooltip": "구독 플랜", "Sub plan - Tooltip": "구독 플랜",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Thời lượng", "Duration": "Thời lượng",
"Duration - Tooltip": "Thời lượng đăng ký", "Duration - Tooltip": "Thời lượng đăng ký",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Ngày kết thúc", "End date": "Ngày kết thúc",
"End Date - Tooltip": "Ngày kết thúc", "End date - Tooltip": "Ngày kết thúc",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Ngày bắt đầu", "Start date": "Ngày bắt đầu",
"Start Date - Tooltip": "Ngày bắt đầu", "Start date - Tooltip": "Ngày bắt đầu",
"Sub plan": "Kế hoạch đăng ký", "Sub plan": "Kế hoạch đăng ký",
"Sub plan - Tooltip": "Kế hoạch đăng ký", "Sub plan - Tooltip": "Kế hoạch đăng ký",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Продолжительность", "Duration": "Продолжительность",
"Duration - Tooltip": "Продолжительность подписки", "Duration - Tooltip": "Продолжительность подписки",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Дата окончания", "End date": "Дата окончания",
"End Date - Tooltip": "Дата окончания", "End date - Tooltip": "Дата окончания",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Дата начала", "Start date": "Дата начала",
"Start Date - Tooltip": "Дата начала", "Start date - Tooltip": "Дата начала",
"Sub plan": "План подписки", "Sub plan": "План подписки",
"Sub plan - Tooltip": "План подписки", "Sub plan - Tooltip": "План подписки",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "Thời lượng", "Duration": "Thời lượng",
"Duration - Tooltip": "Thời lượng đăng ký", "Duration - Tooltip": "Thời lượng đăng ký",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "Ngày kết thúc", "End date": "Ngày kết thúc",
"End Date - Tooltip": "Ngày kết thúc", "End date - Tooltip": "Ngày kết thúc",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "Ngày bắt đầu", "Start date": "Ngày bắt đầu",
"Start Date - Tooltip": "Ngày bắt đầu", "Start date - Tooltip": "Ngày bắt đầu",
"Sub plan": "Kế hoạch đăng ký", "Sub plan": "Kế hoạch đăng ký",
"Sub plan - Tooltip": "Kế hoạch đăng ký", "Sub plan - Tooltip": "Kế hoạch đăng ký",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",

View File

@ -776,12 +776,12 @@
"Duration": "订阅时长", "Duration": "订阅时长",
"Duration - Tooltip": "订阅时长", "Duration - Tooltip": "订阅时长",
"Edit Subscription": "Edit Subscription", "Edit Subscription": "Edit Subscription",
"End Date": "结束日期", "End date": "结束日期",
"End Date - Tooltip": "结束日期", "End date - Tooltip": "结束日期",
"New Subscription": "New Subscription", "New Subscription": "New Subscription",
"Pending": "Pending", "Pending": "Pending",
"Start Date": "开始日期", "Start date": "开始日期",
"Start Date - Tooltip": "开始日期", "Start date - Tooltip": "开始日期",
"Sub plan": "订阅计划", "Sub plan": "订阅计划",
"Sub plan - Tooltip": "订阅计划", "Sub plan - Tooltip": "订阅计划",
"Sub plane": "Sub plane", "Sub plane": "Sub plane",