mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 12:07:51 +02:00
This fixes the build broken by [] ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=186782466
216 lines
5.8 KiB
JavaScript
216 lines
5.8 KiB
JavaScript
// Copyright 2017 The Nomulus Authors. All Rights Reserved.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
goog.provide('registry.util');
|
|
|
|
goog.require('goog.dom');
|
|
goog.require('goog.dom.classlist');
|
|
goog.require('goog.soy');
|
|
|
|
|
|
/**
|
|
* Logging function that delegates to `console.log()`.
|
|
* @param {...*} var_args
|
|
*/
|
|
registry.util.log = function(var_args) {
|
|
if (goog.DEBUG) {
|
|
if (goog.isDef(goog.global.console) &&
|
|
goog.isDef(goog.global.console['log'])) {
|
|
goog.global.console.log.apply(goog.global.console, arguments);
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* CSS class for hiding an element whose visibility can be toggled.
|
|
* @type {string}
|
|
* @const
|
|
*/
|
|
registry.util.cssHidden = goog.getCssName('hidden');
|
|
|
|
|
|
/**
|
|
* CSS class for showing an element whose visibility can be toggled.
|
|
* @type {string}
|
|
* @const
|
|
*/
|
|
registry.util.cssShown = goog.getCssName('shown');
|
|
|
|
|
|
/**
|
|
* Changes element visibility by toggling CSS `shown` to `hidden`.
|
|
* @param {!Element|string} element Element or id attribute of element.
|
|
* @param {boolean} visible Shows `element` if true, or else hides it.
|
|
*/
|
|
registry.util.setVisible = function(element, visible) {
|
|
goog.dom.classlist.addRemove(
|
|
goog.dom.getElement(element),
|
|
visible ? registry.util.cssHidden : registry.util.cssShown,
|
|
visible ? registry.util.cssShown : registry.util.cssHidden);
|
|
};
|
|
|
|
|
|
/**
|
|
* Show a buttebar with the given message. A dismiss link will be added.
|
|
* @param {string} message the message to show the user.
|
|
* @param {boolean=} opt_isFatal indicates butterbar should be blood red. This
|
|
* should only be used when an RPC returns a non-200 status.
|
|
*/
|
|
registry.util.butter = function(message, opt_isFatal) {
|
|
goog.dom.setTextContent(
|
|
goog.dom.getElementByClass(goog.getCssName('kd-butterbar-text')),
|
|
message);
|
|
var butterbar =
|
|
goog.dom.getRequiredElementByClass(goog.getCssName('kd-butterbar'));
|
|
registry.util.setVisible(butterbar, true);
|
|
if (opt_isFatal) {
|
|
goog.dom.classlist.add(butterbar, goog.getCssName('fatal'));
|
|
} else {
|
|
goog.dom.classlist.remove(butterbar, goog.getCssName('fatal'));
|
|
}
|
|
};
|
|
|
|
|
|
/**
|
|
* Hides the butterbar.
|
|
*/
|
|
registry.util.unbutter = function() {
|
|
registry.util.setVisible(
|
|
goog.dom.getRequiredElementByClass(goog.getCssName('kd-butterbar')),
|
|
false);
|
|
};
|
|
|
|
|
|
/**
|
|
* Renders the tmpl at and then moves it before the given elt.
|
|
* @param {Element|string} id dom id of the refElt to render before.
|
|
* @param {function()} tmpl template to render.
|
|
* @param {!Object} tmplParams params to pass to the template.
|
|
* @return {!Element} the rendered row.
|
|
*/
|
|
registry.util.renderBeforeRow = function(id, tmpl, tmplParams) {
|
|
var refElt = goog.dom.getElement(id);
|
|
goog.soy.renderElement(refElt, tmpl, tmplParams);
|
|
var prevSib = goog.dom.getPreviousElementSibling(refElt);
|
|
goog.dom.removeNode(refElt);
|
|
refElt.removeAttribute('id');
|
|
goog.dom.insertSiblingAfter(refElt, prevSib);
|
|
var newAnchorRefElt = goog.dom.createDom(refElt.tagName, {'id': id});
|
|
goog.dom.insertSiblingAfter(newAnchorRefElt, refElt);
|
|
return refElt;
|
|
};
|
|
|
|
|
|
/**
|
|
* Turns an HTML form's named elements into a JSON data structure with
|
|
* Pablo's black magick.
|
|
* @param {string} formName the name of the form to be parsed.
|
|
* @throws {Error} if `formName` couldn't be found.
|
|
* @return {!Object} the parsed form values as an object.
|
|
*/
|
|
registry.util.parseForm = function(formName) {
|
|
var form = /** @type {HTMLFormElement}
|
|
*/ (document.querySelector('form[name=' + formName + ']'));
|
|
if (form == null) {
|
|
throw new Error('No such form named ' + formName);
|
|
}
|
|
var obj = {};
|
|
// Find names first, since e.g. radio buttons have two elts with the
|
|
// same name.
|
|
var eltNames = {};
|
|
for (var i = 0; i < form.elements.length; i++) {
|
|
var elt = form.elements[i];
|
|
if (elt.name == '') {
|
|
continue;
|
|
}
|
|
eltNames[elt.name] = null;
|
|
}
|
|
for (var eltName in eltNames) {
|
|
var elt = form.elements[eltName];
|
|
var val;
|
|
if (elt.type == 'checkbox') {
|
|
val = elt.checked;
|
|
} else {
|
|
val = elt.value;
|
|
}
|
|
registry.util.expandObject_(obj, eltName, val);
|
|
}
|
|
return obj;
|
|
};
|
|
|
|
|
|
/**
|
|
* Give the object a value at the given path. Paths are split on dot
|
|
* and array elements are recognized.
|
|
*
|
|
* <ul>
|
|
* <li>a = 1
|
|
* <li>foo:a = 1.5
|
|
* <li>b.c = 2
|
|
* <li>b.d = 3
|
|
* <li>c[0] = 4
|
|
* <li>c[1] = 5
|
|
* <li>d[0].a = 6
|
|
* <li>d[1].foo:b = 7
|
|
* <li>d[1].@b = 8
|
|
* </ul>
|
|
*
|
|
* Yields the following object:
|
|
* <pre>
|
|
* {
|
|
* a: '1',
|
|
* 'foo:a': '1.5',
|
|
* b: {
|
|
* c: '2',
|
|
* d: '3'
|
|
* },
|
|
* c: ['4','5'],
|
|
* d: [{a:'6'},{'foo:b':'7'},{'@b':'8'}]
|
|
* }
|
|
* </pre>
|
|
*
|
|
* @param {!Object} obj
|
|
* @param {string} pathSpec
|
|
* @param {string|Array.<string>|null} val
|
|
* @private
|
|
*/
|
|
registry.util.expandObject_ = function(obj, pathSpec, val) {
|
|
var path = pathSpec.split('.');
|
|
for (var p = 0; p < path.length; p++) {
|
|
var fieldName = path[p];
|
|
var arrElt = fieldName.match(/^([\w:]+)\[(\d+)\]$/);
|
|
if (arrElt) {
|
|
var arrName = arrElt[1];
|
|
var arrNdx = arrElt[2];
|
|
if (!obj[arrName]) {
|
|
obj[arrName] = [];
|
|
}
|
|
obj = obj[arrName];
|
|
fieldName = arrNdx;
|
|
if (!obj[arrNdx]) {
|
|
obj[arrNdx] = {};
|
|
}
|
|
} else {
|
|
if (!obj[fieldName]) {
|
|
obj[fieldName] = {};
|
|
}
|
|
}
|
|
if (p == path.length - 1) {
|
|
obj[fieldName] = val;
|
|
} else {
|
|
obj = obj[fieldName];
|
|
}
|
|
}
|
|
};
|