google-nomulus/java/google/registry/ui/soy/registrar/Domain.soy
brndn d3f3d3ceb0 Migrate SoyDoc params involving maps to header param syntax
Soy has historically tolerated map accesses on weakly-typed variables. That is, if a template declared a param $p and then did $p['some_key'] in the template body, Soy would treat $p as a map even if it wasn't statically declared as one.

This situation is changing with [] There are now two map types, `map` and `legacy_object_map`. We are trying to migrate every template in [] from `legacy_object_map` to `map`, leaving Soy with one (improved) map type. Because the two map types generate different JS code, Soy can no longer allow map accesses on weakly-typed variables. (If $p['some_key'] occurs in a template and the type of $p is unknown, Soy would not know what code to generate.)

Every parameter whose static type is unknown (`?`) but which is inferred to be a `legacy_object_map` needs to be migrated to a `map`. We are developing tools for this in [] However, as a first step, we need to migrate the subset of these params that use the legacy SoyDoc syntax to use header param syntax with a static type of `?`. (All params declared in SoyDoc are typed as unknown, and it is a compilation error to mix SoyDoc and header param syntax in the same template, so any template that declares a SoyDoc param that is inferred to be a map needs to migrate to header param syntax.)

This CL was prepared by using the tools in [] to create a list of templates declaring SoyDoc params inferred to be legacy_object_maps. This list was then fed to the existing //third_party/java_src/soy/java/com/google/template/soy/tools:ParamMigrator tool. Since this tool migrates whole files instead of individual templates, the resulting CL is a superset of the migration that is actually required. However, since the SoyDoc param syntax has been deprecated for years, and since there is little risk in migrating from one param style to another, I decided to land the superset.

This migration falls under the LSC described at https://docs.google.com/document/d/1dAl-rDMp3oL0Zh_iSTaiHICwtcbLbVIy1FQ0wXSAaHs.
Tested:
    TAP --sample for global presubmit queue
    []    passed FOSS tests

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=188879980
2018-03-19 18:23:33 -04:00

220 lines
7.7 KiB
Text

// 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.
{namespace registry.soy.registrar.domain}
/**
* Set view for domains.
*/
{template .set}
<div class="{css('set')} {css('domain')}">
<p>Please enter a query for a single contact in the form "domain/[domain id]".
</div>
{/template}
/**
* Item view for domain.
*/
{template .item}
{@param item: ?}
{@param? readonly: ?} /** passed through to field rendering. */
{@param? allowSmd: ?} /** optional flag to allow sunrush smd applications. */
{let $isEdit: isNonnull($item['domain:name']) /}
<form name="item" class="{css('item')} {css('domain')}">
<h1>
{if $isEdit}
{$item['domain:name']['keyValue']}
{else}
New Domain
{/if}
</h1>
<table>
{if not $isEdit}
<tr class="{css('section-lead')}">
<th colspan="2"><h2>Domain</h2></th>
</tr>
{call registry.soy.forms.inputFieldRow data="all"}
{param label: 'Domain name *' /}
{param name: 'domain:name' /}
{/call}
{call registry.soy.forms.inputFieldRow data="all"}
{param label: 'Period (in years) *' /}
{param name: 'domain:period' /}
{/call}
{/if}
{if isNonnull($item['domain:exDate'])}
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Expiration date' /}
{param name: 'domain:exDate' /}
{param value: $item['domain:exDate'] /}
{/call}
{/if}
<tr class="{css('section-lead')}">
<th colspan="2"><h2>Authentication</h2></th>
</tr>
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Password *' /}
{param name: 'domain:authInfo.domain:pw' /}
{param value: isNonnull($item['domain:authInfo']) ?
$item['domain:authInfo']['domain:pw'] : '' /}
{/call}
<tr class="{css('section-lead')}">
<th colspan="2">
<h3>Contact information</h3>
<button id="domain-contact-add-button" type="button"
class="{css('kd-button')} {css('reg-add')}"
{if $readonly}disabled{/if}>
Add Contact
</button>
</th>
</tr>
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Registrant *' /}
{param name: 'domain:registrant' /}
{param value: $item['domain:registrant'] /}
{/call}
{if isNonnull($item['domain:contact'])}
// Render contact list with stable ordering for the screenshot tests.
{call .showContact_ data="all"}
{param contacts: $item['domain:contact'] /}
{param type: 'admin' /}
{/call}
{call .showContact_ data="all"}
{param contacts: $item['domain:contact'] /}
{param type: 'billing' /}
{/call}
{call .showContact_ data="all"}
{param contacts: $item['domain:contact'] /}
{param type: 'tech' /}
{/call}
{/if}
<tr id="domain-contacts-footer"></tr>
<tr class="{css('section-lead')}">
<th colspan="2">
<h3>Nameservers</h3>
<button id="domain-host-add-button" type="button"
class="{css('kd-button')} {css('reg-add')}"
{if $readonly}disabled{/if}>
Add Host
</button>
</th>
</tr>
{if isNonnull($item['domain:ns'] and isNonnull($item['domain:ns']['domain:hostObj']))}
{for $hostObj in $item['domain:ns']['domain:hostObj']}
{let $hostIdx: index($hostObj) /}
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Host ' + $hostIdx /}
{param name: 'domain:ns.domain:hostObj[' + $hostIdx + '].value' /}
{param value: $hostObj /}
{param clazz kind="text"}{css('domain-hostObj')}{/param}
{/call}
{/for}
{/if}
<tr id="domain-hosts-footer"></tr>
{if isNonnull($item['launch:applicationID'])}
<tr class="{css('section-lead')}">
<th colspan="2"><h2>Sunrise domain application</h2></th>
</tr>
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Application ID' /}
{param name: 'launch:applicationID' /}
{param value: $item['launch:applicationID'] /}
{/call}
{/if}
{if isNonnull($item['mark:mark'])}
<tr>
<td>Mark Data
<td>
<textarea class="{css('reg-domain-mark')}" {if $readonly}readonly{/if}>
{$item['mark:mark']['keyValue']}</textarea>
</td>
</tr>
{else}
{if $allowSmd}
{call registry.soy.forms.textareaFieldRow data="all"}
{param label: 'Encoded Signed Mark (base64 encoded, no header or footer)' /}
{param name: 'smd:encodedSignedMark' /}
{/call}
{/if}
{/if}
</table>
{if $isEdit}
<input type="hidden"
name="domain:name"
value="{$item['domain:name']['keyValue']}">
{/if}
</form>
{/template}
/** Renders an input form row for a specific type of contact. */
{template .showContact_ visibility="private"}
{@param contacts: list<legacy_object_map<string, ?>>} /** List of EPP domain:contacts. */
{@param type: string} /** Type of contact (e.g. admin, tech) */
{for $contact in $contacts}
{if $type == $contact['@type']}
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: $contact['@type'] + ' contact' /}
{param name: 'domain:contact[' + index($contact) + '].value' /}
{param value: $contact /}
{param clazz: 'domain-contact' /}
{/call}
<input name="domain:contact[{index($contact)}].@type"
type="hidden"
value="{$contact['@type']}">
{/if}
{/for}
{/template}
/* XXX: Should change support for admin/tech. */
/**
* Update domain. Includes sunrush applicationId if present.
*/
{template .update}
{@param? item: ?}
<form name="item" class="{css('item')} {css('domain')}">
<h1>{$item['domain:name']['keyValue']}</h1>
<table>
<tr class="{css('section-lead')}">
<th colspan="2"><h2>Contact</h2></th>
</tr>
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Registrant' /}
{param name: 'domain:registrant' /}
{param value: $item['domain:registrant'] /}
{/call}
<tr class="{css('section-lead')}">
<th colspan="2"><h2>Authentication</h2></th>
</tr>
{call registry.soy.forms.inputFieldRowWithValue data="all"}
{param label: 'Password' /}
{param name: 'domain:authInfo.domain:pw' /}
{param value: isNonnull($item['domain:authInfo']) ?
$item['domain:authInfo']['domain:pw'] : '' /}
{/call}
<input type="hidden"
name="domain:name"
value="{$item['domain:name']['keyValue']}">
{if isNonnull($item['launch:applicationID'])}
<input type="hidden"
name="launch:applicationID"
value="{$item['launch:applicationID']['keyValue']}">
{/if}
</table>
</form>
{/template}