voom-presenters 0.1.13 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -1
- data/CHANGELOG.md +186 -0
- data/Gemfile.lock +37 -38
- data/HISTORY.md +61 -0
- data/README.md +23 -1
- data/app/demo/components/chips.pom +6 -0
- data/app/demo/components/{forms.pom → content.pom} +3 -3
- data/app/demo/components/date_fields.pom +1 -1
- data/app/demo/components/datetime_fields.pom +6 -0
- data/app/demo/components/drawers.pom +1 -1
- data/app/demo/components/file_inputs.pom +16 -0
- data/app/demo/components/footers.pom +1 -1
- data/app/demo/components/google_maps.pom +17 -0
- data/app/demo/components/headers.pom +1 -1
- data/app/demo/components/layouts.pom +36 -4
- data/app/demo/components/lists.pom +25 -0
- data/app/demo/components/nav/menu.pom +9 -2
- data/app/demo/components/nav/pattern_drawer.pom +5 -0
- data/app/demo/components/nav/pattern_menu.pom +12 -0
- data/app/demo/components/sliders.pom +49 -0
- data/app/demo/components/snackbar.pom +10 -0
- data/app/demo/components/steppers.pom +178 -0
- data/app/demo/components/tab_bars.pom +51 -0
- data/app/demo/components/tables.pom +85 -13
- data/app/demo/components/text_areas.pom +13 -0
- data/app/demo/components/text_fields.pom +20 -8
- data/app/demo/components/toggles.pom +50 -14
- data/app/demo/components/tooltips.pom +2 -6
- data/app/demo/events/actions/clear.pom +23 -0
- data/app/demo/events/actions/loads.pom +16 -6
- data/app/demo/events/actions/posts.pom +1 -1
- data/app/demo/events/actions/toggle_visiblity.pom +4 -3
- data/app/demo/events/nav/drawer.pom +2 -2
- data/app/demo/events/tagged_input.pom +37 -0
- data/app/demo/hello_world.pom +3 -0
- data/app/demo/markdown.pom +1 -0
- data/app/demo/namespaces.pom +89 -0
- data/app/demo/nav/top_nav.pom +12 -0
- data/app/demo/patterns.pom +19 -0
- data/app/demo/patterns/search_select.pom +104 -0
- data/app/demo/shared/context_list.pom +1 -1
- data/app/demo/styles.pom +21 -11
- data/component-status.yml +11 -11
- data/config.ru +2 -1
- data/lib/voom/container_methods.rb +1 -1
- data/lib/voom/presenters-engine.rb +29 -26
- data/lib/voom/presenters.rb +15 -9
- data/lib/voom/presenters/api/app.rb +18 -5
- data/lib/voom/presenters/api/router.rb +11 -49
- data/lib/voom/presenters/demo/echo.rb +5 -0
- data/lib/voom/presenters/dsl.rb +10 -4
- data/lib/voom/presenters/dsl/components/actions/base.rb +37 -0
- data/lib/voom/presenters/dsl/components/actions/clear.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/deletes.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/dialog.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/loads.rb +32 -0
- data/lib/voom/presenters/dsl/components/actions/navigates.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/posts.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/remove.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/replaces.rb +25 -0
- data/lib/voom/presenters/dsl/components/actions/snackbar.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/stepper.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/toggle_visibility.rb +17 -0
- data/lib/voom/presenters/dsl/components/actions/updates.rb +17 -0
- data/lib/voom/presenters/dsl/components/avatar.rb +4 -5
- data/lib/voom/presenters/dsl/components/badge.rb +1 -1
- data/lib/voom/presenters/dsl/components/base.rb +20 -11
- data/lib/voom/presenters/dsl/components/button.rb +12 -10
- data/lib/voom/presenters/dsl/components/card.rb +18 -19
- data/lib/voom/presenters/dsl/components/checkbox.rb +3 -1
- data/lib/voom/presenters/dsl/components/chip.rb +9 -10
- data/lib/voom/presenters/dsl/components/content.rb +21 -11
- data/lib/voom/presenters/dsl/components/date_field.rb +1 -1
- data/lib/voom/presenters/dsl/components/datetime_base.rb +1 -2
- data/lib/voom/presenters/dsl/components/datetime_field.rb +1 -1
- data/lib/voom/presenters/dsl/components/dialog.rb +10 -6
- data/lib/voom/presenters/dsl/components/drawer.rb +6 -4
- data/lib/voom/presenters/dsl/components/event.rb +55 -39
- data/lib/voom/presenters/dsl/components/event_base.rb +2 -2
- data/lib/voom/presenters/dsl/components/expansion_panel.rb +5 -5
- data/lib/voom/presenters/dsl/components/file_input.rb +22 -0
- data/lib/voom/presenters/dsl/components/footer.rb +1 -1
- data/lib/voom/presenters/dsl/components/form.rb +17 -15
- data/lib/voom/presenters/dsl/components/google_map.rb +40 -0
- data/lib/voom/presenters/dsl/components/grid.rb +58 -18
- data/lib/voom/presenters/dsl/components/header.rb +2 -5
- data/lib/voom/presenters/dsl/components/hidden_field.rb +2 -2
- data/lib/voom/presenters/dsl/components/icon.rb +4 -5
- data/lib/voom/presenters/dsl/components/icon_base.rb +3 -3
- data/lib/voom/presenters/dsl/components/icon_toggle.rb +2 -2
- data/lib/voom/presenters/dsl/components/image.rb +3 -3
- data/lib/voom/presenters/dsl/components/input.rb +2 -2
- data/lib/voom/presenters/dsl/components/list.rb +12 -10
- data/lib/voom/presenters/dsl/components/lists/action.rb +8 -9
- data/lib/voom/presenters/dsl/components/lists/actions.rb +8 -8
- data/lib/voom/presenters/dsl/components/lists/header.rb +2 -2
- data/lib/voom/presenters/dsl/components/lists/line.rb +14 -17
- data/lib/voom/presenters/dsl/components/lists/separator.rb +2 -2
- data/lib/voom/presenters/dsl/components/menu.rb +10 -12
- data/lib/voom/presenters/dsl/components/mixins/attaches.rb +9 -3
- data/lib/voom/presenters/dsl/components/mixins/avatar.rb +0 -1
- data/lib/voom/presenters/dsl/components/mixins/buttons.rb +1 -1
- data/lib/voom/presenters/dsl/components/mixins/chips.rb +1 -2
- data/lib/voom/presenters/dsl/components/mixins/common.rb +20 -14
- data/lib/voom/presenters/dsl/components/mixins/content.rb +1 -1
- data/lib/voom/presenters/dsl/components/mixins/date_time_fields.rb +0 -3
- data/lib/voom/presenters/dsl/components/mixins/dialogs.rb +1 -2
- data/lib/voom/presenters/dsl/components/mixins/event.rb +3 -3
- data/lib/voom/presenters/dsl/components/mixins/expansion_panels.rb +1 -1
- data/lib/voom/presenters/dsl/components/mixins/file_inputs.rb +16 -0
- data/lib/voom/presenters/dsl/components/mixins/google_maps.rb +15 -0
- data/lib/voom/presenters/dsl/components/mixins/grids.rb +1 -1
- data/lib/voom/presenters/dsl/components/mixins/icons.rb +0 -1
- data/lib/voom/presenters/dsl/components/mixins/menus.rb +1 -1
- data/lib/voom/presenters/dsl/components/mixins/selects.rb +0 -1
- data/lib/voom/presenters/dsl/components/mixins/sliders.rb +15 -0
- data/lib/voom/presenters/dsl/components/mixins/snackbars.rb +0 -1
- data/lib/voom/presenters/dsl/components/mixins/steppers.rb +15 -0
- data/lib/voom/presenters/dsl/components/mixins/tab_bars.rb +15 -0
- data/lib/voom/presenters/dsl/components/mixins/text_fields.rb +5 -3
- data/lib/voom/presenters/dsl/components/mixins/toggles.rb +1 -4
- data/lib/voom/presenters/dsl/components/mixins/tooltips.rb +0 -1
- data/lib/voom/presenters/dsl/components/mixins/typography.rb +43 -13
- data/lib/voom/presenters/dsl/components/page.rb +0 -1
- data/lib/voom/presenters/dsl/components/radio_button.rb +1 -1
- data/lib/voom/presenters/dsl/components/rich_text_area.rb +26 -0
- data/lib/voom/presenters/dsl/components/select.rb +4 -5
- data/lib/voom/presenters/dsl/components/slider.rb +39 -0
- data/lib/voom/presenters/dsl/components/snackbar.rb +2 -2
- data/lib/voom/presenters/dsl/components/stepper.rb +106 -0
- data/lib/voom/presenters/dsl/components/switch.rb +1 -1
- data/lib/voom/presenters/dsl/components/tab_bar.rb +53 -0
- data/lib/voom/presenters/dsl/components/table.rb +99 -27
- data/lib/voom/presenters/dsl/components/text_area.rb +4 -3
- data/lib/voom/presenters/dsl/components/text_field.rb +8 -12
- data/lib/voom/presenters/dsl/components/time_field.rb +1 -1
- data/lib/voom/presenters/dsl/components/toggle_base.rb +2 -2
- data/lib/voom/presenters/dsl/components/tooltip.rb +1 -2
- data/lib/voom/presenters/dsl/components/typography.rb +4 -5
- data/lib/voom/presenters/dsl/definer.rb +2 -2
- data/lib/voom/presenters/dsl/definition.rb +6 -4
- data/lib/voom/presenters/dsl/user_interface.rb +17 -21
- data/lib/voom/presenters/errors/parameter_validation.rb +1 -1
- data/lib/voom/presenters/helpers.rb +5 -5
- data/lib/voom/presenters/helpers/date.rb +3 -3
- data/lib/voom/presenters/helpers/rails.rb +7 -2
- data/lib/voom/presenters/helpers/rails/model_table.rb +14 -6
- data/lib/voom/presenters/helpers/route.rb +6 -0
- data/lib/voom/presenters/helpers/time.rb +1 -1
- data/lib/voom/presenters/namespace.rb +12 -0
- data/lib/voom/presenters/settings.rb +58 -37
- data/lib/voom/presenters/version.rb +1 -1
- data/lib/voom/presenters/web_client/app.rb +50 -20
- data/lib/voom/presenters/web_client/markdown_render.rb +24 -11
- data/lib/voom/presenters/web_client/router.rb +17 -52
- data/lib/voom/serializer.rb +2 -2
- data/lib/voom/trace.rb +1 -1
- data/presenters.gemspec +2 -1
- data/public/style-bundle.js +2 -2
- data/scripts/bump.sh +1 -0
- data/scripts/changelog.sh +5 -0
- data/scripts/deploy-demo.sh +1 -0
- data/scripts/release.sh +1 -1
- data/scripts/tag.sh +5 -0
- data/views/mdc/.babelrc +8 -0
- data/views/mdc/.eslintrc.yml +23 -0
- data/views/mdc/assets/js/app.js +19 -6
- data/views/mdc/assets/js/components/base-component.js +25 -2
- data/views/mdc/assets/js/components/base-container.js +47 -0
- data/views/mdc/assets/js/components/button.js +3 -10
- data/views/mdc/assets/js/components/cards.js +11 -0
- data/views/mdc/assets/js/components/checkboxes.js +30 -7
- data/views/mdc/assets/js/components/chips.js +38 -5
- data/views/mdc/assets/js/components/content.js +13 -0
- data/views/mdc/assets/js/components/data-tables.js +38 -0
- data/views/mdc/assets/js/components/datetime.js +61 -21
- data/views/mdc/assets/js/components/dialogs.js +25 -19
- data/views/mdc/assets/js/components/events.js +13 -3
- data/views/mdc/assets/js/components/events/base.js +13 -3
- data/views/mdc/assets/js/components/events/errors.js +1 -1
- data/views/mdc/assets/js/components/events/posts.js +53 -13
- data/views/mdc/assets/js/components/events/removes.js +20 -0
- data/views/mdc/assets/js/components/events/replaces.js +35 -36
- data/views/mdc/assets/js/components/events/stepper.js +23 -0
- data/views/mdc/assets/js/components/events/toggle_visibility.js +15 -11
- data/views/mdc/assets/js/components/file-inputs.js +29 -0
- data/views/mdc/assets/js/components/forms.js +8 -59
- data/views/mdc/assets/js/components/grid.js +20 -0
- data/views/mdc/assets/js/components/hidden-fields.js +33 -0
- data/views/mdc/assets/js/components/icon-toggles.js +7 -14
- data/views/mdc/assets/js/components/initialize.js +20 -1
- data/views/mdc/assets/js/components/lists.js +1 -1
- data/views/mdc/assets/js/components/menus.js +12 -13
- data/views/mdc/assets/js/components/mixins/visibility-observer.js +34 -0
- data/views/mdc/assets/js/components/radios.js +39 -0
- data/views/mdc/assets/js/components/rich-text-area.js +43 -0
- data/views/mdc/assets/js/components/selects.js +24 -23
- data/views/mdc/assets/js/components/sliders.js +56 -0
- data/views/mdc/assets/js/components/snackbar.js +14 -23
- data/views/mdc/assets/js/components/steppers.js +48 -0
- data/views/mdc/assets/js/components/switches.js +24 -23
- data/views/mdc/assets/js/components/tab-bars.js +14 -0
- data/views/mdc/assets/js/components/text-fields.js +37 -35
- data/views/mdc/assets/js/config.js +27 -0
- data/views/mdc/assets/js/mdl-stepper.js +1108 -0
- data/views/mdc/assets/js/utils/compatibility.js +9 -0
- data/views/mdc/assets/js/utils/config.js +73 -0
- data/views/mdc/assets/js/utils/config.test.js +59 -0
- data/views/mdc/assets/js/utils/urls.js +5 -2
- data/views/mdc/assets/scss/app.scss +11 -3
- data/views/mdc/assets/scss/components/button.scss +17 -2
- data/views/mdc/assets/scss/components/card.scss +8 -3
- data/views/mdc/assets/scss/components/checkbox.scss +0 -4
- data/views/mdc/assets/scss/components/content.scss +11 -0
- data/views/mdc/assets/scss/components/data-table.scss +80 -0
- data/views/mdc/assets/scss/components/datetime.scss +6 -0
- data/views/mdc/assets/scss/components/fab.scss +2 -1
- data/views/mdc/assets/scss/components/file-input.scss +22 -0
- data/views/mdc/assets/scss/components/grid.scss +59 -3
- data/views/mdc/assets/scss/components/image.scss +6 -0
- data/views/mdc/assets/scss/components/list.scss +13 -0
- data/views/mdc/assets/scss/components/menu.scss +1 -0
- data/views/mdc/assets/scss/components/radio.scss +4 -0
- data/views/mdc/assets/scss/components/rich-text-area.scss +37 -0
- data/views/mdc/assets/scss/components/slider.scss +1 -0
- data/views/mdc/assets/scss/components/snackbar.scss +1 -5
- data/views/mdc/assets/scss/components/stepper.scss +235 -0
- data/views/mdc/assets/scss/components/switch.scss +4 -5
- data/views/mdc/assets/scss/components/tab-bars.scss +4 -0
- data/views/mdc/assets/scss/components/textfield.scss +8 -1
- data/views/mdc/assets/scss/components/typography.scss +4 -0
- data/views/mdc/assets/scss/components/vendor/flatpickr.min.css +2 -2
- data/views/mdc/assets/scss/components/vendor/quill.snow.css +945 -0
- data/views/mdc/assets/scss/styles.scss +3 -2
- data/views/mdc/assets/scss/theme.scss +6 -0
- data/views/mdc/body/header.erb +1 -0
- data/views/mdc/body/snackbar.erb +1 -1
- data/views/mdc/components/actions/clear.rb +11 -0
- data/views/mdc/components/actions/delete.rb +11 -0
- data/views/mdc/components/actions/dialog.rb +11 -0
- data/views/mdc/components/actions/loads.rb +11 -0
- data/views/mdc/components/actions/navigates.rb +11 -0
- data/views/mdc/components/actions/post.rb +17 -0
- data/views/mdc/components/actions/remove.rb +10 -0
- data/views/mdc/components/actions/replaces.rb +12 -0
- data/views/mdc/components/actions/snackbar.rb +10 -0
- data/views/mdc/components/actions/stepper.rb +10 -0
- data/views/mdc/components/actions/toggle_visibility.rb +10 -0
- data/views/mdc/components/actions/update.rb +10 -0
- data/views/mdc/components/button.erb +9 -6
- data/views/mdc/components/buttons/button.erb +10 -5
- data/views/mdc/components/buttons/fab.erb +8 -2
- data/views/mdc/components/buttons/icon.erb +9 -2
- data/views/mdc/components/buttons/image.erb +9 -4
- data/views/mdc/components/{display.erb → caption.erb} +0 -0
- data/views/mdc/components/card.erb +6 -3
- data/views/mdc/components/checkbox.erb +21 -9
- data/views/mdc/components/chip.erb +12 -3
- data/views/mdc/components/content.erb +6 -1
- data/views/mdc/components/datetime.erb +21 -13
- data/views/mdc/components/dialog.erb +4 -1
- data/views/mdc/components/event.erb +5 -9
- data/views/mdc/components/file_input.erb +13 -0
- data/views/mdc/components/form.erb +19 -5
- data/views/mdc/components/google_map.erb +9 -0
- data/views/mdc/components/grid.erb +18 -4
- data/views/mdc/components/headline.erb +2 -0
- data/views/mdc/components/hidden_field.erb +6 -1
- data/views/mdc/components/icon_toggle.erb +1 -1
- data/views/mdc/components/list.erb +5 -2
- data/views/mdc/components/list/actions/switch.erb +1 -1
- data/views/mdc/components/list/line.erb +7 -6
- data/views/mdc/components/menu.erb +8 -12
- data/views/mdc/components/{subheading.erb → overline.erb} +0 -0
- data/views/mdc/components/radio_button.erb +20 -10
- data/views/mdc/components/rich_text_area.erb +19 -0
- data/views/mdc/components/select.erb +7 -3
- data/views/mdc/components/slider.erb +41 -0
- data/views/mdc/components/snackbar.erb +2 -6
- data/views/mdc/components/stepper.erb +47 -0
- data/views/mdc/components/stepper/step.erb +33 -0
- data/views/mdc/components/{title.erb → subtitle.erb} +0 -0
- data/views/mdc/components/switch.erb +27 -12
- data/views/mdc/components/tab_bar.erb +29 -0
- data/views/mdc/components/table.erb +4 -2
- data/views/mdc/components/table/checkbox.erb +17 -0
- data/views/mdc/components/table/header.erb +13 -4
- data/views/mdc/components/table/pagination.erb +14 -23
- data/views/mdc/components/table/row.erb +3 -1
- data/views/mdc/components/text_area.erb +17 -7
- data/views/mdc/components/text_field.erb +31 -13
- data/views/mdc/components/typography.erb +2 -2
- data/views/mdc/layout.erb +33 -31
- data/views/mdc/package-lock.json +11019 -6996
- data/views/mdc/package.json +46 -27
- data/views/mdc/webpack.config.js +1 -0
- metadata +112 -13
- data/app/demo/events/actions/autocomplete.pom +0 -32
- data/lib/voom/presenters/dsl/components/action.rb +0 -35
- data/views/mdc/assets/js/components/events/autocomplete.js +0 -96
- data/views/mdc/assets/js/material.js +0 -3996
- data/views/mdc/assets/scss/components/table-pagination.scss +0 -65
- data/views/mdc/components/modal.erb +0 -15
- data/views/mdc/components/static.erb +0 -7
@@ -17,10 +17,20 @@ export class VBase extends VUrls {
|
|
17
17
|
|
18
18
|
inputValues(form) {
|
19
19
|
let params = [];
|
20
|
-
|
20
|
+
|
21
|
+
// If tagged input is asked for. Fetch all the matching tag elements and then call any bound components
|
22
|
+
if (this.options.input_tag !== undefined) {
|
23
|
+
var taggedInputs = document.querySelectorAll('[data-input-tag=' + this.options.input_tag + ']');
|
24
|
+
for (let input of taggedInputs) {
|
25
|
+
if (input.vComponent && typeof input.vComponent.prepareSubmit === 'function') {
|
26
|
+
input.vComponent.prepareSubmit(params);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
// Let input components push parameters
|
21
31
|
let vComp = this.component();
|
22
|
-
if (vComp) {
|
23
|
-
vComp.prepareSubmit(
|
32
|
+
if (vComp && typeof vComp.prepareSubmit === 'function') {
|
33
|
+
vComp.prepareSubmit(params);
|
24
34
|
}
|
25
35
|
return params;
|
26
36
|
}
|
@@ -64,7 +64,7 @@ export class VErrors {
|
|
64
64
|
}
|
65
65
|
for (var response of responseErrors) {
|
66
66
|
var pageErrors = Object.values(this.normalizeErrors(response)).reduce(function (previous, value) {
|
67
|
-
if (Array.isArray(value)) {
|
67
|
+
if (Array.isArray(value) && value.length > 0) {
|
68
68
|
previous.push(value.join('<br/>'));
|
69
69
|
}
|
70
70
|
return previous;
|
@@ -1,5 +1,6 @@
|
|
1
1
|
import {VSnackbar} from '../snackbar';
|
2
2
|
import {VBase} from './base';
|
3
|
+
import appConfig from '../../config';
|
3
4
|
|
4
5
|
// Replaces a given element with the contents of the call to the url.
|
5
6
|
// parameters are appended.
|
@@ -17,13 +18,13 @@ export class VPosts extends VBase {
|
|
17
18
|
let errors = this.validate();
|
18
19
|
let method = this.method;
|
19
20
|
if (errors.length > 0) {
|
20
|
-
return new Promise(function
|
21
|
+
return new Promise(function(_, reject) {
|
21
22
|
results.push({
|
22
23
|
action: 'posts',
|
23
24
|
method: method,
|
24
25
|
statusCode: 400,
|
25
26
|
contentType: 'v/errors',
|
26
|
-
content: errors
|
27
|
+
content: errors,
|
27
28
|
});
|
28
29
|
reject(results);
|
29
30
|
});
|
@@ -33,7 +34,8 @@ export class VPosts extends VBase {
|
|
33
34
|
var form = this.form();
|
34
35
|
if (form) {
|
35
36
|
FD = new FormData(form);
|
36
|
-
}
|
37
|
+
}
|
38
|
+
else {
|
37
39
|
FD = new FormData();
|
38
40
|
}
|
39
41
|
// Add params from presenter
|
@@ -49,20 +51,52 @@ export class VPosts extends VBase {
|
|
49
51
|
var httpRequest = new XMLHttpRequest();
|
50
52
|
var url = this.url;
|
51
53
|
if (!httpRequest) {
|
52
|
-
throw new Error(
|
54
|
+
throw new Error(
|
55
|
+
'Cannot talk to server! Please upgrade your browser to one that supports XMLHttpRequest.');
|
53
56
|
}
|
54
|
-
|
55
|
-
|
57
|
+
|
58
|
+
let snackbarCallback = function(contentType, response) {
|
59
|
+
const snackbar = document.querySelector('.mdc-snackbar').vComponent;
|
60
|
+
if (contentType && contentType.indexOf('application/json') !== -1) {
|
61
|
+
const messages = JSON.parse(response).messages;
|
62
|
+
if (snackbar && messages && messages.snackbar) {
|
63
|
+
const message = messages.snackbar.join('<br/>');
|
64
|
+
if (message !== '') {
|
65
|
+
snackbar.display(message);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
};
|
70
|
+
|
71
|
+
return new Promise(function(resolve, reject) {
|
72
|
+
httpRequest.onreadystatechange = function(event) {
|
56
73
|
if (httpRequest.readyState === XMLHttpRequest.DONE) {
|
57
|
-
|
74
|
+
const contentType = this.getResponseHeader('content-type');
|
75
|
+
console.log(httpRequest.status + ':' + contentType);
|
58
76
|
if (httpRequest.status >= 200 && httpRequest.status < 300) {
|
59
77
|
results.push({
|
60
78
|
action: 'posts',
|
61
79
|
method: this.method,
|
62
80
|
statusCode: httpRequest.status,
|
63
|
-
contentType:
|
81
|
+
contentType: contentType,
|
82
|
+
content: httpRequest.responseText,
|
83
|
+
responseURL: httpRequest.responseURL,
|
84
|
+
});
|
85
|
+
snackbarCallback(contentType,
|
86
|
+
httpRequest.responseText);
|
87
|
+
resolve(results);
|
88
|
+
// Response is an html error page
|
89
|
+
} else if (contentType && contentType.indexOf('text/html') !== -1){
|
90
|
+
document.open(contentType);
|
91
|
+
document.write(httpRequest.responseText);
|
92
|
+
document.close();
|
93
|
+
results.push({
|
94
|
+
action: 'posts',
|
95
|
+
method: this.method,
|
96
|
+
statusCode: httpRequest.status,
|
97
|
+
contentType: contentType,
|
64
98
|
content: httpRequest.responseText,
|
65
|
-
responseURL: httpRequest.responseURL
|
99
|
+
responseURL: httpRequest.responseURL,
|
66
100
|
});
|
67
101
|
resolve(results);
|
68
102
|
} else {
|
@@ -70,8 +104,8 @@ export class VPosts extends VBase {
|
|
70
104
|
action: 'posts',
|
71
105
|
method: this.method,
|
72
106
|
statusCode: httpRequest.status,
|
73
|
-
contentType:
|
74
|
-
content: httpRequest.responseText
|
107
|
+
contentType: contentType,
|
108
|
+
content: httpRequest.responseText,
|
75
109
|
});
|
76
110
|
reject(results);
|
77
111
|
}
|
@@ -79,7 +113,13 @@ export class VPosts extends VBase {
|
|
79
113
|
};
|
80
114
|
// Set up our request
|
81
115
|
httpRequest.open(method, url);
|
82
|
-
|
116
|
+
|
117
|
+
const headers = appConfig.get('request.headers.POST', {});
|
118
|
+
|
119
|
+
for (const [key, value] of Object.entries(headers)) {
|
120
|
+
httpRequest.setRequestHeader(key, value);
|
121
|
+
}
|
122
|
+
|
83
123
|
// Send our FormData object; HTTP headers are set automatically
|
84
124
|
httpRequest.send(FD);
|
85
125
|
});
|
@@ -96,4 +136,4 @@ export class VPosts extends VBase {
|
|
96
136
|
}
|
97
137
|
return null;
|
98
138
|
}
|
99
|
-
}
|
139
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
export class VRemoves {
|
2
|
+
constructor(options, params, event) {
|
3
|
+
this.target = options.target;
|
4
|
+
this.ids = params.ids;
|
5
|
+
this.event = event;
|
6
|
+
}
|
7
|
+
|
8
|
+
call(results) {
|
9
|
+
let ids = this.ids;
|
10
|
+
var promiseObj = new Promise(function (resolve) {
|
11
|
+
results.push({action: 'removes', statusCode: 200});
|
12
|
+
for (const id of ids){
|
13
|
+
let elem = document.getElementById(id);
|
14
|
+
elem.parentNode.removeChild(elem);
|
15
|
+
}
|
16
|
+
resolve(results);
|
17
|
+
});
|
18
|
+
return promiseObj;
|
19
|
+
}
|
20
|
+
}
|
@@ -21,31 +21,31 @@ export class VReplaces extends VBase {
|
|
21
21
|
throw new Error('Cannot talk to server! Please upgrade your browser to one that supports XMLHttpRequest.');
|
22
22
|
}
|
23
23
|
var elementId = this.element_id;
|
24
|
-
var
|
24
|
+
var nodeToReplace = document.getElementById(elementId);
|
25
25
|
var url = this.buildURL(this.url, this.params, this.inputValues(), [['grid_nesting', this.options.grid_nesting]]);
|
26
|
-
|
27
26
|
let delayAmt = this.event instanceof InputEvent ? 500 : 0;
|
28
27
|
|
29
28
|
var promiseObj = new Promise(function (resolve, reject) {
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
29
|
+
if (!nodeToReplace) {
|
30
|
+
let msg = 'Unable to located node: \'' + elementId + '\'' +
|
31
|
+
' This usually the result of issuing a replaces action and specifying a element id that does not currently exist on the page.';
|
32
|
+
console.error(msg);
|
33
|
+
results.push({
|
34
|
+
action: 'replaces',
|
35
|
+
statusCode: 500,
|
36
|
+
contentType: 'v/errors',
|
37
|
+
content: {exception: msg}
|
38
|
+
});
|
39
|
+
reject(results);
|
40
|
+
}
|
41
|
+
else {
|
42
|
+
clearTimeout(nodeToReplace.vTimeout);
|
43
|
+
nodeToReplace.vTimeout = setTimeout(function(){
|
44
|
+
httpRequest.onreadystatechange = function () {
|
45
|
+
if (httpRequest.readyState === XMLHttpRequest.DONE) {
|
46
|
+
console.log(httpRequest.status + ':' + this.getResponseHeader('content-type'));
|
47
|
+
if (httpRequest.status === 200) {
|
48
|
+
let nodeToReplace = document.getElementById(elementId);
|
49
49
|
nodeToReplace.outerHTML = httpRequest.responseText;
|
50
50
|
var newNode = document.getElementById(elementId);
|
51
51
|
initialize(newNode);
|
@@ -57,24 +57,23 @@ export class VReplaces extends VBase {
|
|
57
57
|
content: httpRequest.responseText
|
58
58
|
});
|
59
59
|
resolve(results);
|
60
|
+
} else {
|
61
|
+
results.push({
|
62
|
+
action: 'replaces',
|
63
|
+
statusCode: httpRequest.status,
|
64
|
+
contentType: this.getResponseHeader('content-type'),
|
65
|
+
content: httpRequest.responseText
|
66
|
+
});
|
67
|
+
reject(results);
|
60
68
|
}
|
61
|
-
} else {
|
62
|
-
results.push({
|
63
|
-
action: 'replaces',
|
64
|
-
statusCode: httpRequest.status,
|
65
|
-
contentType: this.getResponseHeader('content-type'),
|
66
|
-
content: httpRequest.responseText
|
67
|
-
});
|
68
|
-
reject(results);
|
69
69
|
}
|
70
70
|
}
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
}
|
77
|
-
|
71
|
+
console.log('GET:' + url);
|
72
|
+
httpRequest.open('GET', url, true);
|
73
|
+
httpRequest.setRequestHeader('X-NO-LAYOUT', true);
|
74
|
+
httpRequest.send();
|
75
|
+
}, delayAmt);
|
76
|
+
}
|
78
77
|
});
|
79
78
|
return promiseObj;
|
80
79
|
}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import {VBase} from './base';
|
2
|
+
|
3
|
+
export class VStepperEvent extends VBase {
|
4
|
+
|
5
|
+
constructor(options, params, event) {
|
6
|
+
super(options);
|
7
|
+
this.params = params;
|
8
|
+
this.event = event;
|
9
|
+
}
|
10
|
+
|
11
|
+
call(results) {
|
12
|
+
let parentElem = document.getElementById(this.params.stepper_id);
|
13
|
+
let component = parentElem.vComponent;
|
14
|
+
let nav_action = this.params.navigate;
|
15
|
+
|
16
|
+
let promiseObj = new Promise(function (resolve) {
|
17
|
+
component.navigate(nav_action);
|
18
|
+
results.push({action:'stepper', statusCode: 200});
|
19
|
+
resolve(results);
|
20
|
+
});
|
21
|
+
return promiseObj;
|
22
|
+
}
|
23
|
+
}
|
@@ -8,18 +8,22 @@ export class VToggleVisibility {
|
|
8
8
|
call(results) {
|
9
9
|
let targetId = this.targetId;
|
10
10
|
let action = this.params.action;
|
11
|
+
let delayAmt = this.event instanceof FocusEvent ? 500 : 0;
|
12
|
+
let elem = document.getElementById(targetId);
|
11
13
|
let promiseObj = new Promise(function (resolve) {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
14
|
+
clearTimeout(elem.vTimeout);
|
15
|
+
elem.vTimeout = setTimeout(function(){
|
16
|
+
console.log("Toggling visibility on: " + targetId);
|
17
|
+
if (action === 'show') {
|
18
|
+
elem.classList.remove("v-hidden");
|
19
|
+
} else if (action === 'hide') {
|
20
|
+
elem.classList.add("v-hidden");
|
21
|
+
} else {
|
22
|
+
elem.classList.toggle("v-hidden");
|
23
|
+
}
|
24
|
+
results.push({action:'toggle_visibility', statusCode: 200});
|
25
|
+
resolve(results);
|
26
|
+
}, delayAmt);
|
23
27
|
});
|
24
28
|
return promiseObj;
|
25
29
|
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
import {VBaseContainer} from "./base-container";
|
2
|
+
import {VBaseComponent, hookupComponents} from "./base-component";
|
3
|
+
import {eventHandlerMixin} from "./mixins/event-handler";
|
4
|
+
|
5
|
+
export function initFileInputs() {
|
6
|
+
console.log('\tFile Inputs');
|
7
|
+
hookupComponents('.v-file-input', VFileInput, null);
|
8
|
+
}
|
9
|
+
|
10
|
+
export class VFileInput extends eventHandlerMixin(VBaseComponent) {
|
11
|
+
constructor(element, mdcComponent) {
|
12
|
+
super(element, mdcComponent);
|
13
|
+
|
14
|
+
this.input = element.querySelector('input[type=file]');
|
15
|
+
this.label = element.querySelector('label');
|
16
|
+
|
17
|
+
['change', 'mouseup'].forEach((e) => {
|
18
|
+
element.addEventListener(e, () => this.handleFileSelection());
|
19
|
+
});
|
20
|
+
}
|
21
|
+
|
22
|
+
// From an example based on: https://www.quirksmode.org/dom/inputfile.html
|
23
|
+
handleFileSelection() {
|
24
|
+
if (!this.input.value) return;
|
25
|
+
|
26
|
+
var value = this.input.value.replace(/^.*[\\\/]/, '');
|
27
|
+
this.label.innerText = value;
|
28
|
+
}
|
29
|
+
}
|
@@ -1,65 +1,14 @@
|
|
1
|
+
import {eventHandlerMixin} from "./mixins/event-handler";
|
2
|
+
import {VBaseContainer} from "./base-container";
|
3
|
+
import {hookupComponents} from "./base-component";
|
4
|
+
|
1
5
|
export function initForms() {
|
2
6
|
console.log('\tForms');
|
3
|
-
|
4
|
-
var components = document.querySelectorAll('.v-form');
|
5
|
-
for (var i = 0; i < components.length; i++) {
|
6
|
-
var component = components[i];
|
7
|
-
if (!component.vComponent) {
|
8
|
-
component.vComponent = new VForm(component);
|
9
|
-
}
|
10
|
-
}
|
7
|
+
hookupComponents('.v-form', VForm, null);
|
11
8
|
}
|
12
9
|
|
13
|
-
export class VForm {
|
14
|
-
constructor(element) {
|
15
|
-
|
16
|
-
}
|
17
|
-
|
18
|
-
// Called whenever a form is about to be submitted.
|
19
|
-
// returns true on success
|
20
|
-
// returns on failure return an error object that can be processed by VErrors:
|
21
|
-
// { email: ["email must be filled", "email must be from your domain"] }
|
22
|
-
// { :page: ["must be filled"] }
|
23
|
-
validate(form, params) {
|
24
|
-
console.log("Form validate", form, params);
|
25
|
-
var errors = [];
|
26
|
-
for (let input of this.inputs()) {
|
27
|
-
if (input.vComponent && input.vComponent.validate) {
|
28
|
-
var result = input.vComponent.validate(form, params);
|
29
|
-
if (result !== true) {
|
30
|
-
errors.push(result);
|
31
|
-
}
|
32
|
-
}
|
33
|
-
}
|
34
|
-
return errors;
|
35
|
-
}
|
36
|
-
|
37
|
-
inputs() {
|
38
|
-
return this.element.elements;
|
39
|
-
}
|
40
|
-
|
41
|
-
// Called to collect data for submission
|
42
|
-
prepareSubmit(form, params) {
|
43
|
-
for (let input of this.inputs()) {
|
44
|
-
if (input.vComponent && input.vComponent.prepareSubmit) {
|
45
|
-
input.vComponent.prepareSubmit(form, params);
|
46
|
-
}
|
47
|
-
}
|
48
|
-
}
|
49
|
-
|
50
|
-
initEventListener(eventName, eventHandler) {
|
51
|
-
for (let input of this.inputs()) {
|
52
|
-
if (input.vComponent && input.vComponent.initEventListener) {
|
53
|
-
input.vComponent.initEventListener(eventName, eventHandler);
|
54
|
-
}
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
|
-
clear() {
|
59
|
-
for (const input of this.inputs()) {
|
60
|
-
if (input.vComponent && input.vComponent.clear) {
|
61
|
-
input.vComponent.clear();
|
62
|
-
}
|
63
|
-
}
|
10
|
+
export class VForm extends eventHandlerMixin(VBaseContainer) {
|
11
|
+
constructor(element, mdcComponent) {
|
12
|
+
super(element, mdcComponent);
|
64
13
|
}
|
65
14
|
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import {VBaseContainer} from "./base-container";
|
2
|
+
import {hookupComponents} from "./base-component";
|
3
|
+
|
4
|
+
export function initGrid() {
|
5
|
+
console.log('\tGrid');
|
6
|
+
hookupComponents('.v-grid', VGrid, null);
|
7
|
+
hookupComponents('.v-column', VColumn, null);
|
8
|
+
}
|
9
|
+
|
10
|
+
export class VGrid extends VBaseContainer {
|
11
|
+
constructor(element, mdcComponent) {
|
12
|
+
super(element, mdcComponent);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
export class VColumn extends VBaseContainer {
|
17
|
+
constructor(element, mdcComponent) {
|
18
|
+
super(element, mdcComponent);
|
19
|
+
}
|
20
|
+
}
|