ember-validated-form 4.1.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -1
- package/.github/dependabot.yml +11 -0
- package/.github/workflows/deploy.yml +1 -1
- package/.github/workflows/test.yml +1 -1
- package/.husky/commit-msg +6 -0
- package/.husky/pre-commit +8 -0
- package/CHANGELOG.md +32 -0
- package/README.md +2 -2
- package/addon/-private/themed-component.js +31 -35
- package/addon/components/validated-button/-themes/bootstrap/button.js +7 -9
- package/addon/components/validated-button/-themes/uikit/button.js +7 -9
- package/addon/components/validated-button/button.hbs +9 -0
- package/addon/components/validated-button/button.js +3 -8
- package/addon/components/validated-button.hbs +17 -0
- package/addon/components/validated-button.js +58 -9
- package/addon/components/validated-form.hbs +29 -0
- package/addon/components/validated-form.js +49 -43
- package/addon/components/validated-input/-themes/bootstrap/error.js +3 -3
- package/addon/components/validated-input/-themes/bootstrap/hint.js +3 -3
- package/addon/components/validated-input/-themes/bootstrap/label.js +1 -1
- package/addon/components/validated-input/-themes/bootstrap/render.js +3 -3
- package/addon/components/validated-input/-themes/uikit/error.hbs +4 -0
- package/addon/components/validated-input/-themes/uikit/error.js +1 -4
- package/addon/components/validated-input/-themes/uikit/hint.js +3 -3
- package/addon/components/validated-input/-themes/uikit/label.js +3 -3
- package/addon/components/validated-input/-themes/uikit/render.hbs +110 -0
- package/addon/components/validated-input/-themes/uikit/render.js +3 -5
- package/addon/components/validated-input/error.hbs +1 -0
- package/addon/components/validated-input/error.js +6 -7
- package/addon/components/validated-input/hint.hbs +1 -0
- package/addon/components/validated-input/hint.js +3 -7
- package/addon/components/validated-input/label.hbs +3 -0
- package/addon/components/validated-input/label.js +3 -8
- package/addon/components/validated-input/render.hbs +108 -0
- package/addon/components/validated-input/render.js +10 -13
- package/addon/components/validated-input/types/-themes/bootstrap/checkbox-group.hbs +19 -0
- package/addon/components/validated-input/types/-themes/bootstrap/checkbox-group.js +1 -4
- package/addon/components/validated-input/types/-themes/bootstrap/checkbox.hbs +14 -0
- package/addon/components/validated-input/types/-themes/bootstrap/checkbox.js +1 -6
- package/addon/components/validated-input/types/-themes/bootstrap/input.js +11 -4
- package/addon/components/validated-input/types/-themes/bootstrap/radio-group.hbs +20 -0
- package/addon/components/validated-input/types/-themes/bootstrap/radio-group.js +1 -4
- package/addon/components/validated-input/types/-themes/bootstrap/select.js +11 -4
- package/addon/components/validated-input/types/-themes/bootstrap/textarea.js +11 -4
- package/addon/components/validated-input/types/-themes/uikit/checkbox-group.hbs +19 -0
- package/addon/components/validated-input/types/-themes/uikit/checkbox-group.js +1 -4
- package/addon/components/validated-input/types/-themes/uikit/checkbox.hbs +15 -0
- package/addon/components/validated-input/types/-themes/uikit/checkbox.js +1 -4
- package/addon/components/validated-input/types/-themes/uikit/input.js +11 -4
- package/addon/components/validated-input/types/-themes/uikit/radio-group.hbs +20 -0
- package/addon/components/validated-input/types/-themes/uikit/radio-group.js +1 -4
- package/addon/components/validated-input/types/-themes/uikit/select.js +11 -4
- package/addon/components/validated-input/types/-themes/uikit/textarea.js +11 -4
- package/addon/components/validated-input/types/checkbox-group.hbs +14 -0
- package/addon/components/validated-input/types/checkbox-group.js +9 -11
- package/addon/components/validated-input/types/checkbox.hbs +9 -0
- package/addon/components/validated-input/types/checkbox.js +10 -6
- package/addon/components/validated-input/types/input.hbs +6 -0
- package/addon/components/validated-input/types/input.js +9 -17
- package/addon/components/validated-input/types/radio-group.hbs +14 -0
- package/addon/components/validated-input/types/radio-group.js +10 -6
- package/addon/components/validated-input/types/select.hbs +72 -0
- package/addon/components/validated-input/types/select.js +118 -6
- package/addon/components/validated-input/types/textarea.hbs +7 -0
- package/addon/components/validated-input/types/textarea.js +9 -17
- package/addon/{templates/components → components}/validated-input.hbs +3 -5
- package/addon/components/validated-input.js +1 -10
- package/app/components/validated-form.js +1 -7
- package/config/environment.js +1 -1
- package/package.json +58 -39
- package/.dependabot/config.yml +0 -14
- package/.husky/precommit +0 -1
- package/.prettierignore +0 -1
- package/addon/templates/components/validated-button/button.hbs +0 -1
- package/addon/templates/components/validated-button.hbs +0 -7
- package/addon/templates/components/validated-form.hbs +0 -15
- package/addon/templates/components/validated-input/-themes/uikit/render.hbs +0 -108
- package/addon/templates/components/validated-input/error.hbs +0 -1
- package/addon/templates/components/validated-input/hint.hbs +0 -1
- package/addon/templates/components/validated-input/label.hbs +0 -1
- package/addon/templates/components/validated-input/render.hbs +0 -107
- package/addon/templates/components/validated-input/types/-themes/bootstrap/checkbox-group.hbs +0 -14
- package/addon/templates/components/validated-input/types/-themes/bootstrap/checkbox.hbs +0 -10
- package/addon/templates/components/validated-input/types/-themes/bootstrap/radio-group.hbs +0 -15
- package/addon/templates/components/validated-input/types/-themes/bootstrap/select.hbs +0 -16
- package/addon/templates/components/validated-input/types/-themes/uikit/checkbox-group.hbs +0 -15
- package/addon/templates/components/validated-input/types/-themes/uikit/checkbox.hbs +0 -11
- package/addon/templates/components/validated-input/types/-themes/uikit/radio-group.hbs +0 -17
- package/addon/templates/components/validated-input/types/-themes/uikit/select.hbs +0 -17
- package/addon/templates/components/validated-input/types/checkbox-group.hbs +0 -14
- package/addon/templates/components/validated-input/types/checkbox.hbs +0 -9
- package/addon/templates/components/validated-input/types/radio-group.hbs +0 -14
- package/addon/templates/components/validated-input/types/select.hbs +0 -16
package/.husky/commit-msg
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
# [5.2.0](https://github.com/adfinis-sygroup/ember-validated-form/compare/v5.1.1...v5.2.0) (2022-02-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* scroll first invalid element into view ([#733](https://github.com/adfinis-sygroup/ember-validated-form/issues/733)) ([ae7c8b2](https://github.com/adfinis-sygroup/ember-validated-form/commit/ae7c8b2b160307646adf90cd09a091effa549238))
|
|
7
|
+
* **validated-button:** add `triggerValidations` flag ([#721](https://github.com/adfinis-sygroup/ember-validated-form/issues/721)) ([765f5f4](https://github.com/adfinis-sygroup/ember-validated-form/commit/765f5f40c9d2e5ccfca7129fb701ff3bb0ed661e))
|
|
8
|
+
|
|
9
|
+
# [5.0.0](https://github.com/adfinis-sygroup/ember-validated-form/compare/v4.1.0...v5.0.0) (2021-10-08)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### chore
|
|
13
|
+
|
|
14
|
+
* **deps:** update ember and other dependencies ([41e099c](https://github.com/adfinis-sygroup/ember-validated-form/commit/41e099c4da82135c562493e5b2a4f9420dca73c6))
|
|
15
|
+
* **ember:** remove support for ember 3.20 ([0cfebfc](https://github.com/adfinis-sygroup/ember-validated-form/commit/0cfebfcc5792a1df52093a972878af1617ec8100))
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
### Features
|
|
19
|
+
|
|
20
|
+
* refactor all components to glimmer and use native classes ([cee7373](https://github.com/adfinis-sygroup/ember-validated-form/commit/cee7373a3c0783a02fe00b5e510c41ba604403c2))
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
### BREAKING CHANGES
|
|
24
|
+
|
|
25
|
+
* **ember:** Remove support for ember LTS 3.20 since that version
|
|
26
|
+
has a bug with autotracking.
|
|
27
|
+
* **deps:** Require `ember-auto-import` v2+
|
|
28
|
+
* While the public API won't change, there is a huge
|
|
29
|
+
chance that this will break implementations if someone's extending the
|
|
30
|
+
components of this addon. Components that do need to be refactored to
|
|
31
|
+
glimmer.
|
|
32
|
+
|
|
1
33
|
# [4.1.0](https://github.com/adfinis-sygroup/ember-validated-form/compare/v4.0.1...v4.1.0) (2021-09-30)
|
|
2
34
|
|
|
3
35
|
|
package/README.md
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://badge.fury.io/js/ember-validated-form)
|
|
4
4
|
[](https://emberobserver.com/addons/ember-validated-form)
|
|
5
|
-
[](https://github.com/adfinis-sygroup/ember-validated-form/actions?query=workflow%3ATest)
|
|
6
|
+
[](https://github.com/prettier/prettier)
|
|
7
7
|
|
|
8
8
|
Easily create forms with client side validations.
|
|
9
9
|
|
|
@@ -1,42 +1,38 @@
|
|
|
1
1
|
import { getOwner } from "@ember/application";
|
|
2
|
-
import { computed, get, set } from "@ember/object";
|
|
3
2
|
|
|
4
|
-
export default (component)
|
|
5
|
-
return
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
3
|
+
export default function (component) {
|
|
4
|
+
return function (_, propertyName) {
|
|
5
|
+
return {
|
|
6
|
+
get() {
|
|
7
|
+
const parts = component.split("/");
|
|
8
|
+
const componentName = parts.slice(1, parts.length).join("/");
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
if (this.args[propertyName]) {
|
|
11
|
+
return this.args[propertyName];
|
|
12
|
+
}
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
const config =
|
|
15
|
+
getOwner(this).resolveRegistration("config:environment")[
|
|
16
|
+
"ember-validated-form"
|
|
17
|
+
] !== undefined
|
|
18
|
+
? getOwner(this).resolveRegistration("config:environment")[
|
|
19
|
+
"ember-validated-form"
|
|
20
|
+
]
|
|
21
|
+
: {};
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
const theme = config.theme;
|
|
24
|
+
const defaultComponent = config.defaults?.[componentName];
|
|
25
25
|
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const name = parts.pop();
|
|
27
|
+
const basePath = parts.join("/");
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
return value;
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
};
|
|
29
|
+
return (
|
|
30
|
+
defaultComponent ||
|
|
31
|
+
(theme
|
|
32
|
+
? `${basePath}/-themes/${theme}/${name}`
|
|
33
|
+
: `${basePath}/${name}`)
|
|
34
|
+
);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { computed } from "@ember/object";
|
|
2
|
-
|
|
3
1
|
import Component from "../../button";
|
|
4
2
|
|
|
5
|
-
export default Component
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
export default class BootstrapButton extends Component {
|
|
4
|
+
get class() {
|
|
5
|
+
const style = this.args.type === "submit" ? "btn-primary" : "btn-default";
|
|
6
|
+
const loading = this.args.loading ? "loading" : "";
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
8
|
+
return `btn ${style} ${loading}`;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { computed } from "@ember/object";
|
|
2
|
-
|
|
3
1
|
import Component from "../../button";
|
|
4
2
|
|
|
5
|
-
export default Component
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
export default class UikitButton extends Component {
|
|
4
|
+
get class() {
|
|
5
|
+
const style =
|
|
6
|
+
this.args.type === "submit" ? "uk-button-primary" : "uk-button-default";
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
});
|
|
8
|
+
return `uk-button ${style}`;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
import Component from "@
|
|
1
|
+
import Component from "@glimmer/component";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export default Component.extend({
|
|
6
|
-
layout,
|
|
7
|
-
tagName: "button",
|
|
8
|
-
attributeBindings: ["disabled", "type", "action:onclick"],
|
|
9
|
-
});
|
|
3
|
+
// eslint-disable-next-line ember/no-empty-glimmer-component-classes
|
|
4
|
+
export default class ButtonComponent extends Component {}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{{#let
|
|
2
|
+
(component
|
|
3
|
+
this.buttonComponent
|
|
4
|
+
onClick=this.click
|
|
5
|
+
loading=this.loading
|
|
6
|
+
disabled=(or @disabled this.loading)
|
|
7
|
+
label=@label
|
|
8
|
+
type=@type
|
|
9
|
+
)
|
|
10
|
+
as |Button|
|
|
11
|
+
}}
|
|
12
|
+
{{#if (has-block)}}
|
|
13
|
+
<Button ...attributes>{{yield}}</Button>
|
|
14
|
+
{{else}}
|
|
15
|
+
<Button ...attributes />
|
|
16
|
+
{{/if}}
|
|
17
|
+
{{/let}}
|
|
@@ -1,11 +1,60 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { action } from "@ember/object";
|
|
2
|
+
import Component from "@glimmer/component";
|
|
3
|
+
import { tracked } from "@glimmer/tracking";
|
|
4
|
+
import { resolve } from "rsvp";
|
|
2
5
|
|
|
3
6
|
import themedComponent from "../-private/themed-component";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
|
|
8
|
+
const ON_CLICK = "on-click";
|
|
9
|
+
const ON_INVALID_CLICK = "on-invalid-click";
|
|
10
|
+
export default class ValidatedButtonComponent extends Component {
|
|
11
|
+
@themedComponent("validated-button/button") buttonComponent;
|
|
12
|
+
|
|
13
|
+
@tracked _loading;
|
|
14
|
+
|
|
15
|
+
get loading() {
|
|
16
|
+
return this.args.loading || this._loading;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@action
|
|
20
|
+
async click(event) {
|
|
21
|
+
// handle only clicks for custom buttons
|
|
22
|
+
// everything else is handled by the validated form itself
|
|
23
|
+
if (this.args.type !== "button") {
|
|
24
|
+
return this.args.action(event);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
event.preventDefault();
|
|
28
|
+
|
|
29
|
+
if (this.args.triggerValidations) {
|
|
30
|
+
this.args.markAsDirty();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const model = this.args.model;
|
|
34
|
+
|
|
35
|
+
if (!model || !model.validate) {
|
|
36
|
+
this.runCallback(ON_CLICK);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await model.validate();
|
|
41
|
+
|
|
42
|
+
if (model.get("isInvalid")) {
|
|
43
|
+
this.runCallback(ON_INVALID_CLICK);
|
|
44
|
+
} else {
|
|
45
|
+
this.runCallback(ON_CLICK);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
runCallback(callbackProp) {
|
|
50
|
+
const callback = this.args[callbackProp];
|
|
51
|
+
if (typeof callback !== "function") {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
this._loading = true;
|
|
56
|
+
resolve(callback(this.args.model)).finally(() => {
|
|
57
|
+
this._loading = false;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<form autocomplete={{@autocomplete}} class={{if this.submitted "submitted"}}>
|
|
2
|
+
{{yield
|
|
3
|
+
(hash
|
|
4
|
+
model=@model
|
|
5
|
+
loading=this.loading
|
|
6
|
+
input=(component
|
|
7
|
+
"validated-input"
|
|
8
|
+
model=@model
|
|
9
|
+
submitted=this.submitted
|
|
10
|
+
validateBeforeSubmit=@validateBeforeSubmit
|
|
11
|
+
)
|
|
12
|
+
submit=(component
|
|
13
|
+
"validated-button"
|
|
14
|
+
type="submit"
|
|
15
|
+
loading=this.loading
|
|
16
|
+
label="Save"
|
|
17
|
+
action=this.submit
|
|
18
|
+
)
|
|
19
|
+
button=(component
|
|
20
|
+
"validated-button"
|
|
21
|
+
type="button"
|
|
22
|
+
loading=this.loading
|
|
23
|
+
label="Action"
|
|
24
|
+
model=@model
|
|
25
|
+
markAsDirty=this.markAsDirty
|
|
26
|
+
)
|
|
27
|
+
)
|
|
28
|
+
}}
|
|
29
|
+
</form>
|
|
@@ -1,70 +1,76 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { getOwner } from "@ember/application";
|
|
2
|
+
import { action } from "@ember/object";
|
|
3
|
+
import { scheduleOnce } from "@ember/runloop";
|
|
4
|
+
import Component from "@glimmer/component";
|
|
5
|
+
import { tracked } from "@glimmer/tracking";
|
|
2
6
|
import { resolve } from "rsvp";
|
|
3
7
|
|
|
4
|
-
import layout from "../templates/components/validated-form";
|
|
5
|
-
|
|
6
8
|
const PROP_ON_SUBMIT = "on-submit";
|
|
7
9
|
const PROP_ON_INVALID_SUBMIT = "on-invalid-submit";
|
|
8
10
|
|
|
9
|
-
export default Component
|
|
10
|
-
|
|
11
|
+
export default class ValidatedFormComponent extends Component {
|
|
12
|
+
@tracked loading = false;
|
|
13
|
+
@tracked submitted = false;
|
|
14
|
+
@tracked validateBeforeSubmit = true;
|
|
11
15
|
|
|
12
|
-
|
|
13
|
-
|
|
16
|
+
constructor(...args) {
|
|
17
|
+
super(...args);
|
|
18
|
+
this.config =
|
|
19
|
+
getOwner(this).resolveRegistration("config:environment")[
|
|
20
|
+
"ember-validated-form"
|
|
21
|
+
];
|
|
14
22
|
|
|
15
|
-
|
|
23
|
+
if (this.args.model && this.args.model.validate) {
|
|
24
|
+
scheduleOnce("actions", this, "validateModel", this.args.model);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
16
27
|
|
|
17
|
-
|
|
28
|
+
validateModel(model) {
|
|
29
|
+
model.validate();
|
|
30
|
+
}
|
|
18
31
|
|
|
19
|
-
|
|
32
|
+
@action
|
|
33
|
+
markAsDirty() {
|
|
34
|
+
this.submitted = true;
|
|
35
|
+
}
|
|
20
36
|
|
|
21
|
-
|
|
37
|
+
@action
|
|
38
|
+
async submit(event) {
|
|
39
|
+
event.preventDefault();
|
|
22
40
|
|
|
23
|
-
|
|
24
|
-
this.
|
|
25
|
-
if (this.model && this.model.validate) {
|
|
26
|
-
this.model.validate();
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
submit() {
|
|
31
|
-
this.set("submitted", true);
|
|
32
|
-
const model = this.model;
|
|
41
|
+
this.submitted = true;
|
|
42
|
+
const model = this.args.model;
|
|
33
43
|
|
|
34
44
|
if (!model || !model.validate) {
|
|
35
45
|
this.runCallback(PROP_ON_SUBMIT);
|
|
36
46
|
return false;
|
|
37
47
|
}
|
|
38
48
|
|
|
39
|
-
model.validate()
|
|
40
|
-
if (!this.element) {
|
|
41
|
-
// We were removed from the DOM while validating
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
49
|
+
await model.validate();
|
|
44
50
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
51
|
+
if (model.get("isInvalid")) {
|
|
52
|
+
if (this.config?.features?.scrollErrorIntoView && model.errors[0]?.key) {
|
|
53
|
+
document
|
|
54
|
+
.querySelector(`[name=${model.errors[0].key}]`)
|
|
55
|
+
?.scrollIntoView();
|
|
49
56
|
}
|
|
50
|
-
|
|
57
|
+
this.runCallback(PROP_ON_INVALID_SUBMIT);
|
|
58
|
+
} else {
|
|
59
|
+
this.runCallback(PROP_ON_SUBMIT);
|
|
60
|
+
}
|
|
61
|
+
|
|
51
62
|
return false;
|
|
52
|
-
}
|
|
63
|
+
}
|
|
53
64
|
|
|
54
65
|
runCallback(callbackProp) {
|
|
55
|
-
const callback = this.
|
|
66
|
+
const callback = this.args[callbackProp];
|
|
56
67
|
if (typeof callback !== "function") {
|
|
57
68
|
return;
|
|
58
69
|
}
|
|
59
|
-
const model = this.model;
|
|
60
70
|
|
|
61
|
-
this.
|
|
62
|
-
resolve(callback(model)).finally(() => {
|
|
63
|
-
|
|
64
|
-
// We were removed from the DOM while running on-submit()
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
this.set("loading", false);
|
|
71
|
+
this.loading = true;
|
|
72
|
+
resolve(callback(this.args.model)).finally(() => {
|
|
73
|
+
this.loading = false;
|
|
68
74
|
});
|
|
69
|
-
}
|
|
70
|
-
}
|
|
75
|
+
}
|
|
76
|
+
}
|